???????????1.SpringMVC 概述以及優勢
???????????????????SpringMVC和Spring的關系: ?軟件開發的三層架構: web層【表示層、表現層】---->Service層---->Dao[DataBase Access Object]---->數據庫! ?
?????????????????? SpringMVC實際上是Spring的一個子模塊,我們用SpringMVC來代替這個JavaWEB部分!
???????????????? ??MVC:也是一種設計模式:M:Model【模型】-->V[View]--->C[Controller]! ???????
?????????????????????????????????Model用來封裝數據的,View:用來顯示數據? Controller:用于接收前端頁面發送的請求,然后調用Service層處理,拿到處理結果,將該結果返回給前端頁面! ??????? ?
???????????????????SpringMVC:相當于MVC架構中的C以及V!
?????????????????? JavaEE-->J2EE
???????????????????優勢:Spring 為展現層提供的基于 MVC 設計理念的優秀的Web 框架,是目前最主流的 MVC 框架之一 ?Spring3.0 后全面超越 Struts2,成為最優秀的 MVC 框架 ?Spring MVC 通過一套 MVC 注解,讓 POJO 成為處理請 求的控制器,而無須實現任何接口。 ?支持 REST 風格的 URL 請求 ?采用了松散耦合可插拔組件結構,比其他 MVC 框架更具擴展性和靈活性
???????????????????SpingMVC是基于SpingMVC4.x
??????????? 2.SpringMVC之HelloWorld ??
?????????????????? 步驟: ?
????????????????????? ??– 加入 jar 包 ?
????????????????????? ??– 在 web.xml 中配置 DispatcherServlet ?
????????????????????????– 加入 Spring MVC 的配置文件 ???
??????????????????????? – 編寫處理請求的處理器,并標識為處理器 ??
?????????????????????? ?– 編寫視圖 ?
??????????????????????????????? ??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 --> ?
?<!--向服務器注冊前端控制器!? -->
??<servlet> ???
???????? <servlet-name>springDispatcherServlet</servlet-name>
?????????<!--DispatcherServlet指的是SpringMVC的前端控制器!,給服務器使用,創建servlet對象!? --> ???
???????? <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> ???
???????? <!-- 初始化參數contextConfigLocation用于指定SpringMVC配置文件的路徑以及名稱 --> ?
?????????<init-param>
??????????????? <param-name>contextConfigLocation</param-name> ??
?????????????? ?<param-value>classpath:springmvc.xml</param-value> ??
???????? </init-param>
?????????<!-- 數字0或者大于0的數字表示的是:在服務器啟動的時候創建Servlet對象,而不是第一次訪問的時候創建 ????小于0的數字指的是:在第一次訪問的時候創建Servlet對象. ????在數字大于O的情況下,數字越小,優先級越高! ??? -->
????????<load-on-startup>1</load-on-startup> ?
?</servlet>
??<!-- Map all requests to the DispatcherServlet for handling -->
??<!-- 用 servlet-mapping指定請求映射的路徑--> ?
?<servlet-mapping> ?
?<servlet-name>springDispatcherServlet</servlet-name> ?
?<!-- 用url-pattern指定攔截 的請求路徑! --> ???
<url-pattern>/</url-pattern> ?
?</servlet-mapping>
??????????????????????????????????????????????注意:當我們不用init-param指定springMVC配置文件的路徑好位置的時候,SpringMVC默認會去/WEB-INF/<servlet-name>-servlet.xml
??????????????????????????????????????????????????????? 創建SpringMVC配置文件的名字要和上面在web.xml文件中指定的名字一致!
??????????????????????????????2.我們創建SpringMVC配置文件的時候使用的是Spring Bean Configuration File創建的,不是XML!
??????????????????????????????????????????????<!-- 配置SpingMVC容器要掃描的包! -->
????????????????????????????????????????????? <context:component-scan base-package="com.neuedu.controller"></context:component-scan>
???????????????????????????????????????????
???????????????? 配置視圖解析器?:視圖名稱解析器:將視圖邏輯名解析為: /WEB-INF/pages/<viewName>.jsp????????
?????????????????<!--InternalResourceViewResolvers 是視圖解析器 ,它會將邏輯視圖轉換成實際的物理視圖,做一個轉發操作!也就是說具體步驟: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掃描的包下創建控制器類[Controller/Handler],注意要加入@Controller注解
??????????????????????????/**
????????????????????????? ?? * 我們通過@RequestMapping做請求URL的映射!
?????????????????????????? ? * @return
????????????????????????? ?? */
???????????????????????? ?@RequestMapping("/sayHello")
?????????????????????????? public String sayHello(){
???????????????????????????return "/WEB-INF/views/success.jsp";
??????????????????????????}
???????????????????????? ?注意:在類的方法上我們使用的是@RequestMapping,然后在括號里指定請求url的請求路徑!
????????????????????????? ??
??????????? 4. 使用 @RequestMapping 映射請求
?????????????????????? ??Spring MVC? 使用 @RequestMapping 注解為控制器指定可以處理哪些 URL 請求 ?
??????????????????????? ?在控制器的類定義及方法定義處都可標注 ?@RequestMapping
??????????????????????????????? ?–?類定義處:提供初步的請求映射信息。相對于 WEB 應用的根目錄 ?
???????????????????????????????? –?方法處:提供進一步的細分映射信息。相對于類定義處的 URL。
???????????????????????????????? 若 類定義處未標注 @RequestMapping,則方法處標記的 URL 相當于當前 WEB 應用的根目錄
??????????????????????????????? ?若 類定義處標注 @RequestMapping,則方法處標記的 URL 相對于類定義處的@RequestMapping而言的!
?????????????????????????DispatcherServlet 截獲請求后,就通過控制器上@RequestMapping 提供的映射信息確定請求所對應的處理方法。
??????????????????? ?? ?映射請求參數、請求方法或請求頭
???????????????????? ????@RequestMapping 除了可以使用請求 URL 映射請求外,還可以使用請求方法、請求參數及請求頭映射請求
????????????????????? ???@RequestMapping 的 value、method、params 及 heads 分別表示請求?? URL、請求方法、請求參數及請求頭的映射條件,他們之間是與的關系,聯合使用多個條件可讓請求映射 更加精確化。????????
??????????????????? ? ???params 和 headers支持簡單的表達式:
?????????????????????????????? ??–?param1: 表示請求必須包含名為 param1 的請求參數 ?
??????????????????????????????? ?–?!param1: 表示請求不能包含名為 param1 的請求參數
????????????????????????????? ???–?param1 != value1: 表示請求包含名為 param1 的請求參數,但其值 不能為 value1
?????????????????????????????????–{“param1=value1”, “param2”}: 請求必須包含名為 param1 和param2 的兩個請求參數,且 param1 參數的值必須為 value1! ??? ?? ?使用 @RequestMapping 映射請求
????????????????????????
????????????????????? ????Ant 風格資源地址支持 3 種匹配符:
?????????????????????????????? ??–??:匹配文件名中的一個字符
??????????????????????????????? ?–?*:匹配文件名中的任意字符
?????????????????????????????????–?**:** 匹配多層路徑
?????????????????????????@RequestMapping 還支持 Ant 風格的 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 目標挺進發展過程中具有里程碑的 意義 ??
??????????????????????? ?通過 @PathVariable 可以將 URL 中占位符參數綁定到控 制器處理方法的入參中:URL 中的 {xxx} 占位符可以通過 ??
??????????????????????????????????@PathVariable("xxx") 綁定到操作方法的入參中,需要注意的是:該注解的value屬性值要與占位符保持一致。
????????????????????????
?????????????????????????
??????????? 6.REST:
?????????????????????? 即 Representational State Transfer。(資源)表現層狀態轉化。是目前最流行的一種互聯網軟件架構。
????????????????? ???? 它結構清晰、符合標準、易于理解、擴展方便, 所以正得到越來越多網站的采用. ?
????????????????? ? ?? HTTP 協議里面,四個表示操作方式的動 詞:GET、POST、PUT、DELETE。
????????????????????????????? 它們分別對應四種基本操作:
?????????????????????????????????????????????? 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 請求,而DELETE、PUT 等 method 并不支 持,Spring3.0? 添加了一個過濾器,可以將這些請求轉換 為標準的 http 方法,使得支持 GET、POST、PUT 與 DELETE 請求。
????????????? 7.? ?HiddenHttpMethodFilter
???????????????????? ? 瀏覽器 form 表單只支持 GET 與 POST 請求,而DELETE、PUT 等 method 并不支 持,Spring3.0? 添加了一個過濾器,可以將這些請求轉換 為標準的 http 方法,使得支持 GET、POST、PUT 與 DELETE 請求。
???????????????????? ??POST請求如何轉化為put請求和delele請求?
??????????????????????????? 1.在web.xml文件中配置:
?????????????????????????? ??????? <!-- HiddenHttpMethodFilter過濾器可以將POST請求轉化為put請求和delete請求! -->
????????????????????????????????? ?<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.在表單域中需要攜帶一個name值為_method,value值為put或者delete的參數,如下所示:
????????????????????????????????? ?<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
??????????????????????? 可以接收請求的參數,相當于Servlet的getParameter()方法!
?????????????????????? ?注意:要把@RequestParam和@PathVariable區分開:?
?????????????????????? ?三個默認屬性:
???????????????????????????? value:這個字段要與請求參數的name屬性值一致!
???????????????????????????? required:布爾值,默認是true,當指定為false的時候,說明這個參數不是必須的,可以不帶!
???????????????????????????? defaultValue:在我們不傳值的時候,默認使用defaultValue的值,傳遞參數的時候,使用我們傳遞的參數值!
???????????????????????
????????????????????????
???????????????????????? ????
??????????????9.@RequestHeader:
??????????????????????? 獲取請求頭信息,默認屬性:
??????????????????????? value:這個字段要與請求參數的name屬性值一致!
????????????????????? ? required:布爾值,默認是true,當指定為false的時候,說明這個參數不是必須的,可以不帶!
??????????????????????? defaultValue:在我們不傳值的時候,默認使用defaultValue的值,傳遞參數的時候,使用我們傳遞的參數值!
??????????????????????
??????????????10.針對POST請求亂碼的處理:
?????????????????????? ?在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 類型的參數
???????????????????????? ??HttpServletRequest??
?????????????????????????? HttpServletResponse ??
?????????????????????????? HttpSession ?
????????????????????????
??????????????????????
????????? 11.使用 POJO 對象綁定請求參數值 ??
???????????????????????? ?Spring MVC 會按請求參數名和 POJO 屬性名進行自動匹 配,自動為該對象填充屬性值。支持級聯屬性。 如:dept.deptId、dept.address.tel 等
?????????????????????????
????????? 12.處理模型數據 ?Spring MVC 提供了以下幾種途徑輸出模型數據: ?
????????????????????????? –ModelAndView: 處理方法返回值類型為 ModelAndView時, 方法體即可通過該對象添加模型數據 ?
????????????????????????? –Map 及 Model、ModelMap: 入參為 org.springframework.ui.Model、org.springframework.ui. ModelMap 或 java.uti.Map 時,處理 ??方法返回時,Map 中的數據會自動添加到模型中。 ?
????????????????????? ?? ?無論我們的返回值是String類型還是ModelAndView類型,SpringMVC框架執行目標Handler方法之后都會將返回值解析為ModelAndView; ?我們放入到Map或者Model、ModelMap中的數據都會放入ModelAndView對象中,作為MOdel使用! ?
??????????????????????????
????????????????????????
?????????? 13.關于重定向 ?
??????????????????????????一般情況下,控制器方法返回字符串類型的值會被當成邏輯視圖名處理 ?如果返回的字符串中帶 forward: 或 redirect: 前綴 時,SpringMVC 會對他們進行特殊處理:將 forward: 和 redirect: 當成指示符,其后的字符串作為 URL 來處理
?????????????????????? ???–redirect:/success.jsp:會完成一個到 success.jsp 的重定向的操作 ??
????????????????????????? –forward:/success.jsp:會完成一個到 success.jsp 的轉發操作
???????????????????????? ?? ?
????????????????????????? ?可以在spingmvc配置文件中配置 ?<mvc:view-controller path="/j1sp" view-name="success"/>標簽,就可以讓我們的請求不經過Controller,直接進入另一個目標頁面!
???????????????????????? ??<!-- 但是此時原來訪問正常的@RequestMapping URL現在卻不能正常訪問了,如果想正常訪問,需要加入<mvc:annotation-driven>該標簽--> ??<mvc:annotation-driven></mvc:annotation-driven> ?
???????????????????????????
??????????????????????????–@SessionAttributes: 將模型中的某個屬性暫存到HttpSession 中,以便多個請求之間可以共享這個屬性??
???????????????????????????@ModelAttribute: 方法入參標注該注解后, 入參的對象 就會放到數據模型中 ?
???????????????????????????
???????????14.@ModelAttribute注解用于修飾方法,這個@ModelAttribute注解修飾的方法在我們每次請求目標方法之前都會被執行一次! ?
????????????????????????? ?
?????? ??? 15.SpringMVC確定目標方法POJO類型入參的過程:
??????????????????????? ??1.確定一個key: ??
???????????????????????????????????? 1).若目標方法的POJO類型的參數木有使用@ModelAttribute作為修飾,則key為POJO類名第一個字母的小寫。 ?
??????????????????????????????????? ?2).若使用@ModelAttribute修飾,則key為@ModelAttribute注解的value屬性值.
?????????????????????????2.在implicitModel中查找key對應的對象,若存在,則作為入參傳入。 ?
???????????????????????????????? ??? 1).若在@ModelAttribute標記的方法中在Map保存過,且key和1確定的key一致,則會獲取到!
??????????????????????? ?3.在implicitModel中不存在key對應的對象,則檢查當前的Handler是否使用@SessionAttribute注解修飾,若使用了該主機,且@SessionAttributes注解的value屬性值中包含了key,則會從HttpSession中來獲取key所對應的value值,若存在則直接傳入到目標方法的入參中,若不存在則將拋出異常。 ?
???????????????????????? 4.若Handler沒有標識@SessionAttributes注解或者@SessionAttributes注解的value值中不包含key,則會通過反射來創建POJO類型的參數,傳入為目標方法的參數。 ? ?
???????????????????????? 5.SpringMVC會把key和POJO對象保存到implicitModel中,進而會保存到request域中!??
??????????????????? 注意:
?????????????????????????1.@ModelAttribute標記的方法,會在每個目標方法執行之前被SpringMVC調用! ??
?????????????????????? ? 2.@ModelAttribute注解可以來修飾目標方法POJO類型的入參,其value屬性值有如下作用:
?????????????????????????????????? ???1).SpringMVC會使用value屬性值在implicitModel中查找對應的對象,若存在則會直接傳入到目標方法的入參中 ??
???????????????????????????????????? ?2)SpringMVC會以value為key,POJO類型的對象為value,存入到request域中。 ?
???????????16.@SessionAttributes注解只能標記在類上,可以使得多次請求共享某部一部分數據! ?value:指定放入session域中鍵 ?types:指定放入Session域中的對象的字節碼! ? ?
?????????? 17.當出現遍歷的情況我們就是用JSTL標簽, ?當我們使用下拉菜單及單選按鈕、多選按鈕的時候我們就使用springmvc提供的表單標簽, ?在表單標簽中的path屬性值相當于我們原生HTML中的name屬性值!
?????????????????????????? ?
?????????? 18.對于靜態資源文件如【js/css/圖片】的訪問我們需要在spingmvc配置文件中配置一個標簽,如下所示: ??
?????????????????? <!-- 1.可以映射靜態資源的訪問請求 --> ??<mvc:default-servlet-handler/> ? ?<mvc:annotation-driven></mvc:annotation-driven>
????????????????????
???????? ? 19.EmployeeCRUD: ?SpringMVC處理靜態資源【導入js文件】: ????
???????????????????1.為什么出現這樣的問題: ?? 優雅的REST風格的資源URL不希望帶.html或.do等后綴,若將DispatcherServlet請求映射配置為/, ? 則SpringMVC將捕獲WEB容器的所有請求,包括靜態資源的請求,SpringMVC會將他們當成一個普通請求處理,因此找不到對應處理器將導致錯誤。
??????????????? ?? 2.解決:在SpringMVC的配置文件中配置<mvc:default-servlet-handler>
?????????????????????
???????? ?? 21.?當需要表單回顯或者使用下拉列表的時候,就使用form表單標簽,而如果使用遍歷的標簽就使用JSTL標簽【導包】!
????????????22.視圖和視圖解析器
???????????????????????【參見Springmvc如何解析視圖流程圖片】 ?
???????????????????????? ?請求處理方法執行完成后,最終返回一個 ModelAndView 對象。對于那些返回 String,View 或 ModeMap 等類型的處理方法,SpringMVC 也會在內部將它們裝配成一個 ModelAndView 對象,它包含了邏輯名和模型對象的視圖
??????????????? ???????? Spring MVC 借助視圖解析器(ViewResolver)得到最終 的視圖對象(View),最終的視圖可以是 JSP ,也可能是Excel、JFreeChart等各種表現形式的視圖 ? ?視圖 ??視圖的作用是渲染模型數據,將模型里的數據以某種形式呈現給客戶。 ??視圖對象由視圖解析器負責實例化。由于視圖是無狀態的,所以他們不會有線程安全的問題。
???????????????????????? 自定義視圖 ?1.自定義視圖,實現view接口或者繼承AbstractView抽象類,并加入到IOC容器中。 ?2.在springmvc配置文件中配置BeanNameViewResolver視圖解析器。 ? ?
???????????? 23.?數據格式化標簽:
?????????????????????? ? 1.在SpringMVC配置文件中配置<mvc:annotation-driven/>
?????????????????????????2.在目標POJO對象的屬性上加上@NumberFormat 或者 @DateTimeFormat 注解! ?? @DateTimeFormat ??
??????????????????????????????? ?–?pattern 屬性:類型為字符串。指定解析/格式化字段數據的模式, 如:”yyyy-MM-dd hh:mm:ss” ??
??????????????????????????????? @NumberFormat ???
??????????????????????????????? –pattern:類型為 String,自定義樣式, 如patter="#,###"; ? ?
????????????? 24.數據類型轉換以及數據格式化標簽: ?? 數據類型轉換【了解】 ??
??????????????????????????1. 自定義類型轉換器實現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.配置自定義轉換器到FormattingConversionServiceFactoryBean工廠中! ?? ???
???????????????????????????????????? <!-- 將ConversionService再作為annotation-driven的一個屬性存在! --> ???
???????????????????????????????????? <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數據? ??
????????????????????????? 1.加入json的3個jar包 ????
??????????????????????????????????? jackson-annotations-2.1.5.jar ?
??????????????????????????????????? jackson-core-2.1.5.jar ?
????????????????????????????????????jackson-databind-2.1.5.jar ? ?
????????????????????????? 2. 編寫目標方法,使其返回 JSON 對應的對象或集合 ?3. 在方法上添加 @ResponseBody 注解
?????????????? 26.文件上傳
????????????????????????? Spring MVC 上下文中默認沒有為文件上傳提供了直接的支持,因 此默認情況下不能處理文件的上傳工作,如果想使用 Spring 的文件上傳功能,需現在上下文中配置 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>
?????????????????????????????????? ??????????? <!-- 以字節為單位 -->
???????????????????????????????????????????????<property name="maxUploadSize" value="1024000"></property>
????????????????????????????????????? </bean>
???????????????????????? ?2.表單:POST請求,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 = "風吹麥浪.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也可以使用攔截器對請求進行攔截處理,用戶可以自定義攔截器來實現特定的功能,自定義的攔截器必 須實現HandlerInterceptor接口
?1.自定義實現類實現 HandlerInterceptor接口
?2.在springmvc配置文件中配置相對應的攔截器
??? <mvc:interceptors>
????? ??<!--配置自定義攔截器 ,所有的路徑都攔截 -->
????? ??<bean class="com.neuedu.springmvc.filter.MyFilter"></bean>
?? ?</mvc:interceptors>
?? ?preHandle():該方法在目標方法之前被調用,
????若返回值為true,則繼續調用后續的攔截器和目標方法
????若返回值為false,則不會再調用后續的攔截器和目標方法???
????可以考慮做權限,日志或者事務等!
????postHandle():調用目標方法之后,但渲染視圖之前被調用可以對請求域中的屬性或者視圖做出修改
?? ?afterCompletion():渲染視圖之后被調用,? 可以在該方法中進行一些資源清理的操作。???
??? 關于攔截器的配置:
?? ?<mvc:interceptors>
? ?<!--配置自定義攔截器 ,所有的路徑都攔截 -->
???<bean class="com.neuedu.springmvc.filter.MyFilter"></bean>
???<!-- 關于攔截器的配置問題 ,可以通過<mvc:interceptor>來配置使用哪個攔截器來【不】攔截的路徑-->
?? <mvc:interceptor>
???????? ?<!-- 用<mvc:mapping>標簽指定要攔截的路徑 -->
???????? ?<mvc:mapping path="/employ"/>
??????????<!-- 指定使用哪個攔截器進行攔截 -->
????????? <bean class="com.neuedu.springmvc.filter.SecondFilter"></bean>
???</mvc:interceptor>
?? </mvc:interceptors>
測試:
?
Secondin類實現HandlerInterceptor
Myin類實現HandlerInterceptor
在springmvc中的配置
運行結果:
????????????28.? SpringMVC的異常處理:
????????????????????????? ?1.加上<mvc:annotation-driven>標簽: ? ?
?????????????????????????? 2.在當前Handler中定義由@ExceptionHandler注解修飾的方法,用于處理異常信息!
???????????????????????? ??注意:
????????????????????????????????1.@ExceptionHandler方法修飾的入參中可以加入Exception類型的參數,該參數即對應發生的異常信息 ?
??????????????????????????????? 2.@ExceptionHandler方法的入參中不能傳入Map.若希望把異常信息傳到頁面上,需要使用ModelAndView作為方法的返回值。 ? ?
??????????????????????????????? 3.@ExceptionHandler 注解定義的方法優先級問題: ?例如發 生的是NullPointerException,但是聲明的異常有 RuntimeException 和 Exception,此候會根據異常的最近 繼承關系找到繼承深度最淺的那個 @ExceptionHandler 注解方法,即標記了 RuntimeException 的方法 ? ? ?
??????????????????????????????? 4.ExceptionHandlerMethodResolver 內部若找不 到@ExceptionHandler 注解的話,會找@ControllerAdvice 中的@ExceptionHandler 注解方法
????????????????????????????????????? ?本類中的優先級:
???????????????????????????????????
??????????????????????????????????????本類找不到時,去找@ControllerAdvice 中的@ExceptionHandler 注解方法
??????????????????????????????????????
????????????29.? 基于配置的異常處理: ?如果希望對所有異常進行統一處理,可以使用 SimpleMappingExceptionResolver,它將異常類名映射為 視圖名,即發生異常時使用對應的視圖報告異常 ??
??????????????????????????????? <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> ???
????????????????????????????????<!-- 指定在在request域中獲取異常信息所需要的key:即ex --> ???
<property name="exceptionAttribute" value="ex"></property> ???
<!-- 指定異常映射 --> ???<property name="exceptionMappings"> ????
<props> ??????
<!--? 由prop標簽的key屬性指定發生異常的全類名,由值指定出現異常去哪個頁面! --> ?????
<prop key="java.lang.ArithmeticException">error</prop> ????
</props> ???
</property> ??
</bean>
???????????????????????????????
??????????????????????????????
?
?