1. ParameterizableViewController類
有時我們需要定義ParameterizableViewController一個類,由這個類負責快速將請求匯入到另一個檢視。
@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/").setViewName("home");
}
}
跟這個程式碼對應的XML配置程式碼如下:
path="/" view-name="home"/>
2. mvc:default-servlet-handler
通常我們使用DispatchServlet處理”/”開頭的URL(改寫了Tomcat容器的預設Servlet),透過定義這預設的servlet-handler,可以在使用DispatchServlet的同時,允許容器的預設Servlet處理靜態資源請求。這個標簽配置了一個DefaultServletHttpRequestHandler,用於處理”/*”之類的URL,不過相對於其他的URL匹配樣式來說具有較低的優先順序。
這個handler將會把所有請求引導到預設的Servlet,因此,我們配置時,要讓預設handler在所有的URL處理器對映中位於最低優先順序;尤其是當你在使用
@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
}
同樣的功能可使用如下XML程式碼實現:
3. mvc:interceptors
在請求由DispatchServlet傳遞到具體的業務邏輯控制器之前,Spring MVC還提供了攔截器、過濾器等機制用於對請求進行預處理和post處理。可以針對所有的請求或者指定URL匹配樣式的請求進行攔截,如下是一個Java Config程式碼:
@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LocaleInterceptor());
registry.addInterceptor(new ThemeInterceptor()).addPathPatterns("/**").excludePathPatterns("/admin/**");
registry.addInterceptor(new SecurityInterceptor()).addPathPatterns("/secure/*");
}
}
對應的XML配置程式碼如下:
class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"/>
path="/**"/>
path="/admin/**"/>
class="org.springframework.web.servlet.theme.ThemeChangeInterceptor"/>
這個配置的含義有二:(1)對於所有符合”/“樣式的請求(除”/admin/“之外)要應用ThemeChangeInterceptor攔截器;(2)對於所有符合”/secure/*”樣式的請求,都要應用SecurityInterceptor攔截器。
4. 根據使用者填寫的生日,自動計算出星座。
public class ConstellationBuilder {
public static String getAstro(int month, int day) {
String[] starArr = {"魔羯座", "水瓶座", "雙魚座", "牡羊座", "金牛座", "雙子座", "巨蟹座", "獅子座",
"處女座", "天秤座", "天蠍座", "射手座"};
int[] DayArr = {22, 20, 19, 21, 21, 21, 22, 23, 23, 23, 23, 22}; //兩個星座分割日
int index = month; // 所查詢日期在分割日之前,索引-1,否則不變
if (day < DayArr[month - 1]) {
index = index - 1;
}
return starArr[index];
}
}
對應的測試程式碼如下,註意Joda Time包的使用,不過如果你使用Java 8的話,可以直接使用Java 8提供的日期介面。
public class ConstellationBuilderTest {
@Test
public void getAstro() throws Exception {
Calendar calendar = Calendar.getInstance();
calendar.set(1988, Calendar.OCTOBER, 16);
LocalDateTime localDateTime = LocalDateTime.fromDateFields(calendar.getTime());
String res = ConstellationBuilder.getAstro(localDateTime.getMonthOfYear(), localDateTime.getDayOfMonth());
Assert.assertEquals("天秤座", res);
}
}
5. 在Mybatis中,使用陳述句INSERT … ON DUPLICATE KEY UPDATE的語法。
id="insertOrUpdate" parameterType="userBean">
INSERT INTO
user
(id, name, sex, birthday, constellation, work, province, city, district, mobile, integral, ctime, mtime)
VALUES (#{id}, #{name}, #{sex}, #{birthday}, #{constellation}, #{work}, #{province}, #{city}, #{district},
#{mobile}, #{integral}, now(), now())
ON DUPLICATE KEY
UPDATE
name=VALUES(name),
sex=VALUES(sex),
birthday=VALUES(birthday),
constellation=VALUES(constellation),
work=VALUES(work),
province=VALUES(province),
city=VALUES(city),
district=VALUES(district),
mobile=VALUES(mobile),
integral=VALUES(integral),
mtime=now()
]]>
MySQL的官方檔案,要找個時間認真閱讀,有問題的時候,也可以直接翻閱官方檔案,而不是漫無目的得Google。根據官方檔案-insert-on-duplicate中提到:
You can use the VALUES(colname) function in the UPDATE clause to refer to column values from the INSERT portion of the INSERT … ON DUPLICATE KEY UPDATE statement. In other words, VALUES(colname) in the ON DUPLICATE KEY UPDATE clause refers to the value of col_name that would be inserted, had no duplicate-key conflict occurred. This function is especially useful in multiple-row inserts. The VALUES() function is meaningful only in INSERT … UPDATE statements and returns NULL otherwise.
重點:VALUES函式用於提取對應的列值,如果沒有則傳回NULL;
6. Spring Boot + Thymeleaf + BootStrap結合使用的一個例子
Spring MVC with Bootstrap and Thymeleaf
7. 對於JVM中垃圾回收演演算法的分類
我目前為止看到的最清晰的一篇文章:JVM調優總結(三):(1)按照基本策略——取用計數、標記清除、複製、標記整理;(2)按照分割槽對待的方式區分——增量升級、分代蒐集;(3)按照系統執行緒劃分——序列蒐集、並行蒐集、併發蒐集。
8. JVM調優文章
閱讀文章JVM調優(四),JVM中垃圾回收,面臨的問題可以總結為如下三類:
-
如何識別垃圾物件?(1)取用計數;(2)Root Objects物件樹
-
如何處理記憶體碎片問題?(1)複製;(2)標記-整理
-
如何處理“物件建立”和“物件回收”這兩個相反的動作?(1)序列;(2)並行;(3)併發
9. JDK中單例樣式的經典應用是?
答:Runtime類,如下是我在JDK 1.8中查到的Runtime類的主要程式碼,可以看出,它是透過建構式私有化實現的單例樣式。參考JDK設計樣式應用——單例樣式(Singleton)。
public class Runtime {
private static Runtime currentRuntime = new Runtime();
/**
* Returns the runtime object associated with the current Java application.
* Most of the methods of class
Runtime
are instance
* methods and must be invoked with respect to the current runtime object.
*
* @return the
Runtime
object associated with the current
* Java application.
*/
public static Runtime getRuntime() {
return currentRuntime;
}
/** Don't let anyone else instantiate this class */
private Runtime() {}
}
原有的舊方法,在反序列號方面會有問題,需要我們重寫方法,在Java 1.7之後,實現單利樣式的最佳實踐是利用列舉(列舉型別天然支援序列化)。參考StackOverflow:Implementing Singleton with an Enum (in Java)
// Enum singleton - the preferred approach
public enum Elvis {
INSTANCE;
public void leaveTheBuilding() { ... }
}