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)到指定的視圖。