SpringMVC用到的功能總結

1、@RequestMapping

    params:指定請求參數,例:params={"param1=value1","param2"}表示請求中必須包含param1和param2,且param1必須  等於value1;
   headers: 指定請求頭request headers中的參數,例:headers="contentType=text/**" 則請求頭中,contentType必須爲 text/** ;
    value:映射路徑,可省略,?表示匹配單個字符,*表示匹配任意字符,**表示匹配任意層級;
    method:指定請求方法,GET表示獲取數據,POST表示新增數據,PUT表示更新數據,DELETE表示刪除數據。

2、@PathVariable:
    映射URL綁定的佔位符,將URL中{xxx}的數據映射到 @PathVariable("xxx") 指定的變量中;
    例:@RequestMapping(value="/queryStudent/{id}"),  @PathVariable("id") Long id。

3、HiddenHttpMethodFilter:這是一個Filter,瀏覽器form表單只能提交GET或者POST請求,通過Spring3.0增加的這個過濾器,可以將請求轉換爲標準的任意類型的請求用法:

<!--配置好過濾器後,在form表單中增加一個名爲_method的隱藏input,設置好value-->
<form method="PSOT">
    <input type="hidden" name="_method" value="DELETE">
</form>

4、@RequestParam和@RequestHeader

SpringMVC會將http請求中對應的數據綁定在註解的方法入參中,有兩個參數,value和required,表示綁定的參數名和是否必須,例如:

public void queryStu(@RequestParam(value="username", required=false) String XXXXX, 
          @RequestParam(required=true) String password){

};

public void queryStu(@RequestHeader("Accept-Encoding") String encoding,     
          @RequestHeader("Keep-Alive") String keepAlive){
};

 PS:SpringMVC會自動給POJO類型的入參根據POJO的屬性名自動注入值,並且封裝類型還支持級聯屬性。

 5、@CookieValue

將請求參數中的cookie值設置到對應的入參中,例:

public void queryStu(@CookieValue(value = "sessionId", required = true) String sessionId, 
          @RequestParam("age") Integer age) {
};

6、 MVC的handler還可以自動注入ServletAPI類型的對象作爲入參,主要有以下幾種:

  • HttpServletRequest
  • HttpServletResponse
  • HttpSesson
  •  java.security.Principal
  • locale
  • InputStream
  • OutPutStram
  • Reader
  • Writer

7、當入參爲Map或Model時,SpringMVC會自動將請求數據封裝進這個Map或Model中;

8、@SessionAttributes: 將模型數據中的某個屬性設置到HttpSession中,以便在多個請求中共享這個屬性,例:
     @SessionAttributes(types=User.class) : 將隱藏模式中所有類型爲User.class的屬性添加到session中。
     @SessionAttributes(value={"value1","value2"}, types={User.class, DepartMent.class})

9、@ModelAttribute:

可以作用在方法上或者參數上,作用在方法上時,會在執行請求目標方法前先調用ModelAttribute註解的方法,我們經常用這種方式設置一些默認屬性;作用在參數上時,可以從模型數據中取出對應的參數,SpringMVC會自動注入屬性名相同的參數,所以ModelAttribute一般用來取出pojo對象。

10、SpringMVC的執行流程:

SpringMVC的執行流程

具體步驟解釋:

             ● 消息轉換: 將請求的消息,如json、xml等數據轉換成一個對象,將對象轉換爲指定的響應信息;

             ● 數據轉換:對請求消息進行數據轉換,如String轉換成Integer、Double等;

             ● 數據格式化:對請求的消息進行數據格式化,如將字符串轉換爲格式化數字或格式化日期等;

             ● 數據驗證:驗證數據的有效性如長度、格式等,驗證結果存儲到BindingResult或Error中。

  1. 用戶向服務器發送請求,請求被SpringMVC的前端控制器DispatcherServlet截獲;
  2. DispatcherServlet對請求的URL(統一資源定位符)進行解析,得到URI(請求資源標識符),然後根據該URI,調用HandlerMapping獲得該Handler配置的所有相關的對象,包括Handler對象以及Handler對象對應的攔截器,這些對象都會被封裝到一個HandlerExecutionChain對象當中返回;
  3. DispatcherServlet根據獲得的Handler,選擇一個合適的HandlerAdapter。HandlerAdapter的設計符合面向對象中的單一職責原則,代碼結構清晰,便於維護,最爲重要的是,代碼的可複製性高。HandlerAdapter會被用於處理多種Handler,調用Handler實際處理請求的方法;
  4. 提取請求中的模型數據,開始執行Handler(Controller),在填充Handler的入參過程中,根據配置,spring將幫助做一些額外的工作:
  5. Handler執行完成後,會向DispatcherServlet返回一個ModelAndView對象,對於那些返回的是String,Map,View或ModelMap的方法,SpringMVC也會在內部將它包裝成一個ModelAndView對象,ModelAndView中應該包含視圖名或視圖模型;
  6. DiapatcherServlet根據返回的ModelAndView對象,Dispachter選擇一個合適的ViewResolver(視圖解析器);
  7. ViewResolver結合Model和View來渲染視圖;
  8. DispatcherServlet將視圖渲染結果返回給客戶端。

11、重定向和轉發,在返回的邏輯視圖名中返回下面的值即可:

redirect:success.jsp :重定向到success.jsp頁面
           forward: success.jsp : 轉發到success.jsp頁面

12、Spring的表單標籤:

通過SpringMVC的表單標籤可以實現模型數據中的屬性和HTML表單元素想綁定,實現了表單數據更便捷的編輯和表單值的回顯。

        commandName: 取Model中指定對象的屬性;
        mehod: 支持的GET,POST,DELETE, PUT請求方式;
        path: 對象的模型屬性名;
        htmlEscape: 是否對錶單值的HTML特殊字符進行轉換,默認是true;
        cssClass: 表單組件對應的CSS樣式類名;
        cssErrorClass: 表單屬性數據存在錯誤時,採取的css樣式;

<form:form action="formTag/form.do" method="POST" commandName="user">
    <form:input path="userName" htmlEscape="true" cssClass="inputCss" 
        cssErrorClass="errorCss"/>  
</form:form>

13、SpringMVC處理靜態資源:

    優雅的Restful風格的資源URL不希望帶上.html, .jsp等後綴名,若DispacherServlet的請求映射配置爲/,則會攔截所有請求,包括對靜態資源的請求,SpringMVC會將它當成一個普通的請求進行處理,當找不到處理器將會導致錯誤。

解決方案:

    1. 在SpringMVC的配置文件中增加一個<mvc-default-servlet-handler/>會所有請求進入Dispacheter的之前進行攔截,如果發現是沒有經過映射的請求,就會交給web服務器默認的servlet進行處理,注意:一般web服務(Tomcat,Jeety)的默認的servlet的name都是default,如果servletName不是default,則要通過<mvc:default-servlet-name>進行指定;
    2. SpringMVC3.0.4以後提供的靜態資源映射 <mvc:resources mapping="/images/**" location="/images/" />;
    3. DispacherServlet攔截.do請求。

14、SpringMVC的數據綁定流程:

  1. SpringMVC主框架將ServletRequest對象和目標方法的入參實例傳遞給WebDataBinderFactory對象,用來創建DataBinder對象;
  2. DataBinder調用註冊在SpringMVC上下文中的ConversionService對象進行數據類型轉換,數據格式化工作,將Servlet中的請求信息填充的入參對象中;
  3. 調用Validator組件對已綁定了請求數據源的入參對象進行數據合法性校驗,並最終生成數據綁定結果BindingData對象;
  4. SpringMVC抽取BindingResult中的入參對象和校驗錯誤對象,將它們賦給處理方法的響應入參。

15、@DateTimeFormat,@NumberFormat:

    加上對象的屬性上,可以給對象的屬性加上默認的格式化規則。

16、@Valid:

    加上方法的對象入參,表示該入參需要進行數據校驗,需要配合下面的JSR 303屬性校驗規則使用。

17、JSR 303是JAVA爲JAVABEAN的數據合法性提供校驗的框架,主要的校驗規則有:

  1. @Null             被註釋的屬性必須爲null;
  2. @NotNull        被註釋的屬性不允許爲null;
  3. @AssertTrue     被註釋的屬性必須爲true;
  4. @AssertFalse     被註釋的屬性必須爲false;
  5. @Min(value)        被註釋的屬性必須是一個數字,並且大於指定的值;
  6. @Max(value)     被註釋的屬性必須是一個數字,並且小於指定值;
  7. @DecimalMin(val) 被註釋的屬性必須是一個數字,並且大於等於指定的值;
  8. @DecimalMax(val) 被註釋的屬性必須是一個數字,並且小於等於指定的值;
  9. @Size(min, max)    被註釋的屬性值必須在min-max之間;
  10. @Digits(5,0.2) 被註釋的屬性必須爲數字,並且誤差在可接受的範圍內;
  11. @Past             被註釋的屬性必須是一個過去的日期;
  12. @Future            被註釋的屬性必須是一個未來的日期;
  13. @Parttern(value)被註釋的屬性必須滿足指定的正則表達式;
  14. @Email 被註釋的屬性必須是一個電子郵箱;
  15. @Length 備註的字符串長度必須在指定的範圍內;
  16. @NotEmpty 被註釋的字符串必須非空;
  17. @Range    被註釋的屬性必須在合適的範圍內。

18、文件上傳,MultipartResolver:

    SpringMVC默認不支持文件上傳,如果要使用,則需要配置CommonsMultipartResolver,因爲CommonMultipartResolver使用的是jakarta Commons FileUpload技術,所以需要添加jakarta Commons FileUpload和jakarta Commons IO的依賴。

19、自定義攔截器,SpringMVC自定義的攔截器必須實現HandlerInterceptor接口:

1.preHandle(): 這個方法在業務處理器處理請求之前被調用,在該方法中對request進行處理,如果繼續執行返回true, 否則返回false;
2.postHandle(): 這個方法在業務處理器處理完請求之後,DispacherServlet向客戶端返回響應之前被調用。
3.afterComletion(): 在dispacherServlet完全處理完請求之後被調用,一般在這個方法中進行一些資源清理工作;
<mvc:interceptors>
    <!--攔截所有資源-->
    <bean class="com.fcbox.springmvc.interceptors.HelloInterceptor"></bean>
		<!--攔截指定資源-->
		<mvc:interceptor>
			<mvc:mapping path="wechatController"/>
			<bean class="com.fcbox.springmvc.interceptor.HellowInteceptor2"></bean>
			</mapping>
		</mvc:interceptor>
	<bean class="org.springframework.web.servlet.i18n.localeChangeInterceptor"></bean>
</mvc:interceptor>

20、 SpringMVC的異常處理:

    SpringMVC通過HandlerExceptionResolver處理異常,包裹Handler映射,數據綁定以及目標方法執行時發生的異常。

21、SpringMVC和Struts2的對比:

  • SpringMVC的入口是Servlet,而Struts2的入口是Filter;
  • SpringMVC是基於方法的,Struts2是基於Action的,每次都會實例化一個Action;
  • SpringMVC更加簡潔高效,開發效率比較高;
  • Struts2使用的OGNL表達式使頁面的開發效率比較高。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章