javascript
170821-关于SpringMVC的知识点
???????????1.SpringMVC 概述以及優(yōu)勢(shì)
???????????????????SpringMVC和Spring的關(guān)系: ?軟件開發(fā)的三層架構(gòu): web層【表示層、表現(xiàn)層】---->Service層---->Dao[DataBase Access Object]---->數(shù)據(jù)庫! ?
?????????????????? SpringMVC實(shí)際上是Spring的一個(gè)子模塊,我們用SpringMVC來代替這個(gè)JavaWEB部分!
???????????????? ??MVC:也是一種設(shè)計(jì)模式:M:Model【模型】-->V[View]--->C[Controller]! ???????
?????????????????????????????????Model用來封裝數(shù)據(jù)的,View:用來顯示數(shù)據(jù)? Controller:用于接收前端頁面發(fā)送的請(qǐng)求,然后調(diào)用Service層處理,拿到處理結(jié)果,將該結(jié)果返回給前端頁面! ??????? ?
???????????????????SpringMVC:相當(dāng)于MVC架構(gòu)中的C以及V!
?????????????????? JavaEE-->J2EE
???????????????????優(yōu)勢(shì):Spring 為展現(xiàn)層提供的基于 MVC 設(shè)計(jì)理念的優(yōu)秀的Web 框架,是目前最主流的 MVC 框架之一 ?Spring3.0 后全面超越 Struts2,成為最優(yōu)秀的 MVC 框架 ?Spring MVC 通過一套 MVC 注解,讓 POJO 成為處理請(qǐng) 求的控制器,而無須實(shí)現(xiàn)任何接口。 ?支持 REST 風(fēng)格的 URL 請(qǐng)求 ?采用了松散耦合可插拔組件結(jié)構(gòu),比其他 MVC 框架更具擴(kuò)展性和靈活性
???????????????????SpingMVC是基于SpingMVC4.x
??????????? 2.SpringMVC之HelloWorld ??
?????????????????? 步驟: ?
????????????????????? ??– 加入 jar 包 ?
????????????????????? ??– 在 web.xml 中配置 DispatcherServlet ?
????????????????????????– 加入 Spring MVC 的配置文件 ???
??????????????????????? – 編寫處理請(qǐng)求的處理器,并標(biāo)識(shí)為處理器 ??
?????????????????????? ?– 編寫視圖 ?
??????????????????????????????? ??jar 包: ?
???????????????????????????????????????–commons-logging-1.1.3.jar ??
?–spring-aop-4.0.0.RELEASE.jar ??
?–spring-beans-4.0.0.RELEASE.jar ??
?–spring-context-4.0.0.RELEASE.jar ??
?–spring-core-4.0.0.RELEASE.jar ??
?–spring-expression-4.0.0.RELEASE.jar???
?–spring-web-4.0.0.RELEASE.jar ??
?–spring-webmvc-4.0.0.RELEASE.jar
????????????????????????????web.xml文件:
?????????????????????????????????1.配置 DispatcherServlet :
?<!-- The front controller of this Spring Web application, responsible for handling all application requests --> ?
?<!--向服務(wù)器注冊(cè)前端控制器!? -->
??<servlet> ???
???????? <servlet-name>springDispatcherServlet</servlet-name>
?????????<!--DispatcherServlet指的是SpringMVC的前端控制器!,給服務(wù)器使用,創(chuàng)建servlet對(duì)象!? --> ???
???????? <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> ???
???????? <!-- 初始化參數(shù)contextConfigLocation用于指定SpringMVC配置文件的路徑以及名稱 --> ?
?????????<init-param>
??????????????? <param-name>contextConfigLocation</param-name> ??
?????????????? ?<param-value>classpath:springmvc.xml</param-value> ??
???????? </init-param>
?????????<!-- 數(shù)字0或者大于0的數(shù)字表示的是:在服務(wù)器啟動(dòng)的時(shí)候創(chuàng)建Servlet對(duì)象,而不是第一次訪問的時(shí)候創(chuàng)建 ????小于0的數(shù)字指的是:在第一次訪問的時(shí)候創(chuàng)建Servlet對(duì)象. ????在數(shù)字大于O的情況下,數(shù)字越小,優(yōu)先級(jí)越高! ??? -->
????????<load-on-startup>1</load-on-startup> ?
?</servlet>
??<!-- Map all requests to the DispatcherServlet for handling -->
??<!-- 用 servlet-mapping指定請(qǐng)求映射的路徑--> ?
?<servlet-mapping> ?
?<servlet-name>springDispatcherServlet</servlet-name> ?
?<!-- 用url-pattern指定攔截 的請(qǐng)求路徑! --> ???
<url-pattern>/</url-pattern> ?
?</servlet-mapping>
??????????????????????????????????????????????注意:當(dāng)我們不用init-param指定springMVC配置文件的路徑好位置的時(shí)候,SpringMVC默認(rèn)會(huì)去/WEB-INF/<servlet-name>-servlet.xml
??????????????????????????????????????????????????????? 創(chuàng)建SpringMVC配置文件的名字要和上面在web.xml文件中指定的名字一致!
??????????????????????????????2.我們創(chuàng)建SpringMVC配置文件的時(shí)候使用的是Spring Bean Configuration File創(chuàng)建的,不是XML!
??????????????????????????????????????????????<!-- 配置SpingMVC容器要掃描的包! -->
????????????????????????????????????????????? <context:component-scan base-package="com.neuedu.controller"></context:component-scan>
???????????????????????????????????????????
???????????????? 配置視圖解析器?:視圖名稱解析器:將視圖邏輯名解析為: /WEB-INF/pages/<viewName>.jsp????????
?????????????????<!--InternalResourceViewResolvers 是視圖解析器 ,它會(huì)將邏輯視圖轉(zhuǎn)換成實(shí)際的物理視圖,做一個(gè)轉(zhuǎn)發(fā)操作!也就是說具體步驟:prefix +? 方法的返回值? + suffix--> ??????????????
?????????????????? <!-- /WEB-INF/views/success.jsp --> ??????????????? ?
???????????????????<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> ????????????
???????????? ? ????<property name="prefix" value="/WEB-INF/views/"></property> ????????????? ???
????????????????? ?<property name="suffix" value=".jsp"></property> ???????
??????? ??????? ???</bean>???
????????????3. 在springMVC掃描的包下創(chuàng)建控制器類[Controller/Handler],注意要加入@Controller注解
??????????????????????????/**
????????????????????????? ?? * 我們通過@RequestMapping做請(qǐng)求URL的映射!
?????????????????????????? ? * @return
????????????????????????? ?? */
???????????????????????? ?@RequestMapping("/sayHello")
?????????????????????????? public String sayHello(){
???????????????????????????return "/WEB-INF/views/success.jsp";
??????????????????????????}
???????????????????????? ?注意:在類的方法上我們使用的是@RequestMapping,然后在括號(hào)里指定請(qǐng)求url的請(qǐng)求路徑!
????????????????????????? ??
??????????? 4. 使用 @RequestMapping 映射請(qǐng)求
?????????????????????? ??Spring MVC? 使用 @RequestMapping 注解為控制器指定可以處理哪些 URL 請(qǐng)求 ?
??????????????????????? ?在控制器的類定義及方法定義處都可標(biāo)注 ?@RequestMapping
??????????????????????????????? ?–?類定義處:提供初步的請(qǐng)求映射信息。相對(duì)于 WEB 應(yīng)用的根目錄 ?
???????????????????????????????? –?方法處:提供進(jìn)一步的細(xì)分映射信息。相對(duì)于類定義處的 URL。
???????????????????????????????? 若 類定義處未標(biāo)注 @RequestMapping,則方法處標(biāo)記的 URL 相當(dāng)于當(dāng)前 WEB 應(yīng)用的根目錄
??????????????????????????????? ?若 類定義處標(biāo)注 @RequestMapping,則方法處標(biāo)記的 URL 相對(duì)于類定義處的@RequestMapping而言的!
?????????????????????????DispatcherServlet 截獲請(qǐng)求后,就通過控制器上@RequestMapping 提供的映射信息確定請(qǐng)求所對(duì)應(yīng)的處理方法。
??????????????????? ?? ?映射請(qǐng)求參數(shù)、請(qǐng)求方法或請(qǐng)求頭
???????????????????? ????@RequestMapping 除了可以使用請(qǐng)求 URL 映射請(qǐng)求外,還可以使用請(qǐng)求方法、請(qǐng)求參數(shù)及請(qǐng)求頭映射請(qǐng)求
????????????????????? ???@RequestMapping 的 value、method、params 及 heads 分別表示請(qǐng)求?? URL、請(qǐng)求方法、請(qǐng)求參數(shù)及請(qǐng)求頭的映射條件,他們之間是與的關(guān)系,聯(lián)合使用多個(gè)條件可讓請(qǐng)求映射 更加精確化。????????
??????????????????? ? ???params 和 headers支持簡(jiǎn)單的表達(dá)式:
?????????????????????????????? ??–?param1: 表示請(qǐng)求必須包含名為 param1 的請(qǐng)求參數(shù) ?
??????????????????????????????? ?–?!param1: 表示請(qǐng)求不能包含名為 param1 的請(qǐng)求參數(shù)
????????????????????????????? ???–?param1 != value1: 表示請(qǐng)求包含名為 param1 的請(qǐng)求參數(shù),但其值 不能為 value1
?????????????????????????????????–{“param1=value1”, “param2”}: 請(qǐng)求必須包含名為 param1 和param2 的兩個(gè)請(qǐng)求參數(shù),且 param1 參數(shù)的值必須為 value1! ??? ?? ?使用 @RequestMapping 映射請(qǐng)求
????????????????????????
????????????????????? ????Ant 風(fēng)格資源地址支持 3 種匹配符:
?????????????????????????????? ??–??:匹配文件名中的一個(gè)字符
??????????????????????????????? ?–?*:匹配文件名中的任意字符
?????????????????????????????????–?**:** 匹配多層路徑
?????????????????????????@RequestMapping 還支持 Ant 風(fēng)格的 URL:
????????????????????????????? ???–/user/*/createUser: 匹配 ??/user/aaa/createUser、/user/bbb/createUser 等 URL
????????????????????????????? ???–/user/**/createUser: 匹配 ??/user/createUser、/user/aaa/bbb/createUser 等 URL
????????????????????????????? ???–/user/createUser??: 匹配 ??/user/createUseraa、/user/createUserbb 等 URL ?? ?
?????????????????????????? @PathVariable?映射 URL 綁定的占位符
????????????????????? ???帶占位符的 URL 是 Spring3.0 新增的功能,該功能在 SpringMVC 向 REST 目標(biāo)挺進(jìn)發(fā)展過程中具有里程碑的 意義 ??
??????????????????????? ?通過 @PathVariable 可以將 URL 中占位符參數(shù)綁定到控 制器處理方法的入?yún)⒅?#xff1a;URL 中的 {xxx} 占位符可以通過 ??
??????????????????????????????????@PathVariable("xxx") 綁定到操作方法的入?yún)⒅?需要注意的是:該注解的value屬性值要與占位符保持一致。
????????????????????????
?????????????????????????
??????????? 6.REST:
?????????????????????? 即 Representational State Transfer。(資源)表現(xiàn)層狀態(tài)轉(zhuǎn)化。是目前最流行的一種互聯(lián)網(wǎng)軟件架構(gòu)。
????????????????? ???? 它結(jié)構(gòu)清晰、符合標(biāo)準(zhǔn)、易于理解、擴(kuò)展方便, 所以正得到越來越多網(wǎng)站的采用. ?
????????????????? ? ?? HTTP 協(xié)議里面,四個(gè)表示操作方式的動(dòng) 詞:GET、POST、PUT、DELETE。
????????????????????????????? 它們分別對(duì)應(yīng)四種基本操作:
?????????????????????????????????????????????? GET 用來獲 取資源,
???????????????????????????????????????????? ??POST 用來新建資源,
?????????????????????????????????????????????? PUT 用來更新資源,
?????????????????????????????????????????????? DELETE 用來刪除資源。 ?
???????????????????? ????示例:???–/order/1?HTTP GET :得到 id = 1 的 order ???
???????????????????????????????????????–/order/1?HTTP DELETE:刪除 id = 1的 order
??????????????????????????????????? ???–/order/1?HTTP PUT:更新id = 1的 order ?
???????????????????????????????????? ??–/order?HTTP POST:新增 order ??
????????????????????????????????????? ??HiddenHttpMethodFilter:瀏覽器 form 表單只支持 GET 與 POST 請(qǐng)求,而DELETE、PUT 等 method 并不支 持,Spring3.0? 添加了一個(gè)過濾器,可以將這些請(qǐng)求轉(zhuǎn)換 為標(biāo)準(zhǔn)的 http 方法,使得支持 GET、POST、PUT 與 DELETE 請(qǐng)求。
????????????? 7.? ?HiddenHttpMethodFilter
???????????????????? ? 瀏覽器 form 表單只支持 GET 與 POST 請(qǐng)求,而DELETE、PUT 等 method 并不支 持,Spring3.0? 添加了一個(gè)過濾器,可以將這些請(qǐng)求轉(zhuǎn)換 為標(biāo)準(zhǔn)的 http 方法,使得支持 GET、POST、PUT 與 DELETE 請(qǐng)求。
???????????????????? ??POST請(qǐng)求如何轉(zhuǎn)化為put請(qǐng)求和delele請(qǐng)求?
??????????????????????????? 1.在web.xml文件中配置:
?????????????????????????? ??????? <!-- HiddenHttpMethodFilter過濾器可以將POST請(qǐng)求轉(zhuǎn)化為put請(qǐng)求和delete請(qǐng)求! -->
????????????????????????????????? ?<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>
??????????????????????????????
????????????????????????? ? 2.在表單域中需要攜帶一個(gè)name值為_method,value值為put或者delete的參數(shù),如下所示:
????????????????????????????????? ?<form action="${pageContext.request.contextPath }/order/1" method="post">
????????????????????????????????? ??? <input type="hidden" name="_method" value="put"/>
????????????????????????????????????? <input type="submit" value="Submit"/>
?????????????????????????????????? </form>
???????????????????????????????????<form action="${pageContext.request.contextPath }/order/1" method="post">
??????????????????????????????????? ?<input type="hidden" name="_method" value="delete"/>
????????????????????????????????? ???<input type="submit" value="Submit"/>
??????????????????????????????????</form>????
???????????????????????????? ?.jsp頁面
???????????????????????
????????????????????????controller類中:
????????????????????????????
??????????? 8.@RequestParam
??????????????????????? 可以接收請(qǐng)求的參數(shù),相當(dāng)于Servlet的getParameter()方法!
?????????????????????? ?注意:要把@RequestParam和@PathVariable區(qū)分開:?
?????????????????????? ?三個(gè)默認(rèn)屬性:
???????????????????????????? value:這個(gè)字段要與請(qǐng)求參數(shù)的name屬性值一致!
???????????????????????????? required:布爾值,默認(rèn)是true,當(dāng)指定為false的時(shí)候,說明這個(gè)參數(shù)不是必須的,可以不帶!
???????????????????????????? defaultValue:在我們不傳值的時(shí)候,默認(rèn)使用defaultValue的值,傳遞參數(shù)的時(shí)候,使用我們傳遞的參數(shù)值!
???????????????????????
????????????????????????
???????????????????????? ????
??????????????9.@RequestHeader:
??????????????????????? 獲取請(qǐng)求頭信息,默認(rèn)屬性:
??????????????????????? value:這個(gè)字段要與請(qǐng)求參數(shù)的name屬性值一致!
????????????????????? ? required:布爾值,默認(rèn)是true,當(dāng)指定為false的時(shí)候,說明這個(gè)參數(shù)不是必須的,可以不帶!
??????????????????????? defaultValue:在我們不傳值的時(shí)候,默認(rèn)使用defaultValue的值,傳遞參數(shù)的時(shí)候,使用我們傳遞的參數(shù)值!
??????????????????????
??????????????10.針對(duì)POST請(qǐng)求亂碼的處理:
?????????????????????? ?在web.xml文件中加上CharacterEncodingFilter
??????????????????????? <filter>
?????????????????????????? <filter-name>CharacterEncodingFilter</filter-name>
?????????????????????????? <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
???????????????????????? ??<init-param>
???????????????????????????? ??<param-name>encoding</param-name>
????????????????????????????? ?<param-value>utf-8</param-value>
????????????????????????? ?</init-param>
????????????????????? </filter>
????????????????????? <filter-mapping>
?????????????????????????? <filter-name>CharacterEncodingFilter</filter-name>
???????????????????????? ??<url-pattern>/*</url-pattern>
??????????????????????</filter-mapping>?
?????????????????????
????????? 10.?MVC 的 Handler 方法可以接受哪些 ServletAPI 類型的參數(shù)
???????????????????????? ??HttpServletRequest??
?????????????????????????? HttpServletResponse ??
?????????????????????????? HttpSession ?
????????????????????????
??????????????????????
????????? 11.使用 POJO 對(duì)象綁定請(qǐng)求參數(shù)值 ??
???????????????????????? ?Spring MVC 會(huì)按請(qǐng)求參數(shù)名和 POJO 屬性名進(jìn)行自動(dòng)匹 配,自動(dòng)為該對(duì)象填充屬性值。支持級(jí)聯(lián)屬性。 如:dept.deptId、dept.address.tel 等
?????????????????????????
????????? 12.處理模型數(shù)據(jù) ?Spring MVC 提供了以下幾種途徑輸出模型數(shù)據(jù): ?
????????????????????????? –ModelAndView: 處理方法返回值類型為 ModelAndView時(shí), 方法體即可通過該對(duì)象添加模型數(shù)據(jù) ?
????????????????????????? –Map 及 Model、ModelMap: 入?yún)?org.springframework.ui.Model、org.springframework.ui. ModelMap 或 java.uti.Map 時(shí),處理 ??方法返回時(shí),Map 中的數(shù)據(jù)會(huì)自動(dòng)添加到模型中。 ?
????????????????????? ?? ?無論我們的返回值是String類型還是ModelAndView類型,SpringMVC框架執(zhí)行目標(biāo)Handler方法之后都會(huì)將返回值解析為ModelAndView; ?我們放入到Map或者M(jìn)odel、ModelMap中的數(shù)據(jù)都會(huì)放入ModelAndView對(duì)象中,作為MOdel使用! ?
??????????????????????????
????????????????????????
?????????? 13.關(guān)于重定向 ?
??????????????????????????一般情況下,控制器方法返回字符串類型的值會(huì)被當(dāng)成邏輯視圖名處理 ?如果返回的字符串中帶 forward: 或 redirect: 前綴 時(shí),SpringMVC 會(huì)對(duì)他們進(jìn)行特殊處理:將 forward: 和 redirect: 當(dāng)成指示符,其后的字符串作為 URL 來處理
?????????????????????? ???–redirect:/success.jsp:會(huì)完成一個(gè)到 success.jsp 的重定向的操作 ??
????????????????????????? –forward:/success.jsp:會(huì)完成一個(gè)到 success.jsp 的轉(zhuǎn)發(fā)操作
???????????????????????? ?? ?
????????????????????????? ?可以在spingmvc配置文件中配置 ?<mvc:view-controller path="/j1sp" view-name="success"/>標(biāo)簽,就可以讓我們的請(qǐng)求不經(jīng)過Controller,直接進(jìn)入另一個(gè)目標(biāo)頁面!
???????????????????????? ??<!-- 但是此時(shí)原來訪問正常的@RequestMapping URL現(xiàn)在卻不能正常訪問了,如果想正常訪問,需要加入<mvc:annotation-driven>該標(biāo)簽--> ??<mvc:annotation-driven></mvc:annotation-driven> ?
???????????????????????????
??????????????????????????–@SessionAttributes: 將模型中的某個(gè)屬性暫存到HttpSession 中,以便多個(gè)請(qǐng)求之間可以共享這個(gè)屬性??
???????????????????????????@ModelAttribute: 方法入?yún)?biāo)注該注解后, 入?yún)⒌膶?duì)象 就會(huì)放到數(shù)據(jù)模型中 ?
???????????????????????????
???????????14.@ModelAttribute注解用于修飾方法,這個(gè)@ModelAttribute注解修飾的方法在我們每次請(qǐng)求目標(biāo)方法之前都會(huì)被執(zhí)行一次! ?
????????????????????????? ?
?????? ??? 15.SpringMVC確定目標(biāo)方法POJO類型入?yún)⒌倪^程:
??????????????????????? ??1.確定一個(gè)key: ??
???????????????????????????????????? 1).若目標(biāo)方法的POJO類型的參數(shù)木有使用@ModelAttribute作為修飾,則key為POJO類名第一個(gè)字母的小寫。 ?
??????????????????????????????????? ?2).若使用@ModelAttribute修飾,則key為@ModelAttribute注解的value屬性值.
?????????????????????????2.在implicitModel中查找key對(duì)應(yīng)的對(duì)象,若存在,則作為入?yún)魅搿??
???????????????????????????????? ??? 1).若在@ModelAttribute標(biāo)記的方法中在Map保存過,且key和1確定的key一致,則會(huì)獲取到!
??????????????????????? ?3.在implicitModel中不存在key對(duì)應(yīng)的對(duì)象,則檢查當(dāng)前的Handler是否使用@SessionAttribute注解修飾,若使用了該主機(jī),且@SessionAttributes注解的value屬性值中包含了key,則會(huì)從HttpSession中來獲取key所對(duì)應(yīng)的value值,若存在則直接傳入到目標(biāo)方法的入?yún)⒅?#xff0c;若不存在則將拋出異常。 ?
???????????????????????? 4.若Handler沒有標(biāo)識(shí)@SessionAttributes注解或者@SessionAttributes注解的value值中不包含key,則會(huì)通過反射來創(chuàng)建POJO類型的參數(shù),傳入為目標(biāo)方法的參數(shù)。 ? ?
???????????????????????? 5.SpringMVC會(huì)把key和POJO對(duì)象保存到implicitModel中,進(jìn)而會(huì)保存到request域中!??
??????????????????? 注意:
?????????????????????????1.@ModelAttribute標(biāo)記的方法,會(huì)在每個(gè)目標(biāo)方法執(zhí)行之前被SpringMVC調(diào)用! ??
?????????????????????? ? 2.@ModelAttribute注解可以來修飾目標(biāo)方法POJO類型的入?yún)?#xff0c;其value屬性值有如下作用:
?????????????????????????????????? ???1).SpringMVC會(huì)使用value屬性值在implicitModel中查找對(duì)應(yīng)的對(duì)象,若存在則會(huì)直接傳入到目標(biāo)方法的入?yún)⒅???
???????????????????????????????????? ?2)SpringMVC會(huì)以value為key,POJO類型的對(duì)象為value,存入到request域中。 ?
???????????16.@SessionAttributes注解只能標(biāo)記在類上,可以使得多次請(qǐng)求共享某部一部分?jǐn)?shù)據(jù)! ?value:指定放入session域中鍵 ?types:指定放入Session域中的對(duì)象的字節(jié)碼! ? ?
?????????? 17.當(dāng)出現(xiàn)遍歷的情況我們就是用JSTL標(biāo)簽, ?當(dāng)我們使用下拉菜單及單選按鈕、多選按鈕的時(shí)候我們就使用springmvc提供的表單標(biāo)簽, ?在表單標(biāo)簽中的path屬性值相當(dāng)于我們?cè)鶫TML中的name屬性值!
?????????????????????????? ?
?????????? 18.對(duì)于靜態(tài)資源文件如【js/css/圖片】的訪問我們需要在spingmvc配置文件中配置一個(gè)標(biāo)簽,如下所示: ??
?????????????????? <!-- 1.可以映射靜態(tài)資源的訪問請(qǐng)求 --> ??<mvc:default-servlet-handler/> ? ?<mvc:annotation-driven></mvc:annotation-driven>
????????????????????
???????? ? 19.EmployeeCRUD: ?SpringMVC處理靜態(tài)資源【導(dǎo)入js文件】: ????
???????????????????1.為什么出現(xiàn)這樣的問題: ?? 優(yōu)雅的REST風(fēng)格的資源URL不希望帶.html或.do等后綴,若將DispatcherServlet請(qǐng)求映射配置為/, ? 則SpringMVC將捕獲WEB容器的所有請(qǐng)求,包括靜態(tài)資源的請(qǐng)求,SpringMVC會(huì)將他們當(dāng)成一個(gè)普通請(qǐng)求處理,因此找不到對(duì)應(yīng)處理器將導(dǎo)致錯(cuò)誤。
??????????????? ?? 2.解決:在SpringMVC的配置文件中配置<mvc:default-servlet-handler>
?????????????????????
???????? ?? 21.?當(dāng)需要表單回顯或者使用下拉列表的時(shí)候,就使用form表單標(biāo)簽,而如果使用遍歷的標(biāo)簽就使用JSTL標(biāo)簽【導(dǎo)包】!
????????????22.視圖和視圖解析器
???????????????????????【參見Springmvc如何解析視圖流程圖片】 ?
???????????????????????? ?請(qǐng)求處理方法執(zhí)行完成后,最終返回一個(gè) ModelAndView 對(duì)象。對(duì)于那些返回 String,View 或 ModeMap 等類型的處理方法,SpringMVC 也會(huì)在內(nèi)部將它們裝配成一個(gè) ModelAndView 對(duì)象,它包含了邏輯名和模型對(duì)象的視圖
??????????????? ???????? Spring MVC 借助視圖解析器(ViewResolver)得到最終 的視圖對(duì)象(View),最終的視圖可以是 JSP ,也可能是Excel、JFreeChart等各種表現(xiàn)形式的視圖 ? ?視圖 ??視圖的作用是渲染模型數(shù)據(jù),將模型里的數(shù)據(jù)以某種形式呈現(xiàn)給客戶。 ??視圖對(duì)象由視圖解析器負(fù)責(zé)實(shí)例化。由于視圖是無狀態(tài)的,所以他們不會(huì)有線程安全的問題。
???????????????????????? 自定義視圖 ?1.自定義視圖,實(shí)現(xiàn)view接口或者繼承AbstractView抽象類,并加入到IOC容器中。 ?2.在springmvc配置文件中配置BeanNameViewResolver視圖解析器。 ? ?
???????????? 23.?數(shù)據(jù)格式化標(biāo)簽:
?????????????????????? ? 1.在SpringMVC配置文件中配置<mvc:annotation-driven/>
?????????????????????????2.在目標(biāo)POJO對(duì)象的屬性上加上@NumberFormat 或者 @DateTimeFormat 注解! ?? @DateTimeFormat ??
??????????????????????????????? ?–?pattern 屬性:類型為字符串。指定解析/格式化字段數(shù)據(jù)的模式, 如:”yyyy-MM-dd hh:mm:ss” ??
??????????????????????????????? @NumberFormat ???
??????????????????????????????? –pattern:類型為 String,自定義樣式, 如patter="#,###"; ? ?
????????????? 24.數(shù)據(jù)類型轉(zhuǎn)換以及數(shù)據(jù)格式化標(biāo)簽: ?? 數(shù)據(jù)類型轉(zhuǎn)換【了解】 ??
??????????????????????????1. 自定義類型轉(zhuǎn)換器實(shí)現(xiàn)Converter<S,T>接口并加入到SpringMVC的IOC容器中, ????
????????????????????????????? ?@Component ???
???????????????????????????????? public class EmployeeConverter implements Converter<String, Employee>{
@Override?????
public Employee convert(String source) {? ?????
System.out.println(source); ????
if(source != null){ ??????
String[] vals = source.split("-"); ??????
if(vals != null && vals.length ==5){ ???????
String name = vals[0]; ???????
String email = vals[1]; ???????
Integer gender = Integer.parseInt(vals[2]); ??????
Department department = new Department(); ???????
department.setId(Integer.parseInt(vals[3]));??? ???????
Employee employee = new Employee(null, name, email, gender, department); ???????
return employee; ??????
} ?????
} ????
return null; ????
} ???
} ??? ??
??????????????????????????? 2.配置自定義轉(zhuǎn)換器到FormattingConversionServiceFactoryBean工廠中! ?? ???
???????????????????????????????????? <!-- 將ConversionService再作為annotation-driven的一個(gè)屬性存在! --> ???
???????????????????????????????????? <mvc:annotation-driven conversion-service="conversionService">
???????????????????????????????????? </mvc:annotation-driven> ??? ???
???????????????????????????????????? <!-- 配置ConversionService --> ???
???????????????????????????????????? <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean"> ????
?????????????????????????????????????<property name="converters"> ?????
?????????????????????????????????????<set> ??????
???????????????????????????????????????? <ref bean="employeeConverter"/> ?????
?????????????????????????????????????</set> ????
??????????????????????????????????? </property> ???
??????????????????????????????????? </bean> ?? ?
??????????????25.SpringMVC如何處理JSON數(shù)據(jù)? ??
????????????????????????? 1.加入json的3個(gè)jar包 ????
??????????????????????????????????? jackson-annotations-2.1.5.jar ?
??????????????????????????????????? jackson-core-2.1.5.jar ?
????????????????????????????????????jackson-databind-2.1.5.jar ? ?
????????????????????????? 2. 編寫目標(biāo)方法,使其返回 JSON 對(duì)應(yīng)的對(duì)象或集合 ?3. 在方法上添加 @ResponseBody 注解
?????????????? 26.文件上傳
????????????????????????? Spring MVC 上下文中默認(rèn)沒有為文件上傳提供了直接的支持,因 此默認(rèn)情況下不能處理文件的上傳工作,如果想使用 Spring 的文件上傳功能,需現(xiàn)在上下文中配置 CommonsMultipartResovler:
???????????????????????? ?1.加入jar包:
????????????????????????????????????? commons-fileupload-1.3.1.jar
????????????????????????????????????? commons-io-2.4.jar
???????????????????????? ?2.在SpringMVC配置文件中配置CommonsMultipartResovler
???????????????????????????????????? ?<!-- 配置CommonsMultipartResolver -->
????????????????????????????????????? <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
?????????????????????????????????????????????? <property name="defaultEncoding" value="utf-8"></property>
?????????????????????????????????? ??????????? <!-- 以字節(jié)為單位 -->
???????????????????????????????????????????????<property name="maxUploadSize" value="1024000"></property>
????????????????????????????????????? </bean>
???????????????????????? ?2.表單:POST請(qǐng)求,file類型,enctype="multipart/form-data"
??????????????????????????? ???1.?文件上傳
?????????????????????????????????????@RequestMapping(value="testUpload",method=RequestMethod.POST)
?????????????????????????????????????public String testUpload(HttpServletRequest request,@RequestParam(value="desc",required=false) String desc,@RequestParam("photo") CommonsMultipartFile file) throws Exception{
???????????????????????????????????? ?? ??ServletContext servletContext = request.getServletContext();
???????????????????????????????????????? ?String realPath = servletContext.getRealPath("/upload");
??? File file1 = new File(realPath);
????if(!file1.exists()){
?????file1.mkdir();
????}
?? OutputStream out;
??? InputStream in;
????//uuid_name.jpg
????String prefix = UUID.randomUUID().toString();
????prefix = prefix.replace("-","");
????String fileName = prefix+"_"+file.getOriginalFilename();
????System.out.println(fileName);
????out = new FileOutputStream(new File(realPath+"\\"+fileName));
????in = file.getInputStream();
????IOUtils.copy(in, out);
????out.close();
????in.close();
????return "success";
???}
????? ?2.用ResponseEntity<byte[]> 返回值完成文件下載:
?@RequestMapping(value="testResponseEntity")
???public ResponseEntity<byte[]> testResponseEntity(HttpServletRequest request) throws Exception{
????byte[] body = null;
????ServletContext servletContext = request.getServletContext();
????String fileName = "風(fēng)吹麥浪.mp3“;
????String path = servletContext.getRealPath("/WEB-INF/"+fileName);
????File file = new File(path);
????InputStream in = new FileInputStream(file);
????body = new byte[in.available()];
????in.read(body);
????HttpHeaders headers = new HttpHeaders();
????fileName = new String(fileName.getBytes("gbk"),"iso8859-1");
????headers.add("Content-Disposition", "attachment;filename="+fileName);
????HttpStatus statusCode=HttpStatus.OK;
????ResponseEntity<byte[]> response = new ResponseEntity<byte[]>(body, headers, statusCode);
????return response;
???}????
27.自定義攔截器
?Spring MVC也可以使用攔截器對(duì)請(qǐng)求進(jìn)行攔截處理,用戶可以自定義攔截器來實(shí)現(xiàn)特定的功能,自定義的攔截器必 須實(shí)現(xiàn)HandlerInterceptor接口
?1.自定義實(shí)現(xiàn)類實(shí)現(xiàn) HandlerInterceptor接口
?2.在springmvc配置文件中配置相對(duì)應(yīng)的攔截器
??? <mvc:interceptors>
????? ??<!--配置自定義攔截器 ,所有的路徑都攔截 -->
????? ??<bean class="com.neuedu.springmvc.filter.MyFilter"></bean>
?? ?</mvc:interceptors>
?? ?preHandle():該方法在目標(biāo)方法之前被調(diào)用,
????若返回值為true,則繼續(xù)調(diào)用后續(xù)的攔截器和目標(biāo)方法
????若返回值為false,則不會(huì)再調(diào)用后續(xù)的攔截器和目標(biāo)方法???
????可以考慮做權(quán)限,日志或者事務(wù)等!
????postHandle():調(diào)用目標(biāo)方法之后,但渲染視圖之前被調(diào)用可以對(duì)請(qǐng)求域中的屬性或者視圖做出修改
?? ?afterCompletion():渲染視圖之后被調(diào)用,? 可以在該方法中進(jìn)行一些資源清理的操作。???
??? 關(guān)于攔截器的配置:
?? ?<mvc:interceptors>
? ?<!--配置自定義攔截器 ,所有的路徑都攔截 -->
???<bean class="com.neuedu.springmvc.filter.MyFilter"></bean>
???<!-- 關(guān)于攔截器的配置問題 ,可以通過<mvc:interceptor>來配置使用哪個(gè)攔截器來【不】攔截的路徑-->
?? <mvc:interceptor>
???????? ?<!-- 用<mvc:mapping>標(biāo)簽指定要攔截的路徑 -->
???????? ?<mvc:mapping path="/employ"/>
??????????<!-- 指定使用哪個(gè)攔截器進(jìn)行攔截 -->
????????? <bean class="com.neuedu.springmvc.filter.SecondFilter"></bean>
???</mvc:interceptor>
?? </mvc:interceptors>
測(cè)試:
?
Secondin類實(shí)現(xiàn)HandlerInterceptor
Myin類實(shí)現(xiàn)HandlerInterceptor
在springmvc中的配置
運(yùn)行結(jié)果:
????????????28.? SpringMVC的異常處理:
????????????????????????? ?1.加上<mvc:annotation-driven>標(biāo)簽: ? ?
?????????????????????????? 2.在當(dāng)前Handler中定義由@ExceptionHandler注解修飾的方法,用于處理異常信息!
???????????????????????? ??注意:
????????????????????????????????1.@ExceptionHandler方法修飾的入?yún)⒅锌梢约尤隕xception類型的參數(shù),該參數(shù)即對(duì)應(yīng)發(fā)生的異常信息 ?
??????????????????????????????? 2.@ExceptionHandler方法的入?yún)⒅胁荒軅魅隡ap.若希望把異常信息傳到頁面上,需要使用ModelAndView作為方法的返回值。 ? ?
??????????????????????????????? 3.@ExceptionHandler 注解定義的方法優(yōu)先級(jí)問題: ?例如發(fā) 生的是NullPointerException,但是聲明的異常有 RuntimeException 和 Exception,此候會(huì)根據(jù)異常的最近 繼承關(guān)系找到繼承深度最淺的那個(gè) @ExceptionHandler 注解方法,即標(biāo)記了 RuntimeException 的方法 ? ? ?
??????????????????????????????? 4.ExceptionHandlerMethodResolver 內(nèi)部若找不 到@ExceptionHandler 注解的話,會(huì)找@ControllerAdvice 中的@ExceptionHandler 注解方法
????????????????????????????????????? ?本類中的優(yōu)先級(jí):
???????????????????????????????????
??????????????????????????????????????本類找不到時(shí),去找@ControllerAdvice 中的@ExceptionHandler 注解方法
??????????????????????????????????????
????????????29.? 基于配置的異常處理: ?如果希望對(duì)所有異常進(jìn)行統(tǒng)一處理,可以使用 SimpleMappingExceptionResolver,它將異常類名映射為 視圖名,即發(fā)生異常時(shí)使用對(duì)應(yīng)的視圖報(bào)告異常 ??
??????????????????????????????? <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> ???
????????????????????????????????<!-- 指定在在request域中獲取異常信息所需要的key:即ex --> ???
<property name="exceptionAttribute" value="ex"></property> ???
<!-- 指定異常映射 --> ???<property name="exceptionMappings"> ????
<props> ??????
<!--? 由prop標(biāo)簽的key屬性指定發(fā)生異常的全類名,由值指定出現(xiàn)異常去哪個(gè)頁面! --> ?????
<prop key="java.lang.ArithmeticException">error</prop> ????
</props> ???
</property> ??
</bean>
???????????????????????????????
??????????????????????????????
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/12344321hh/p/7404433.html
總結(jié)
以上是生活随笔為你收集整理的170821-关于SpringMVC的知识点的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 编译安装 zbar 时两次 make 带
- 下一篇: 【转】 JMeter学习(二十四)lin