1.SpringMVC中常用的幾個注解
1)@Controller 表明當前類為Controller
2)@RequestMaping 當前類或者方法的映射路徑,@RequestMapping中常用的幾個參數
①value 當前方法或者控制器的映射路徑
如 @RequestMapping(value="/testSpringMVC")
②params 當前方法需要接收的參數。
如 @RequestMapping(value="/testSpringMVC", params={"userName", "age!=10"})
③headers 當前方法接收的請求頭
如 @RequestMapping(value="/testSpringMVC", params={"username", "age!=10"}, headers={"Accept-Language=en-US,zh;q=0.8"})
④method 當前請求的請求類型, 如:@RequestMapping(value="/testSpringMVC", method=RequestMethod.POST), 一般情況下可選的為POST,GET
3)@PathVariable 當前方法接收的url占位符參數 如:
@RequestMapping("/testSpringMVC/{id}")
public String testSpringMVC(@PathVariable("id") Integer id){
//fill this with necessary bussiness logic
}
同時SpringMVC支持ant風格的url,如:@RequestMapping("/testSpringMVC/*/test")
簡單ant風格:? 匹配單個字符。 * 匹配0或任意數量的字符。 **匹配0或任意數量的目錄
4)@RequestParam 映射請求參數
@RequestParam(value="age", required=false, defaultValue = "0") Integer age
①value 參數名稱
②required 是否必須,默認為是
③defaultValue 默認值
5)@RequestHeader 獲取請求頭
如: @RequestHeader(value="Accept-Language") String val
①value 請求頭參數名
6)@CookieValue 獲取請求中的Cookie
如:@CookieValue(value="JSESSIONID") String val
7)@SessionAttribute 通過屬性名或者對象類型將屬性放置到Session中,如
@SessionAttributes(value={"user"}, types={String.class}) 將model中key為user或者字符串的value放置到session中
注意:該注解只能用來修飾類不能用來修飾方法。
8)@ModelAttribute
被ModelAttribute注解標記的方法將在每個目標方法執行之前被SpringMVC調用。
2.SpringMVC對Rest風格URL的支持
1)Rest風格
URL表示資源,http方法表示操作,get、post、put、delete等。
更多參照: http://wenku.baidu.com/view/660324c58bd63186bcebbcc3.html
2)Spring如何支持Rest風格。
①需要開啟org.springframework.web.filter.HiddenHttpMethodFilter
<filter>
<filter-name>HiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HiddenHttpMethodFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
②在form表單中開啟一個name為_method,value為PUT或DELETE隱藏域
<form action="/TestSpringMVC/testRest/1" method="post">
<input type="hidden" name="_method" value="DELETE">
<input type="submit" value="testRestDelete" />
</form>
③RequestMethod設置為對應的值:GET、POST、PUT、DELETE
3)出現的問題
由于采用的是Rest風格URL請求,返回時也采用的是resf風格,如:DELELE,對應到返回的JSP則不適用,報錯JSPs only permit GET POST or HEAD
解決思路:
①最簡單粗暴的解決方法就是采用重定向"redirect:/specificURL",重新請求另一個沒有使用Rest風格的資源,返回也就不是rest風格了。
②springMVC 對于Rest風格的請求,是通過post體中的"_method"(可自定義)參數值來識別的,我們可以在程序中的的某個地方從parameterMap中刪除這個參數,但是實現request接口的Servelet容器往往會鎖定parameterMap,所以可能需要反射,引入容器特有的jar
③擴展HiddenHttpMethodFilter類,增加對"_convertToPost"(不是parameter,而是attribute)屬性的識別,如果"_convertToPost"為true,那么跳過HiddenHttpMethodFilter所有操作。
④重寫HiddenHttpMethodFilter中的getMethod方法
不過使用tomcat8才會出現上述問題,使用tomcat7則不會。
3.SpringMVC對servlet原生API作為目標方法參數的支持
HttpServletRequest 、 HttpServletResponse 、HttpSession、java.security.Principal 、Locale InputStream 、OutputStream 、Reader 、Writer。如:
public void servletAPISupport(HttpServletRequest request, HttpServletResponse response, Writer out) {
//fill this with necessary business logic
}