原文
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标签 -->