SpringMVC

来源:互联网 发布:网络打假工作总结 编辑:程序博客网 时间:2024/04/29 21:20

转自  http://zhanghouyin-hotmail-com.iteye.com/blog/1101935



web.xml

Xml代码  收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4"  
  3.          xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">  
  4.       
  5.                
  6.     <!-- Spring ApplicationContext配置文件的路径  
  7.       此参数用于后面的Spring-Context loader -->  
  8.     <context-param>  
  9.         <param-name>contextConfigLocation</param-name>  
  10.         <param-value>classpath*:spring/*.xml</param-value>  
  11.     </context-param>  
  12.   
  13.     <!--Spring ApplicationContext 载入 -->  
  14.     <listener>  
  15.         <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  
  16.     </listener>  
  17.     <servlet>   
  18.         <servlet-name>springmvc</servlet-name>  
  19.         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
  20.         <load-on-startup>1</load-on-startup>  
  21.     </servlet>  
  22.     <servlet-mapping>  
  23.         <servlet-name>springmvc</servlet-name>  
  24.         <url-pattern>*.do</url-pattern>  
  25.     </servlet-mapping>  
  26. </web-app>  


springmvc-servlet.xml
Xml代码  收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2.   
  3. <!--   
  4.     修改说明:  
  5.     1.修改<context:component-scan以确定要加载的controller,默认为com.**.controller  
  6.     2.修改class=ControllerClassNameHandlerMapping节点的pathPrefix以确定要生成的前缀  
  7.  -->  
  8. <beans xmlns="http://www.springframework.org/schema/beans"   
  9.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  10.     xmlns:p="http://www.springframework.org/schema/p"   
  11.     xmlns:context="http://www.springframework.org/schema/context"  
  12.     xsi:schemaLocation="  
  13.         http://www.springframework.org/schema/beans   
  14.         http://www.springframework.org/schema/beans/spring-beans-2.5.xsd  
  15.         http://www.springframework.org/schema/context   
  16.         http://www.springframework.org/schema/context/spring-context-2.5.xsd"  
  17.     >  
  18.     <!--  
  19.     <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>       
  20.     <context:component-scan base-package="com.**.controller"/>  
  21.     <bean class="cn.org.rapid_framework.spring.web.servlet.mvc.support.ControllerClassNameHandlerMapping" >  
  22.     </bean>  
  23.     <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">  
  24.         <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>  
  25.         <property name="prefix" value="/pages"/>  
  26.         <property name="suffix" value=".jsp"></property>  
  27.     </bean>  
  28. -->  
  29.     <!-- it's ok;-->  
  30.     <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">  
  31.         <property name="mappings">  
  32.             <props>  
  33.                 <prop key="test.do">testController</prop>  
  34.                 <prop key="testExtends.do">testExtendsController</prop>  
  35.                 <prop key="login.do">loginController</prop>  
  36.                 <prop key="login2.do">login2Controller</prop>  
  37.             </props>  
  38.         </property>  
  39.     </bean>  
  40.     <!-- 直接直向页面/WEB-INF/login.jsp -->  
  41.     <bean id="loginController" class="org.springframework.web.servlet.mvc.ParameterizableViewController">  
  42.         <property name="viewName" value="login"></property>  
  43.     </bean>  
  44.     <!-- login2Controller会指向 prop key='login2.do'里的login2页面+前后缀 -->  
  45.     <bean id="login2Controller" class="org.springframework.web.servlet.mvc.UrlFilenameViewController">  
  46.     </bean>  
  47.     <bean id="testController" class="com.company.project.controller.TestController"></bean>  
  48.     <bean id="testExtendsController" class="com.company.project.controller.TestExtendsController"></bean>  
  49.     <bean class="org.springframework.web.servlet.view.UrlBasedViewResolver">  
  50.         <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property>  
  51.         <property name="prefix" value="/WEB-INF/"></property>  
  52.         <property name="suffix" value=".jsp"></property>  
  53.     </bean>  
  54. </beans>  


能封装表单参数的 AbstractCommandController,CommondController、 FormController

web-inf/add_dept.jsp
Html代码  收藏代码
  1. <%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>  
  2. <%  
  3. String path = request.getContextPath();  
  4. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";  
  5. %>  
  6. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
  7. <html>  
  8.   <body>  
  9.     <form action="" method="post">  
  10.         name:<input type="text" name="name"><br>  
  11.         createDate:<input type="text" name="createDate"><br>  
  12.         <input type="submit" value="add">  
  13.     </form>  
  14.   </body>  
  15. </html>  

springmvc-servlet.xml
Xml代码  收藏代码
  1. <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">  
  2.         <property name="mappings">  
  3.             <props>  
  4.                 <prop key="add_dept.do">addDeptController</prop>  
  5.             </props>  
  6.         </property>  
  7.     </bean>  
  8.     <bean id="addDeptController" class="com.company.project.controller.DeptController">  
  9.         <property name="commandClass" value="com.company.project.model.Department"></property>  
  10.     </bean>  
  11.   
  12.     <bean class="org.springframework.web.servlet.view.UrlBasedViewResolver">  
  13.         <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property>  
  14.         <property name="prefix" value="/WEB-INF/"></property>  
  15.         <property name="suffix" value=".jsp"></property>  
  16.     </bean>  

会正常转换 整型及字符串,如果输入的不是一个整数,就会为0;
spring mvc 默认提供了一些属性编辑器:int,float,double,long,string,class,url

DeptController
Java代码  收藏代码
  1. package com.company.project.controller;  
  2. import javax.servlet.http.HttpServletRequest;  
  3. import javax.servlet.http.HttpServletResponse;  
  4. import org.springframework.validation.BindException;  
  5. import org.springframework.web.servlet.ModelAndView;  
  6. import org.springframework.web.servlet.mvc.AbstractCommandController;  
  7. import com.company.project.model.Department;  
  8. public class DeptController extends AbstractCommandController{  
  9.     //数据绑定 到model里。  
  10.     @Override  
  11.     protected ModelAndView handle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, BindException arg3) throws Exception {  
  12.         Department dept = (Department)arg2;  
  13.         return null;  
  14.     }  
  15. }  

自定义属性编辑器:
Java代码  收藏代码
  1. package com.company.project.controller;  
  2. import java.text.SimpleDateFormat;  
  3. import java.util.Date;  
  4.   
  5. import javax.servlet.http.HttpServletRequest;  
  6. import javax.servlet.http.HttpServletResponse;  
  7.   
  8. import org.springframework.beans.propertyeditors.CustomDateEditor;  
  9. import org.springframework.validation.BindException;  
  10. import org.springframework.web.bind.ServletRequestDataBinder;  
  11. import org.springframework.web.servlet.ModelAndView;  
  12. import org.springframework.web.servlet.mvc.AbstractCommandController;  
  13.   
  14. import com.company.project.MyConverter;  
  15. import com.company.project.model.Department;  
  16. public class DeptController extends AbstractCommandController{  
  17.     //数据绑定 到model里。  
  18.     @Override  
  19.     protected ModelAndView handle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, BindException arg3) throws Exception {  
  20.         Department dept = (Department)arg2;  
  21.         return null;  
  22.     }  
  23.   
  24.     @Override  
  25.     protected void initBinder(HttpServletRequest arg0, ServletRequestDataBinder binder) throws Exception {  
  26.         //这是一种做法  
  27.         //binder.registerCustomEditor(Date.class, new MyConverter());  
  28.         // 日期类型提供了半成品的一个属性编辑器 true:表示可以不输入这个日期,也就是说这个日期可以为空  
  29.         binder.registerCustomEditor(Date.classnew CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"),true));  
  30.     }  
  31. }  

MultiActionController
Java代码  收藏代码
  1. package com.company.project.controller;  
  2.   
  3. import java.util.HashMap;  
  4. import java.util.Map;  
  5.   
  6. import javax.servlet.http.HttpServletRequest;  
  7. import javax.servlet.http.HttpServletResponse;  
  8. import javax.servlet.http.HttpSession;  
  9.   
  10. import org.springframework.web.servlet.ModelAndView;  
  11. import org.springframework.web.servlet.mvc.multiaction.MultiActionController;  
  12.   
  13. import com.company.project.model.Department;  
  14.   
  15. public class MultController extends MultiActionController{  
  16.     //方法必须要有request,response,可选参数session,Model  
  17.     public ModelAndView toAdd(HttpServletRequest request,HttpServletResponse response){  
  18.         //ModelAndView mav = new ModelAndView("add_dept",model);  
  19.         ModelAndView mav = new ModelAndView();  
  20.         Map<String, Object> depts = new HashMap<String, Object>();  
  21.         //设置视图名称  
  22.         mav.setViewName("add_dept");  
  23.         //设置模型  
  24.         mav.addAllObjects(depts);  
  25.         return mav;  
  26.     }  
  27.       
  28.     public ModelAndView toList(HttpServletRequest request,HttpServletResponse response,HttpSession session,Department dept){  
  29.         System.out.println(dept);  
  30.         //return "success";  
  31.         return new ModelAndView("success");  
  32.     }  
  33.     public Map xxx(HttpServletRequest request,HttpServletResponse response){  
  34.           
  35.     }  
  36. }  

Xml代码  收藏代码
  1. <bean  
  2.         class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">  
  3.         <property name="mappings">  
  4.             <props>  
  5.                 <prop key="add_dept.do">addDeptController</prop>  
  6.                 <prop key="list_dept.do">addDeptController</prop>  
  7.             </props>  
  8.         </property>  
  9.     </bean>  
  10.     <!-- 只有MultiActionController  -->  
  11.     <bean id="addDeptController"  
  12.         class="com.company.project.controller.MultController">  
  13.         <property name="commandClass" value="addDept.do"></property>  
  14.         <!-- 方法名解析器 -->  
  15.         <property name="methodNameResolver">  
  16.             <!-- 按路径名解析,如prop key=list_dept.do,会执行list_dept方法,所以请求需跟方法名一致   
  17.             <bean class="org.springframework.web.servlet.mvc.multiaction.InternalPathMethodNameResolver"></bean>  
  18.             -->  
  19.             <!-- 按参数解析 -->  
  20.             <bean class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">  
  21.                 <!-- 参数名需要有fun,然后根据fun的值,执行该方法,如:?fun=to_add,会执行to_add方法 -->  
  22.                 <property name="paramName" value="fun"></property>  
  23.             </bean>  
  24.         </property>  
  25.     </bean>  
  26.     <bean  
  27.         class="org.springframework.web.servlet.view.UrlBasedViewResolver">  
  28.         <property name="viewClass"  
  29.             value="org.springframework.web.servlet.view.JstlView">  
  30.         </property>  
  31.         <property name="prefix" value="/WEB-INF/"></property>  
  32.         <property name="suffix" value=".jsp"></property>  
  33.     </bean>  

简化URL映射关系
HanderMapping:

ControllerClassNameHanderMapping:按类名映射
Xml代码  收藏代码
  1. <!-- 如果访问的URL为dept.do,会去找名称为DeptController类,id,name不重要  
  2.         如果是MultController,如果是按路径名(InternalPathMethodNameResolver)解析器,可以用  
  3.         mult/to_add.do:会执行MultController里的to_add方法  
  4.     -->  
  5.     <bean  
  6.         class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping">  
  7.     </bean>  
  8.     <bean id="xxx" class="test.DeptController"></bean>  
  9.     <!-- 只有MultiActionController  -->  
  10.     <bean id="addDeptController"  
  11.         class="com.company.project.controller.MultController">  
  12.         <property name="commandClass" value="addDept.do"></property>  
  13.         <!-- 方法名解析器 -->  
  14.         <property name="methodNameResolver">  
  15.             <!-- 按路径名解析,如prop key=list_dept.do,会执行list_dept方法,所以请求需跟方法名一致 -->  
  16.             <bean class="org.springframework.web.servlet.mvc.multiaction.InternalPathMethodNameResolver"></bean>              
  17.             <!-- 按参数解析   
  18.             <bean class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">  
  19.                  参数名需要有fun,然后根据fun的值,执行该方法,如:?fun=to_add,会执行to_add方法   
  20.                 <property name="paramName" value="fun"></property>  
  21.             </bean>  
  22.             -->  
  23.         </property>  
  24.     </bean>  
  25.     <bean  
  26.         class="org.springframework.web.servlet.view.UrlBasedViewResolver">  
  27.         <property name="viewClass"  
  28.             value="org.springframework.web.servlet.view.JstlView">  
  29.         </property>  
  30.         <property name="prefix" value="/WEB-INF/"></property>  
  31.         <property name="suffix" value=".jsp"></property>  
  32.     </bean>  

Xml代码  收藏代码
  1. <!--BeanNameUrlHandlerMapping:会根据bean的url进行拦截  这种对MultController没办法使用-->  
  2. <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">  
  3. </bean>  
  4. <bean name="/test.do" class="com.company.project.controller.TestController"></bean>  




annotation注解方式实现

controller类:
Java代码  收藏代码
  1. package test.controller;  
  2.   
  3. import org.springframework.stereotype.Controller;  
  4. import org.springframework.web.bind.annotation.RequestMapping;  
  5.   
  6. @Controller  
  7. public class TestController {  
  8.     @RequestMapping("/start")  
  9.     public String start(){  
  10.         return "start";  
  11.     }  
  12. }  

web.xml:
Xml代码  收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app version="2.4"   
  3.     xmlns="http://java.sun.com/xml/ns/j2ee"   
  4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
  5.     xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee   
  6.     http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">  
  7.   <servlet>  
  8.         <servlet-name>springmvc</servlet-name>  
  9.         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
  10.         <!-- Spring ApplicationContext配置文件的路径,可使用通配符,多个路径用1,号分隔  
  11.       此参数用于后面的Spring-Context loader -->  
  12.         <init-param>  
  13.             <param-name>contextConfigLocation</param-name>  
  14.             <param-value>classpath*:spring/*.xml</param-value>  
  15.             <!--  手动指定配置文件位置及名称  
  16.             <param-value>/WEB-INF/classes/springmvc-servlet.xml</param-value>  
  17.             <param-value>/WEB-INF/classes/*.xml</param-value>  
  18.             在spring包下的所有xml文件  
  19.             <param-value>/WEB-INF/classes/spring/*.xml</param-value>  
  20.             <param-value>classpath*:spring/*.xml</param-value>  
  21.             -->  
  22.         </init-param>  
  23.         <load-on-startup>1</load-on-startup>  
  24.     </servlet>  
  25.     <servlet-mapping>  
  26.         <servlet-name>springmvc</servlet-name>  
  27.         <url-pattern>*.do</url-pattern>  
  28.     </servlet-mapping>  
  29. </web-app>  

springmvc-servlet.xml
Xml代码  收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.     xmlns:p="http://www.springframework.org/schema/p"  
  5.     xmlns:mvc="http://www.springframework.org/schema/mvc"  
  6.     xmlns:context="http://www.springframework.org/schema/context"  
  7.     xsi:schemaLocation="  
  8.         http://www.springframework.org/schema/beans   
  9.         http://www.springframework.org/schema/mvc  
  10.         http://www.springframework.org/schema/beans/spring-beans-2.5.xsd  
  11.         http://www.springframework.org/schema/context  
  12.         http://www.springframework.org/schema/context/spring-context-2.5.xsd">  
  13.      <!-- 基于注解的方式 -->  
  14.      <context:component-scan base-package="test.controller"/>  
  15.      <!-- InternalResourceViewResolver:是在基于url的基础之上,加入了JSP,JSTL的视图解析器 -->  
  16.      <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">  
  17.         <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>  
  18.         <property name="prefix" value="/pages"/>  
  19.         <property name="suffix" value=".jsp"></property>  
  20.      </bean>  
  21. </beans>       

访问:http://localhost:8080/springmvc/start.do
会直接跳转到/pages/start.jsp

@RequestMapping:可以修饰类,及类里面的方法
如果在类级别定义了@RequestMapping,相当于定义了一个相对路径
如下:
@Controller
@RequestMapping("/test")
public class TestController {
@RequestMapping("/start")
public String start(){
return "start";
}
}

如果需要访问start方法,则应该是 localhost:8080/springmvc/test/start.do

如果没有类级别的@RequestMapping,则访问方法start方法,则应该是localhost:8080/springmvc/start.do, /:相当于根路径,处理求的方法必须要有@RequestMapping注解
处理以后请求,资源文件与上面相同,只是controller上不一样

http://localhost:8080/springmvc/start.do?name=zhangsan
Java代码  收藏代码
  1. package test.controller;  
  2.   
  3. import javax.servlet.http.HttpServletRequest;  
  4.   
  5. import org.springframework.stereotype.Controller;  
  6. import org.springframework.web.bind.annotation.RequestMapping;  
  7.   
  8. @Controller  
  9. public class TestController {  
  10.     @RequestMapping("/start")  
  11.     //可以只加一个request,也可以根据需要添加response,session,model等参数  
  12.     public String start(HttpServletRequest request){  
  13.         //传统的处理方法,  
  14.         String name= request.getParameter("name");  
  15.         return "start";  
  16.     }  
  17. }  

spring3.0引入了一种restful风格的模式:基于url参数的形式进行请求,如下:
http://localhost:8080/springmvc/start.do?name=zhangsan
http://localhost:8080/springmvc/start.do?name=lisi

处理形式:restful风格,请求的参数作为url一部分存在
http://localhost:8080/springmvc/start/zhangsan.do
http://localhost:8080/springmvc/start/lisi.do

支持restful风格需要有一个参数PathVariable,定义url模板,指定可变部分:

例子:处理
http://localhost:8080/springmvc/start/zhangsan.do
http://localhost:8080/springmvc/start/lisi.do
配置文件以之前一样,Controller类里:
----------------------------------------------------
Java代码  收藏代码
  1. package test.controller;  
  2.   
  3. import javax.servlet.http.HttpServletRequest;  
  4.   
  5. import org.springframework.stereotype.Controller;  
  6. import org.springframework.web.bind.annotation.PathVariable;  
  7. import org.springframework.web.bind.annotation.RequestMapping;  
  8.   
  9. @Controller  
  10. public class TestController {  
  11.     //{name}:表示可变部分,/start/{name}就是URL模板  
  12.     @RequestMapping("/start/{name}")  
  13.     //可以只加一个request,也可以根据需要添加response,session,model等参数  
  14.     public String start(@PathVariable("name") String name){  
  15.         //@PathVariable String name:路径变量;用于取URL模板里可变部分的值,2个name须一致  
  16.         System.out.println(name);  
  17.         return "start";  
  18.     }  
  19. }  

如果是多个可变参数:
Java代码  收藏代码
  1. @Controller  
  2. public class TestController {  
  3.     @RequestMapping("/start/{name}/{age}")  
  4.     public String start(@PathVariable("name") String name,@PathVariable("age"int nianling){  
  5.         System.out.println(name);  
  6.         System.out.println(nianling);  
  7.         return "start";  
  8.     }  
  9. }  

如URL请求为:
http://localhost:8080/springmvc/start/zhangsan/20.do
===========================================================
@RequestMapping:可以根据不同的请求方法,映射到不同的处理方法,与之前的formcontroller相似,请求方法:post,get
Java代码  收藏代码
  1. package test.controller;  
  2.   
  3. import javax.servlet.http.HttpServletRequest;  
  4.   
  5. import org.springframework.stereotype.Controller;  
  6. import org.springframework.web.bind.annotation.PathVariable;  
  7. import org.springframework.web.bind.annotation.RequestMapping;  
  8. import org.springframework.web.bind.annotation.RequestMethod;  
  9.   
  10. @Controller  
  11. public class TestController {  
  12.     //处理get请求,如直接在地址栏输入 http://localhost:8080/springmvc/start.do  
  13.     @RequestMapping(value="/start",method=RequestMethod.GET)  
  14.     public String start(){  
  15.         return "start_get";  
  16.     }  
  17.     //处理post请求, form以post方式提交,http://localhost:8080/springmvc/start.do  
  18.     @RequestMapping(value="/start",method=RequestMethod.POST)  
  19.     public String startPost(){  
  20.         //跳转到start_post.jsp页面  
  21.         return "start_post";  
  22.     }  
  23. }  

http://localhost:8080/springmvc/test/1986-07-06.do
Java代码  收藏代码
  1. package test.controller;  
  2.   
  3. import java.text.SimpleDateFormat;  
  4. import java.util.Date;  
  5. import javax.servlet.http.HttpServletRequest;  
  6. import org.springframework.beans.factory.config.CustomEditorConfigurer;  
  7. import org.springframework.beans.propertyeditors.CustomDateEditor;  
  8. import org.springframework.stereotype.Controller;  
  9. import org.springframework.web.bind.annotation.InitBinder;  
  10. import org.springframework.web.bind.annotation.PathVariable;  
  11. import org.springframework.web.bind.annotation.RequestMapping;  
  12. import org.springframework.web.bind.annotation.RequestMethod;  
  13. import org.springframework.web.bind.support.WebRequestDataBinder;  
  14. @Controller  
  15. @RequestMapping("/test")  
  16. public class TestController {  
  17.     //如果方法上没指定映射的value,则会映射到类级别/test  
  18.     @RequestMapping(value="{test}",method=RequestMethod.GET)  
  19.     public String startPost(@PathVariable("test") Date test){  
  20.         System.out.println(test);  
  21.         return "success";  
  22.     }  
  23.     @InitBinder  
  24.     //参数可以有request,response,session,webrequestdatabinder(绑定数据)  
  25.     public String initBinder(WebRequestDataBinder binder){  
  26.         //所有日期类型都会进行转换,且不能不空  
  27.         binder.registerCustomEditor(Date.classnew CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"),false));  
  28.     }  
  29. }  

Java代码  收藏代码
  1. @Controller  
  2. @RequestMapping("/test")  
  3. public class TestController {  
  4.     //如果方法上没指定映射的value,则会映射到类级别/test  
  5.     @RequestMapping(value="{test}",method=RequestMethod.GET)  
  6.     public String startPost(@PathVariable("test") Date test){  
  7.         System.out.println(test);  
  8.         return "success";  
  9.     }  
  10.     @InitBinder  
  11.     //参数可以有request,response,session,webrequestdatabinder(绑定数据)  
  12.     public String initBinder(WebRequestDataBinder binder){  
  13.         //所有日期类型都会进行转换,且不能不空  
  14.         binder.registerCustomEditor(Date.classnew CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"),false));  
  15.     }  
  16.     @RequestMapping("/testRequest")  
  17.     public void testRequest(@RequestParam int id,@CookieValue anytype cookieName,@RequestHeader("content-type") anyType abc ){  
  18.         //@RequestParam int id 类型可以是任何类型,参数名必须与请求的参数名一样  
  19.         //@RequestHeader:从请求头里取,@RequestHeader("user-Agent"):浏览器类型  
  20.         //@CookieValue:从cookie里取  
  21.         //http://localhost:8080/springmvc/testRequest.do?id=xxx   
  22.         System.out.println(id);  
  23.     }  
  24. }  

Java代码  收藏代码
  1. @RequestMapping("/testOut")  
  2. public String testOut(PrintWriter out,Map model){  
  3.     //这里的out相当于 response.getWriter();  
  4.     out.println("hello ");  
  5.     //这里的model相当于ModelAndView对象,会直接初始化  
  6.     model.put("key""value");  
  7.     return "viewName";  
  8. }  

自动封装属性
http://localhost:8080/springmvc/testMethod.do?name=xxx&pass=xxx

User类里有name,pass属性:

Controller类里的方法:
Java代码  收藏代码
  1. @RequestMapping("/testMethod")  
  2. public void testMethod(User user){  
  3.     //这里会自动给user的name,pass赋值  
  4.     //User:为commend对象,领域模型  
  5.     System.out.println(user);  
  6. }  
  7.   
  8. @RequestMapping("/testMethod")  
  9. public void testMethod(User user,BindingResult result){  
  10.     //BindingResult:用于验证对象绑定结果,把绑定过程出错的地方用在result里。如果不想处理错误绑定,则不需要指定  
  11.     System.out.println(user);  
  12. }  

基于配置文件的SpringMVC处理请求的方法定义总结:
public (ModelAndView | Map | String | void) actionName(HttpServletRequest request, HttpServletResponse response, [,HttpSession] [,AnyObject]);

参数类型:
1.HttpServletRequest(必须有)
2. HttpServletRespons(必须有)
3。HttpSession(可选)
4.AnyObject(可选)
备注:如果object与session都有,则session应为第三个参数

返回值类型:
1,ModelAndView
2.Map
3.String
4.void

基于注解的MVC,能够处理请求的方法定义总结:

参数类型:对数量及顺序是没有要求的
1,可以没有();
2,可以是HttpServletRequest
3,可以是HttpServletResponse
4,可以是HttpSession
5,可以是路径变量@PathVariable
6,可以是@RequestParam
7,可以是@CookieValue
8,可以是@RequestHeader
9,可以是PrintWriter
10,可以是Map model
11,可以是领域模型对象

备注:HttpSessiond需要有一个前提条件,那就是当前请求的session可用:即在这之前session已经被初始化:也就是说在这之前调用了request.getSession()或者session.setAttribute(),直接进入jsp页面,也会初始化session

返回值类型:
1,ModelAndView
2.Map
3.String:代表了viewName,model也会自动返回
4.void:一般使用out方法输出之后就用void
5.AnyType:返回任意类型的对象
6.List
Java代码  收藏代码
  1. @RequestMapping("/xxx")  
  2. public void testVoid(){  
  3.     //如果没有使用out对象,则会隐含默认生成一个viewName--:是按请求路径解析出来的  
  4.     //如:请求路径为:http://localhost:8080/springmvc/test/xxx.do,则生成的视图名为test/xxx  
  5.     // /WEB-INF/page/test/xxx.jsp  
  6.     System.out.println("...");  
  7. }  
  8.   
  9. //返回任意对象  
  10.   
  11. @RequestMapping("/xxx")  
  12. public User test(){//相当于model里添加了一个 model.put("key","value"),key:为默认类名(user),value为返回的对象  
  13.     return null;  
  14.     //视图名与void时一样:则会隐含默认生成一个viewName--:是按请求路径解析出来的  
  15.     //如:请求路径为:http://localhost:8080/springmvc/test/xxx.do,则生成的视图名为test/xxx  
  16.     // /WEB-INF/page/test/xxx.jsp  
  17. }  
  18.   
  19. 返回List  
  20.   
  21. @RequestMapping("/xxx")  
  22. public List<User> query(){  
  23.     return null;  
  24. //list也会加入到model里,默认key是实际成员的名+List如:model("userList",user).      
  25. }  
  26. 可以使用EL表达式取里面的值:${userList},也可以request.getAttribute("userList")  
  27. ##############annotation注解方式实现 结束###################  

Spring MVC  常用 ViewResolver & View
@、 InternalResourceViewResolver、 UrlBasedViewResolver
@、Redirect 重定向视图 (redirect:)
@、XmlViewResovler
@、视图链
@、JstlView, ExcelView及自定义view  (JsperReport, Pdf, Excel)


重定向视图:
防止重复提交,可以使用重定向

@RequestMapping(method=RequestMethod.POST)
public String addUser(User user){
return "redirect:/add_success";
}




#######拦截器,视图国际化,验证############################
拦截器:inteceptor
全局日志,权限管理

1.定义拦截器:
Java代码  收藏代码
  1. package test.web;  
  2.   
  3. import javax.servlet.http.HttpServletRequest;  
  4. import javax.servlet.http.HttpServletResponse;  
  5.   
  6. import org.springframework.web.servlet.HandlerInterceptor;  
  7. import org.springframework.web.servlet.ModelAndView;  
  8. import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;  
  9.   
  10. public class MyInteceptor implements HandlerInterceptor{  
  11.   
  12.     public void afterCompletion(HttpServletRequest arg0,  
  13.             HttpServletResponse arg1, Object arg2, Exception arg3)  
  14.             throws Exception {  
  15.           
  16.     }  
  17.     //控制器已经执行完,生成视图之前可以做的操作,通常是向模型中加入一些公共成员  
  18.     public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,  
  19.             Object arg2, ModelAndView arg3) throws Exception {  
  20.     }  
  21.   
  22.     public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1,  
  23.             Object handler) throws Exception {  
  24.         //handler:指的是下一个对象的引用,如果是有两个拦截器,这就是指第二个拦截器对象,最后一个就是Controller  
  25.         return false;  
  26.         //return true:表示继续执行,false:表示直接中断,不会再执行之后的操作  
  27.     }  
  28. }  

springmvc-servlet.xml
Xml代码  收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.     xmlns:p="http://www.springframework.org/schema/p"  
  5.     xmlns:mvc="http://www.springframework.org/schema/mvc"  
  6.     xmlns:context="http://www.springframework.org/schema/context"  
  7.     xsi:schemaLocation="  
  8.         http://www.springframework.org/schema/beans   
  9.         http://www.springframework.org/schema/mvc  
  10.         http://www.springframework.org/schema/beans/spring-beans-2.5.xsd  
  11.         http://www.springframework.org/schema/context  
  12.         http://www.springframework.org/schema/context/spring-context-2.5.xsd">  
  13.      <!-- 基于注解的方式 -->  
  14.      <context:component-scan base-package="test.controller"/>  
  15.      <!-- InternalResourceViewResolver:是在基于url的基础之上,加入了JSP,JSTL的视图解析器 -->  
  16.      <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">  
  17.         <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>  
  18.         <property name="prefix" value="/pages"/>  
  19.         <property name="suffix" value=".jsp"></property>  
  20.      </bean>  
  21.      <mvc:inteceptors>  
  22.         <mvc:inteceptor>  
  23.             <!--  path如果不指定,则对所有的请求都拦截   
  24.             <mvc:mapping path=""/>-->  
  25.             <!-- 表示符合/user/*这样的模式才拦截 -->  
  26.             <mvc:mapping path="/user/*"/>  
  27.             <bean  class="test.web.MyInteceptor"></bean>  
  28.         </mvc:inteceptor>  
  29.         <!-- 可以定义多个inteceptor,按顺序执行 -->  
  30.      </mvc:inteceptors>  
  31. </beans>       

国际化ResourceMessage

在根路径下建立资源文件:
mess.properties
mess_en_US.properties
mess_zh_CN.properties
分别定义如下:
welcome="welcome"
welcome="(US)welcome"
welcome="欢迎你!"


jsp页面里,使用<spring:message/>
Html代码  收藏代码
  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>  
  2. <%@ taglib uri="http://www.springframework.org/tags" prefix="spring"%>  
  3. <%  
  4. String path = request.getContextPath();  
  5. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";  
  6. %>  
  7.   
  8. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
  9. <html>  
  10.   <body><!-- 国际化的key为welcome -->  
  11.    <spring:message code="welcome"/><br>  
  12.   </body>  
  13. </html>  

加载国际化资源文件,需要在springmvc-servlet.xml里配置
如下:
Xml代码  收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.     xmlns:p="http://www.springframework.org/schema/p"  
  5.     xmlns:mvc="http://www.springframework.org/schema/mvc"  
  6.     xmlns:context="http://www.springframework.org/schema/context"  
  7.     xsi:schemaLocation="  
  8.         http://www.springframework.org/schema/beans   
  9.         http://www.springframework.org/schema/mvc  
  10.         http://www.springframework.org/schema/beans/spring-beans-2.5.xsd  
  11.         http://www.springframework.org/schema/context  
  12.         http://www.springframework.org/schema/context/spring-context-2.5.xsd">  
  13.      <!-- 基于注解的方式 -->  
  14.      <context:component-scan base-package="test.controller"/>  
  15.      <!-- InternalResourceViewResolver:是在基于url的基础之上,加入了JSP,JSTL的视图解析器 -->  
  16.      <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">  
  17.         <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>  
  18.         <property name="prefix" value="/pages"/>  
  19.         <property name="suffix" value=".jsp"></property>  
  20.      </bean>  
  21.      <!-- 加载国际化配置,这里定义的id名必须为 messageSource-->  
  22.      <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">  
  23.         <!-- 根名称:去掉多语言后的名称,如这里的 mess,为在当前classpath里去找mess国际化配置文件 -->  
  24.         <property name="basename" value="mess"></property>  
  25.         <!-- 如果有多组国际化文件,可以指定basenames,它是一个list,配置如下 -->  
  26.         <property name="basenames">  
  27.             <list>  
  28.                 <value>mess1</value>  
  29.                 <value>mess2</value>  
  30.                 <value>....</value>  
  31.             </list>  
  32.         </property>  
  33.      </bean>  
  34. </beans>    



JSR-303 validate bean 验证
如:User类里
Java代码  收藏代码
  1. public class User {  
  2.     @NotEmpty  
  3.     private String name;  
  4.     @Size(max=20,min=6)  
  5.     private String pass;  
  6.     public String getName() {  
  7.         return name;  
  8.     }  
  9.     public void setName(String name) {  
  10.         this.name = name;  
  11.     }  
  12.     public String getPass() {  
  13.         return pass;  
  14.     }  
  15.     public void setPass(String pass) {  
  16.         this.pass = pass;  
  17.     }  
  18. }  

然后在Controller里
Java代码  收藏代码
  1. @RequestMapping("/testMethod")  
  2. public void testMethod(@Valid User user,BindingResult result){  
  3.     if(result.hasErrors()){  
  4.         return "error";  
  5.     }  
  6.     System.out.println(user);  
  7. }  

在参数里加@Valid注解,就会当这个user进行绑定的时候,就验证,验证的规则定义在User类里,如果验证过程出错,就会把错误信息放在BindingResult里


原创粉丝点击