在閑暇時間開始閱讀Spring的官方檔案,感覺收穫很大,記錄了一點筆記。
1. Web服務啟用https之後面臨效能問題,如何解決?
參考QZone的解決方法:Qzone 高效能 HTTPS 實踐
2. Spring MVC的@RequestMapping註解中
可以使用consumes限制web服務接受處理的請求,只有發來的HTTP請求頭部的Content-Type與consumes相符合時才能可以處理;可以使用produces限定HTTP響應的多媒體型別,對應的欄位是Accept。consumes和produces兩個限定不同於其他屬性,應用在method上的條件會改寫應用在type上的條件,而其他屬性則會擴充套件。
-
spring mvc官方檔案
-
http教程
3. 在Java開發中,或者需要訪問別人暴露出的HTTP介面
Java提供的API是HttpUrlConnection,不出意外得難用;這種情況下,我原來經常使用Apache提供的httpclient,也還可以。今天遇到一個不錯的開源庫——http-request,可以拿來試試。
4. @RequestMapping註解,除了支援常用的GET、PUT、POST、DELETE,也支援不常見的類似HEAD、OPTIONS。
When no HTTP methods are explicitly declared the “Allow” essay-header is set to “GET,HEAD,POST,PUT,PATCH,DELETE,OPTIONS”. Ideally always declare the HTTP method(s) an @RequestMapping
method is intended to handle.
5. @RequestMapping方法的簽名中
Errors和BindingResult物件一定緊跟在待系結的模型物件後面(當有多個待系結物件時,Spring將為每個待系結物件建立一個BindingResult)。如下程式碼片段不能工作:
@RequestMapping(method = RequestMethod.POST)
public String processSubmit(@ModelAttribute("pet") Pet pet, Model model, BindingResult result) { ... }
正確的程式碼片段是:
@RequestMapping(method = RequestMethod.POST)
public String processSubmit(@ModelAttribute("pet") Pet pet, BindingResult result, Model model) { ... }
6. @RequestMapping修飾的方法,引數的型別可以有很多種
無法一一列出,參考官方檔案貼個圖:
7. @RequestMapping修飾的方法
支援很多傳回型別,列舉如下:
8. 使用@RequestParam將請求引數系結到控制器的方法引數上;
使用這個註解的HTTP引數預設是必填的,可以透過將@RequestParam的required屬性設定成false來設定成非必須的;如果方法引數型別不是String型別,則Spring會進行自動型別轉換;如果@RequestParam應用在Map
@Controller
@RequestMapping("/pets")
@SessionAttributes("pet")
public class EditPetForm {
// ...
@RequestMapping(method = RequestMethod.GET)
public String setupForm(@RequestParam("petId") int petId, ModelMap model) {
Pet pet = this.clinic.loadPet(petId);
model.addAttribute("pet", pet);
return "petForm";
}
// ...
}
9. mvc:annotation-driven標簽
在Spring MVC專案中,可以透過Java Config或者XML檔案形式開啟MVC支援,使用Java Config的配置程式碼如下:
@Configuration
@EnableWebMvc
public class WebConfig { }
使用XML檔案中的mvc:annoation-driven元素也可以,具體程式碼如下:
xml version="1.0" encoding="UTF-8"?>
xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=" http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
所謂開啟MVC支援,實際上是註冊了RequestMappingHandlerMapping和RequestMappingHandlerAdapter,以及ExceptionHandlerExceptionResolver這些bean,使得在控制器中可以使用@RequestMapping、@ExceptionHandler這些註解。開啟MVC支援,也提供瞭如下功能:
-
除了使用JavaBeans的PropertyEditiors完成資料系結外,也可以透過ConversionService實體實現Spring 3樣式的型別轉換;
-
支援透過ConversionService實體和@NumberFormat註解對Number型別的引數進行格式化;
-
支援使用@DateTimeFormat註解對Date、Calendar、Long和Joda Time型別的引數進行格式化;
-
如果classpath中存在JSR-303 Provider,則可以使用@Valid註解驗證控制器方法中的引數的合理性;
-
對於@RequestMapping或者@ExceptionHandler修飾的方法,如果方法引數使用@RequestBody修飾,或者方法的傳回值用@ResponseBody修飾,則支援HttpMessageConverter進行HTTP請求、響應和Java物件的互相轉換。
10. mvc:resources標簽
這個標簽用於Spring MVC的Web應用處理靜態資源請求;該標簽實際的工作類是ResourceHttpRequestHandler,它包含有幾個Resource位置屬性,可以將處理靜態資源請求——包括web應用根目錄或者classpath路徑下的靜態資源。(1)mapping屬性指的是特定的URL樣式;(2)location屬性指的是靜態資源檔案的位置;(3)cache-period屬性用於設定快取時間(利用瀏覽器快取、減小伺服器壓力。
如果使用Java Config,則對應的配置程式碼如下:
@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/resources/**").addResourceLocations("/public-resources/");
}
}
如果使用XML配置,則對應的配置程式碼如下:
mapping="/resources/**" location="/public-resources/"/>
mapping屬性必須是Ant樣式,由SimpleUrlHandlerMapping解析url解析;location屬性必須指定一個或者多個有效的資源目錄位置,多個資源位置可以用逗號分割。對於每個服務端接受的請求,Spring會按照location屬性指定的順序進行匹配。例如,如果某個服務提供的資源既來自web應用根目錄,又來自classpath中的/META-INF/public-web-resources目錄,則對應的Java Config程式碼如下:
@EnableWebMvc
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/resources/**")
.addResourceLocations("/", "classpath:/META-INF/public-web-resources/");
}
}
同樣的功能,XML配置程式碼如下:
mapping="/resources/**" location="/, classpath:/META-INF/public-web-resources/"/>