Spring MVC 3 -- annotation 配置

原文

Web.xml

<servlet>
    <servlet-name>mvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!-- 默認查找mvc-servlet.xml -->
    <init-param>
     <param-name>contextConfigLocation</param-name>
     <param-value>classpath:/spring/*.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
   <servlet-name>mvc</servlet-name>
   <url-pattern>*.do</url-pattern>
  </servlet-mapping>


spring/servlet.xml

<mvc:annotation-driven/>
<context:component-scan base-package="com.los.mvc.controller"/>
<!-- Spring MVC 3.0 引入restFul風格 (表述性狀態轉移)-->
<!-- ViewResolver & View 映射關係-->
<!-- InternalResourceViewResolver 基於resource對jsp/jstl的支持 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
 <property name="prefix" value="/WEB-INF/views/"/>
 <property name="suffix" value=".jsp"/>
 <!-- InternalResourceViewResolver viewClass默認值就是JstlView -->
 <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property>
 </bean>
<!-- 攔截器配置 -->
 <mvc:interceptors>
 <mvc:interceptor>
  <mvc:mapping path="/user/*"/>
  <bean class="com.los.mvc.interceptor.MyInterceptor"></bean>
 </mvc:interceptor>
</mvc:interceptors>
<!-- 國際化配置 -->
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
 <!-- <property name="basename" value="message"></property> -->
 <property name="basenames">
  <list><value>message</value></list>
 </property>
</bean>


Controller class

import java.text.SimpleDateFormat; import java.util.Date;

import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;

import org.springframework.beans.propertyeditors.CustomDateEditor; import org.springframework.stereotype.Controller; import org.springframework.web.bind.ServletRequestDataBinder; import org.springframework.web.bind.annotation.InitBinder; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod;

@RequestMapping(value = "/test") @Controller public class TestController {    @RequestMapping(value = "/start/{name}/{age}")  public String start(@PathVariable(value = "name") String name,    @PathVariable(value = "age") String age,    HttpServletRequest request, HttpServletResponse response) {   System.out.println(name + " : " + age);   return "start";  }

 @RequestMapping(value = "/domethod", method = RequestMethod.GET)  public String doMethod1(HttpServletRequest request,    HttpServletResponse response) {   System.out.println("Get ...");   return "doGet";  }

 @InitBinder()  public void initBinder(HttpServletRequest request,    ServletRequestDataBinder binder) throws Exception {   binder.registerCustomEditor(Date.class, new CustomDateEditor(     new SimpleDateFormat("yyyy-MM-dd"), true));  } }

Interceptor class

 

import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView;

public class MyInterceptor implements HandlerInterceptor {

 public void afterCompletion(HttpServletRequest arg0,    HttpServletResponse arg1, Object arg2, Exception arg3)    throws Exception {   // TODO Auto-generated method stub   System.out.println("MyInterceptor afterCompletion()...");  }

 public void postHandle(HttpServletRequest request,    HttpServletResponse response, Object handler, ModelAndView mav)    throws Exception {   // TODO Auto-generated method stub   System.out.println("MyInterceptor postHandle()...");  }

 public boolean preHandle(HttpServletRequest request,    HttpServletResponse response, Object handler) throws Exception {   // TODO Auto-generated method stub   System.out.println("MyInterceptor preHandle()...");   return true;  } }

Spring MVC 3.0 引入restFul風格 (表述性狀態轉移)
(1.將請求的參數作爲url的一部分來存在,test.do?name=zhangsan ==> test/zhangsan.do,根據不同的參數做不同的請求)
(2.通過@PathVariable url temp模版來實現 註釋中加入@RequestMapping(value = "/start/{name}") 
方法中(參數里加入@PathVariable("name") String name)將模版的一部分注入到參數中)

@RequestMapping(value = "/test")
@Controller
class{
 @RequestMapping(value = "/start/{name}")
 method(@PathVariable String name ,request,response)
}


 

@RequestMapping可以根據不同的請求方法映射到不同的方法
eg:@RequestMapping(value = "/domethod", method = RequestMethod.GET)只有請求方法是get的時候才能請求到這方法.
@InitBinder()
public void initBinder(HttpServletRequest request,
  ServletRequestDataBinder binder) throws Exception {
 binder.registerCustomEditor(Date.class
  ,new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), true));
 }


 

註解mvc的請求參數設置沒有個數先後限制:
(1)沒有任何參數()
(2)@PathVariable 任何類型
(3)request,response,session
(4)@RequestParam request參數
(5)@CookieValue CookieName
(6)@RequestHeader 請求頭 @RequestHeader("user-Agent")獲取瀏覽器 
(7)PrintWriter out 直接獲取response writer 對象
(8)Map Model對象 在參數裏定義,然後在方法裏注入對象,再自動返回. 
(9)command對象,在參數裏定義user對象 在匹配的情況下會被自動封裝.
(10)BindingResult result,在command對象值綁定值注入的情況下判斷是否有綁定錯誤.
註解mvc的返回值參數:
* 1.void out.print輸出情況下用void,如無out則會生成隱含的viewName是按請求路徑解析出來的 
* ${appName}/test/xxx.do --> 視圖名 test/xxx --->/web-inf/views/test/xxx.jsp 
* 2.String viewName 同樣能返回model.
* 3.任意類型.eg:User同樣放入Model中.key默認爲user 類名.視圖按void方式默認解析出視圖.
* 4.List<user>類型, 也會加入Model中.key默認爲userList.
* 5.Map類型 Model(Spring中有Model類)
* 6.ModelAndView 標準的.

ViewResolver & View
1.Redirect 重定向視圖  
防止刷新重複提交.servlet中有request.forward 方法.帶着參數從請求A經過server轉到請求B.則不會告訴Browser Client請求變化.response.redirect 方法.從請求A -->server -->Browser Client 重定向到 B
spring mvc中返回("redirect:/user_list") 這是個重定向的視圖.
2.JSTLView
3.ExcelView
4.PDFView
5.JsperReport
6.以及其他自定義view

攔截器,視圖的國際化,驗證
1.攔截器(Interceptor):在請求到達之前或者之後加入的提前的處理過程,eg:全局的日誌.權限管理.
<mvc:interceptors>
  <mvc:interceptor>
   <mvc:mapping path="/user/*"/>
   <bean class="com.los.mvc.interceptor.MyInterceptor"></bean>
  </mvc:interceptor>
 </mvc:interceptors>


public class MyInterceptor implements HandlerInterceptor

preHandle
攔截的動作
handler爲下一個過程的處理對象.可能是下一個攔截器對象 或者是 controller
返回true 繼續進行,返回false 則拒絕轉到其他視圖.
postHandle
控制器已經執行完,生成視圖之前可以做的動作.逆向的攔截器.eg:向模型中加入公共成員.
afterCompletion
釋放資源.eg:關閉對象.
2.國際化 
jsp頁面引入spring標籤,<%@ taglib uri="http://www.springframework.org/tags" prefix="spring" %> 
<spring:message code="welcome"></spring:message> 去資源文件裏找welcome對應不同的語種有不同的顯示方式.
配置文件中設置:
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
  <property name="basenames"
   <list>
    <value>message</value>
   </list>
  </property>
 </bean>


 

name="basenames" 多個資源文件 / value="message" "message"爲資源文件的名稱.

3.驗證
兩種做法,1.前端js驗證 2.後端驗證.
後臺驗證根據JSR3.0.3標準.Hibernate Validate 4.1 是JSR303標準的實現.
在controller方法內使用@Valid註解,能將當前傳入的對象進行驗證.
如果錯誤的話結果會放在BindingResult對象裏
驗證需要在User Bean里加註解 eg :@notEmpty
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <!-- JSTL標籤 -->
<%@ taglib uri="http://www.springframework.org/tags" prefix="spring" %> <!-- Spring標籤 -->



 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章