Spring MVC框架:第十六章:細(xì)節(jié)了解
了解內(nèi)容
1.SpringMVC配置文件可以放在WEB-INF下
①命名規(guī)范:[servlet-name]-servlet.xml
②位置:/WEB-INF目錄下
③示例:/WEB-INF/springDispatcherServlet-servlet.xml
④使用默認(rèn)配置文件可以省略init-param
<!-- The front controller of this Spring Web application, responsible for handling all application requests -->
<servlet>
<servlet-name>springDispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<!--修改自己的配置文件路徑-->
<param-value>location</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- Map all requests to the DispatcherServlet for handling -->
<servlet-mapping>
<servlet-name>springDispatcherServlet</servlet-name>
<!--一般可以用/-->
<url-pattern>url</url-pattern>
</servlet-mapping>
2.@RequestMapping注解的其他映射方式
①根據(jù)請(qǐng)求參數(shù)情況映射
請(qǐng)求參數(shù)中必須包含userName @RequestMapping(params=“userName”)
請(qǐng)求參數(shù)中不能包含userName @RequestMapping(params="!userName")
請(qǐng)求參數(shù)中必須包含userName且值必須為T(mén)om2015 @RequestMapping(params=“userName=Tom2015”)
請(qǐng)求參數(shù)中必須包含userName但值不能為T(mén)om2015 @RequestMapping(params=“userName=!Tom2015”)
請(qǐng)求參數(shù)中必須包含userName且值為T(mén)om2015,同時(shí)必須包含userPwd但值不限 @RequestMapping(params={“userName=Tom2015”,“userPwd”} )
②根據(jù)請(qǐng)求消息頭內(nèi)容映射
根據(jù)Accept-Language:zh-CN,zh;q=0.8映射 @RequestMapping (value=“headers_request”,headers= “Accept-Language=zh-CN,en;q=0.8” )
③使用Ant風(fēng)格通配符
?:匹配文件名中的一個(gè)字符
*:匹配文件名中的任意字符
**:匹配多層路徑
3.@RequestHeader
幫我們獲取請(qǐng)求消息頭數(shù)據(jù)
@RequestMapping("/getRequestHearder")
public String getRequestHeader(@RequestHeader(value="User-Agent",defaultValue="miss") String userAgent) {
System.out.println(userAgent);
return "result";
}
4.@CookieValue
幫我們獲取Cookie值
@RequestMapping("/getCookie")
public String getCookie(@CookieValue(value="JSESSIONID", defaultValue="miss") String jSessionId) {
System.out.println(jSessionId);
return "result";
}
5.@ModelAttribute
標(biāo)注了@ModelAttribute的方法會(huì)在當(dāng)前handler類(lèi)中每一個(gè)handler方法執(zhí)行前執(zhí)行。
6.@SessionAttribute
①@SessionAttributes注解的用法
[1]只能標(biāo)注在類(lèi)上
@Controller
@SessionAttributes(value="user")
public class SessionHandler {
……
[2]value屬性
根據(jù)value屬性中指定的值從請(qǐng)求域中讀取一個(gè)對(duì)象,然后保存到Session域中。
[3]type屬性
@SessionAttributes(types=User.class) 從請(qǐng)求域中讀取一個(gè)類(lèi)型為User的對(duì)象保存到Session域中。
②隱患
使用@SessionAttributes注解會(huì)在下述情況中引發(fā)異常
[1]情景描述
handler方法的入?yún)⒌念?lèi)型是User,類(lèi)名首字母小寫(xiě)后正好是@SessionAttributes注解中指定的value屬性值。
[2]行為描述
@SessionAttributes注解會(huì)在執(zhí)行handler方法前從Session域中獲取User對(duì)象,然后將請(qǐng)求參數(shù)注入到這個(gè)User對(duì)象中。然后傳入handler方法。
此時(shí)如果Session域中找不到User對(duì)象,那么就會(huì)拋出如下異常:
org.springframework.web.HttpSessionRequiredException: Session attribute
‘user’ required - not found in session
[3]解決辦法
@ModelAttribute public User getUser() { return new User(); }
提供一個(gè)標(biāo)記了@ModelAttribute注解的方法,讓@SessionAttributes注解可以從模型中獲取User對(duì)象來(lái)接收請(qǐng)求參數(shù)。
7.當(dāng)PUT和DELETE請(qǐng)求遇到Tomcat8
Restful風(fēng)格(Delete請(qǐng)求和PUT請(qǐng)求)在高版本Tomcat中無(wú)法轉(zhuǎn)發(fā)到JSP頁(yè)面,解決辦法是在JSP頁(yè)面上設(shè)置isErrorPage=“true”
8.HttpEntity
通過(guò)HttpEntity對(duì)象可以獲取請(qǐng)求相關(guān)信息
9.ResponseEntity
通過(guò)ResponseEntity對(duì)象可以設(shè)置響應(yīng)相關(guān)信息,可以借助ResponseEntity實(shí)現(xiàn)文件下載
10.HttpMessageConverter
HttpMessageConverter是一個(gè)接口。是SpringMVC專(zhuān)門(mén)提供的做消息轉(zhuǎn)換的工具接口。 如下圖所示,請(qǐng)求的報(bào)文(請(qǐng)求的HTTP協(xié)議內(nèi)容)會(huì)被封裝成為HttpInputMessage實(shí)現(xiàn)類(lèi)。然后交給HttpMessageConverter類(lèi)去轉(zhuǎn)換。 然后,我們SpringMVC程序的返回?cái)?shù)據(jù),交給HttpMessageConverter轉(zhuǎn)換成為HttpOutputMessage實(shí)現(xiàn)類(lèi),最終輸出成為響應(yīng)報(bào)文(響應(yīng)的Http協(xié)議)
11.異常映射
使用SimpleMappingExceptionResolver可以對(duì)SpringMVC捕獲到的異常進(jìn)行映射,從而實(shí)現(xiàn)在捕獲到特定異常時(shí)跳轉(zhuǎn)到指定的視圖。