基于spring3.0.5 mvc 简单用户管理实例

来源:互联网 发布:ppt软件免费版下载 编辑:程序博客网 时间:2024/06/03 20:14

马上要开发一个新的项目,最近感觉spring mvc势头比较猛,就了解了一下,以前觉得spring mvc用起来较麻烦,所以一直用struts2,但了解了一下spring3 mvc,一下子就喜欢上了它,下个项目决定就用它了,RESTful URL、几乎0配置、不需要实现任何接口或继承任何类的Controller、方法级别的拦截,一个方法对应一个url、灵活的方法参数和返回值、多种view、处理ajax的请求更是方便...

   下面的小例子用了spring mvc和hibernate,只是简单的用户增删改查,没有用ajax,ajax的版本在这里:Spring3 MVC + jQuery easyUI 做的ajax版本用户管理(http://www.iteye.com/topic/1081739),给和我一样准备用spring mvc的朋友参考一下吧。jar包如图:

   

web.xml如下:
Xml代码  收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   
  5.     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">  
  6.       
  7.     <!-- 默认的spring配置文件是在WEB-INF下的applicationContext.xml -->  
  8.     <listener>  
  9.         <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  
  10.     </listener>  
  11.   
  12.     <filter>  
  13.         <filter-name>Set Character Encoding</filter-name>  
  14.         <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>  
  15.         <init-param>  
  16.             <param-name>encoding</param-name>  
  17.             <param-value>UTF-8</param-value>  
  18.         </init-param>  
  19.         <init-param>  
  20.             <param-name>forceEncoding</param-name>  
  21.             <param-value>true</param-value><!-- 强制进行转码 -->  
  22.         </init-param>  
  23.     </filter>  
  24.       
  25.     <filter-mapping>  
  26.         <filter-name>Set Character Encoding</filter-name>  
  27.         <url-pattern>/*</url-pattern>  
  28.     </filter-mapping>  
  29.       
  30.     <!-- 默认所对应的配置文件是WEB-INF下的{servlet-name}-servlet.xml,这里便是:spring3-servlet.xml -->  
  31.     <servlet>  
  32.         <servlet-name>spring3</servlet-name>  
  33.         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
  34.         <load-on-startup>1</load-on-startup>  
  35.     </servlet>  
  36.   
  37.     <servlet-mapping>  
  38.         <servlet-name>spring3</servlet-name>  
  39.         <!-- 这里可以用 / 但不能用 /* ,拦截了所有请求会导致静态资源无法访问,所以要在spring3-servlet.xml中配置mvc:resources -->  
  40.         <url-pattern>/</url-pattern>  
  41.     </servlet-mapping>  
  42.   
  43.     <welcome-file-list>  
  44.         <welcome-file>index.jsp</welcome-file>  
  45.     </welcome-file-list>  
  46. </web-app>  
 
 applicationContext.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:aop="http://www.springframework.org/schema/aop"  
  5.     xmlns:tx="http://www.springframework.org/schema/tx"  
  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/beans/spring-beans-3.0.xsd   
  10.           http://www.springframework.org/schema/tx   
  11.           http://www.springframework.org/schema/tx/spring-tx-3.0.xsd  
  12.           http://www.springframework.org/schema/context   
  13.           http://www.springframework.org/schema/context/spring-context-3.0.xsd   
  14.           http://www.springframework.org/schema/aop   
  15.           http://www.springframework.org/schema/aop/spring-aop-3.0.xsd" default-autowire="byName">  
  16.         <!-- 注意上面的default-autowire="byName",如果没有这个声明那么HibernateDaoSupport中的sessionFactory不会被注入 -->  
  17.         <!-- 约定优于配置,约定优于配置 -->  
  18.     <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">  
  19.         <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>  
  20.         <property name="url" value="jdbc:mysql://127.0.0.1:3306/test"></property>  
  21.         <property name="username" value="root"></property>  
  22.         <property name="password" value="root"></property>  
  23.     </bean>  
  24.     <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">  
  25.         <property name="dataSource" ref="dataSource"/>  
  26.        <property name="mappingDirectoryLocations">  
  27.          <list><!-- 这里直接映射的pojo类所在的包,简单方便不用没次加一个pojo类都需要到这里来添加 -->  
  28.             <value>classpath:com/fsj/spring/model</value>  
  29.          </list>  
  30.        </property>  
  31.         <property name="hibernateProperties">  
  32.             <props>  
  33.                 <prop key="hibernate.dialect">  
  34.                     org.hibernate.dialect.MySQLDialect  
  35.                 </prop>  
  36.                 <prop key="hibernate.show_sql">  
  37.                     true  
  38.                 </prop>  
  39.             </props>  
  40.         </property>  
  41.     </bean>  
  42.       
  43.     <!-- 自动扫描组件,这里要把web下面的 controller去除,他们是在spring3-servlet.xml中配置的,如果不去除会影响事务管理的。-->  
  44.     <context:component-scan base-package="com.fsj.spring">  
  45.         <context:exclude-filter type="regex" expression="com.fsj.spring.web.*"/>  
  46.     </context:component-scan>  
  47.       
  48.     <!-- 下面是配置声明式事务管理的,个人感觉比用注解管理事务要简单方便 -->  
  49.     <bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">  
  50.         <property name="sessionFactory" ref="sessionFactory"></property>  
  51.     </bean>  
  52.   
  53.     <aop:config>  
  54.         <aop:advisor pointcut="execution(* com.fsj.spring.service.*Service.*(..))" advice-ref="txAdvice"/>  
  55.     </aop:config>  
  56.   
  57.     <tx:advice id="txAdvice" transaction-manager="txManager">  
  58.         <tx:attributes>  
  59.             <tx:method name="get*" read-only="true"/>  
  60.             <tx:method name="query*" read-only="true"/>  
  61.             <tx:method name="find*" read-only="true"/>  
  62.             <tx:method name="load*" read-only="true"/>  
  63.             <tx:method name="*" rollback-for="Exception"/>  
  64.         </tx:attributes>  
  65.     </tx:advice>  
  66.       
  67.       
  68. </beans>  
 
 spring3-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" xmlns:p="http://www.springframework.org/schema/p"  
  4.     xmlns:context="http://www.springframework.org/schema/context"  
  5.     xmlns:mvc="http://www.springframework.org/schema/mvc"  
  6.     xsi:schemaLocation="   
  7.            http://www.springframework.org/schema/beans   
  8.            http://www.springframework.org/schema/beans/spring-beans-3.0.xsd   
  9.            http://www.springframework.org/schema/context   
  10.            http://www.springframework.org/schema/context/spring-context-3.0.xsd  
  11.            http://www.springframework.org/schema/mvc   
  12.            http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd" default-autowire="byName">  
  13.     <!-- 约定优于配置,约定优于配置 -->  
  14.       
  15.     <!-- 配置静态资源,直接映射到对应的文件夹,不被DispatcherServlet处理,3.04新增功能,需要重新设置spring-mvc-3.0.xsd -->  
  16.     <mvc:resources mapping="/img/**" location="/img/"/>  
  17.     <mvc:resources mapping="/js/**" location="/js/"/>  
  18.     <mvc:resources mapping="/css/**" location="/css/"/>  
  19.   
  20.     <!-- 扫描所有的controller -->  
  21.     <context:component-scan base-package="com.fsj.spring.web" />  
  22.   
  23.     <!-- InternalResourceViewResolver默认的就是JstlView所以这里就不用配置viewClass了 -->  
  24.     <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">  
  25.         <property name="prefix" value="/WEB-INF/view/"></property>  
  26.         <property name="suffix" value=".jsp"></property>  
  27.     </bean>  
  28.       
  29.     <!-- 启用基于注解的处理器映射,添加拦截器,类级别的处理器映射 -->  
  30.     <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">  
  31.         <property name="interceptors">  
  32.             <list>  
  33.                 <bean class="com.fsj.spring.util.MyHandlerInterceptor"/>  
  34.             </list>  
  35.         </property>  
  36.     </bean>  
  37.       
  38.     <!--   
  39.     配置一个基于注解的定制的WebBindingInitializer,解决日期转换问题,方法级别的处理器映射,  
  40.     有人说该bean要放在context:component-scan前面,要不然不起作用,但我试的放后面也可以啊。  
  41.     -->  
  42.     <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">  
  43.         <property name="cacheSeconds" value="0" />  
  44.         <property name="webBindingInitializer">  
  45.             <bean class="com.fsj.spring.util.MyWebBinding" />  
  46.         </property>  
  47.     </bean>  
  48.       
  49. </beans>   
 
 log4j的就不贴出来了。
两个HelloWorldController如下:
Java代码  收藏代码
  1. package com.fsj.spring.web;  
  2.   
  3. import org.springframework.stereotype.Controller;  
  4. import org.springframework.web.bind.annotation.RequestMapping;  
  5. import org.springframework.web.servlet.ModelAndView;  
  6.   
  7. /* 
  8.  * 不需要实现任何接口,也不需要继承任何的类 
  9.  */  
  10. @Controller  
  11. public class HelloWorldController {  
  12.   
  13.     /** 
  14.      * 方法都可以接受的参数(参数数量和顺序没有限制): HttpServletRequest,HttpServletResponse,HttpSession(session必须是可用的) ,PrintWriter,Map,Model,@PathVariable(任意多个), @RequestParam(任意多个), @CookieValue (任意多个),@RequestHeader,Object(pojo对象) ,BindingResult等等 
  15.      *  
  16.      * 返回值可以是:String(视图名),void(用于直接response),ModelAndView,Map ,Model,任意其它任意类型的对象(默认放入model中,名称即类型的首字母改成小写),视图名默认是请求路径 
  17.      */  
  18.     @RequestMapping("/helloWorld")  
  19.     public ModelAndView helloWorld() {  
  20.         ModelAndView mav = new ModelAndView();  
  21.         mav.setViewName("login");  
  22.         mav.addObject("message""Hello World!");  
  23.         return mav;  
  24.     }  
  25. }  
 
Java代码  收藏代码
  1. package com.fsj.spring.web;  
  2.   
  3. import java.util.List;  
  4. import javax.servlet.http.HttpServletRequest;  
  5.   
  6. import org.apache.commons.lang.StringUtils;  
  7. import org.springframework.stereotype.Controller;  
  8. import org.springframework.ui.Model;  
  9. import org.springframework.web.bind.annotation.PathVariable;  
  10. import org.springframework.web.bind.annotation.RequestMapping;  
  11. import org.springframework.web.bind.annotation.RequestMethod;  
  12. import org.springframework.web.bind.annotation.RequestParam;  
  13. import com.fsj.spring.model.TDept;  
  14. import com.fsj.spring.model.TUser;  
  15. import com.fsj.spring.service.IDeptService;  
  16. import com.fsj.spring.service.IUserService;  
  17. import com.fsj.spring.util.Constants;  
  18.   
  19. @Controller  
  20. @RequestMapping("/user")  
  21. public class UserController {  
  22.       
  23.     private IUserService userService;  
  24.     private IDeptService deptService;  
  25.       
  26.     public IDeptService getDeptService() {  
  27.         return deptService;  
  28.     }  
  29.   
  30.     public void setDeptService(IDeptService deptService) {  
  31.         this.deptService = deptService;  
  32.     }  
  33.   
  34.     public IUserService getUserService() {  
  35.         return userService;  
  36.     }  
  37.   
  38.     public void setUserService(IUserService userService) {  
  39.         this.userService = userService;  
  40.     }  
  41.   
  42.     @RequestMapping(value="/login",method=RequestMethod.POST)  
  43.     public String login(@RequestParam String name,@RequestParam String password,Model model,HttpServletRequest request) throws Exception{  
  44.         TUser user1 = userService.getUserByName(name);  
  45.         if(user1 == null) {  
  46.             model.addAttribute("message""用户不存在");  
  47.             return "login";  
  48.         }else if(password == null || !password.equals(user1.getPassword()) ){  
  49.             model.addAttribute("message""密码错误");  
  50.             return "login";  
  51.         }else {  
  52.             request.getSession().setAttribute(Constants.USER_INFO_SESSION, user1);  
  53.             return "welcome";  
  54.         }  
  55.     }  
  56.       
  57.     @RequestMapping(value="/login1",method=RequestMethod.POST)  
  58.     public String login1(TUser user,HttpServletRequest request,Model model) throws Exception{  
  59.         TUser user1 = userService.getUserByName(user.getName());  
  60.         if(user1 == null) {  
  61.             model.addAttribute("message""用户不存在");  
  62.             return "login";  
  63.         }else if(user.getPassword() == null || !user.getPassword().equals(user1.getPassword()) ){  
  64.             model.addAttribute("message""密码错误");  
  65.             return "login";  
  66.         }else {  
  67.             request.getSession().setAttribute(Constants.USER_INFO_SESSION, user1);  
  68.             return "welcome";  
  69.         }  
  70.     }  
  71.       
  72.     @RequestMapping(value="/list")  
  73.     public String list(Model model,HttpServletRequest request) throws Exception {  
  74.         List<TUser> userList = userService.getUserList();  
  75.         model.addAttribute("userList", userList);  
  76.         List<TDept> deptList = deptService.getDeptList();  
  77.         model.addAttribute("deptList", deptList);  
  78.         if(StringUtils.isNotBlank(request.getParameter("resMess")) && StringUtils.isNotBlank(request.getParameter("opeMess"))) {  
  79.             model.addAttribute("message",setOperateMessage(request.getParameter("resMess"),request.getParameter("opeMess"),"用户"));  
  80.         }  
  81.         return "user/list";  
  82.     }  
  83.   
  84.     private String setOperateMessage(String resMess,String opeMess,String modMess) {  
  85.         //TODO 以后可以和写日志结合在一起  
  86.         String ope = "";  
  87.         String res = "";  
  88.         if(Constants.OPERATE_TYPE_ADD.equals(opeMess)) {  
  89.             ope = "增加";  
  90.         }else if(Constants.OPERATE_TYPE_UPDATE.equals(opeMess)) {  
  91.             ope = "更新";  
  92.         }else if(Constants.OPERATE_TYPE_DELETE.equals(opeMess)) {  
  93.             ope = "删除";  
  94.         }  
  95.           
  96.         if(Constants.RESULT_SUCCESS.equals(resMess)) {  
  97.             res = "成功";  
  98.         }else if(Constants.RESULT_FAILED.equals(resMess)) {  
  99.             res = "失败";  
  100.         }  
  101.         return ope + modMess + res;  
  102.     }  
  103.       
  104.     /* 
  105.      * 同样的请求路径 user/add 如果是get请求就转到增加页面去,如果是post请求就做add操作 
  106.      */  
  107.     @RequestMapping(value="/add",method=RequestMethod.GET)  
  108.     public String toAdd(Model model) throws Exception{  
  109.         List<TDept> deptList = deptService.getDeptList();  
  110.         model.addAttribute("deptList", deptList);  
  111.         return "user/add";  
  112.     }  
  113.     @RequestMapping(value="/add",method=RequestMethod.POST)  
  114.     public String doAdd(TUser user,Model model) throws Exception{  
  115.         try {  
  116.             userService.addUser(user);  
  117.             model.addAttribute("resMess", Constants.RESULT_SUCCESS);  
  118.         } catch (Exception e) {  
  119.             e.printStackTrace();  
  120.             model.addAttribute("resMess", Constants.RESULT_FAILED);  
  121.             throw e;  
  122.         }  
  123.         model.addAttribute("opeMess", Constants.OPERATE_TYPE_ADD);  
  124.           
  125.         //重定向,防止重复提交,当然这样不能完全解决重复提交的问题,只是简单处理一下,若要较好的防止重复提交可以结合token做,  
  126.         //以“/”开关,相对于当前项目根路径,不以“/”开关,相对于当前路径  
  127.         //return "redirect:/user/list";   
  128.         return "redirect:list";   
  129.     }  
  130.       
  131.     /* 
  132.      * Restful模式路径: 
  133.      * 注意这里/update/{id}和@PathVariable("id")中id要一致,这样不管用debug模式还是release模式编译都没问题 
  134.      * 也可以简写成@PathVariable int id,但这样只能以debug模式编译的时候正确,如果用release编译就不正确了,因为如果用release模式编译会把参数的名字改变的 
  135.      * 一般IDE工具都是以debug模式编译的,javac是以release模式编译的 
  136.      * 同样的请求路径 user/update 如果是get请求就转到增加页面去,如果是post请求就做update操作 
  137.      */  
  138.     @RequestMapping(value="/update/{id}",method=RequestMethod.GET)  
  139.     public String toUpdate(@PathVariable("id"int id, Model model) throws Exception{  
  140.         model.addAttribute("user",userService.getUserById(id));  
  141.         model.addAttribute("deptList", deptService.getDeptList());  
  142.         return "user/update";  
  143.     }  
  144.     @RequestMapping(value="/update/{id}",method=RequestMethod.POST)  
  145.     public String doUpdate(@PathVariable("id"int id, TUser user,Model model) throws Exception{  
  146.         try {  
  147.             userService.updateUser(user);  
  148.             model.addAttribute("resMess", Constants.RESULT_SUCCESS);  
  149.         } catch (Exception e) {  
  150.             e.printStackTrace();  
  151.             model.addAttribute("resMess", Constants.RESULT_FAILED);  
  152.             throw e;  
  153.         }  
  154.         model.addAttribute("opeMess", Constants.OPERATE_TYPE_UPDATE);  
  155.         //return "redirect:../list";   
  156.         //重定向,防止重复提交,以“/”开关,相对于当前项目根路径,不以“/”开关,相对于当前路径  
  157.         return "redirect:/user/list";   
  158.     }  
  159.       
  160.     @RequestMapping(value="/delete/{id}")  
  161.     public String delete(@PathVariable("id"int id,Model model)throws Exception{  
  162.         try {  
  163.             userService.deleteUser(id);  
  164.             model.addAttribute("resMess", Constants.RESULT_SUCCESS);  
  165.         } catch (Exception e) {  
  166.             e.printStackTrace();  
  167.             model.addAttribute("resMess", Constants.RESULT_FAILED);  
  168.             throw e;  
  169.         }  
  170.         model.addAttribute("opeMess", Constants.OPERATE_TYPE_DELETE);  
  171.         return "redirect:/user/list";//重定向  
  172.     }  
  173. }  
 
 下面的例子中没有jar包,jar太大了超过10M了,请自己加jar包

 

 在编码过程中曾遇到过以下问题,都一一解决了: 
1.静态资源无法访问,解决办法用:mvc:resources,不过mvc:resources是3.04新增功能,用的时候需要设置一下xml catalog,使用新的spring-mvc-3.0.xsd 

Xml代码  收藏代码
  1. <!-- 配置静态资源,直接映射到对应的文件夹,不被DispatcherServlet处理,3.04新增功能,需要重新设置spring-mvc-3.0.xsd -->  
  2.     <mvc:resources mapping="/img/**" location="/img/"/>  
  3.     <mvc:resources mapping="/js/**" location="/js/"/>  
  4.     <mvc:resources mapping="/css/**" location="/css/"/>  

2.自动注入日期格式转换错误问题,解决办法:定制一个WebBindingInitialize,注册一个自定义的属性编辑器
Xml代码  收藏代码
  1. <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">  
  2.         <property name="cacheSeconds" value="0" />  
  3.         <property name="webBindingInitializer">  
  4.             <bean class="com.fsj.spring.util.MyWebBinding" />  
  5.         </property>  
  6.     </bean>  

Java代码  收藏代码
  1. package com.fsj.spring.util;  
  2.   
  3. import java.util.Date;  
  4. import org.springframework.web.bind.WebDataBinder;  
  5. import org.springframework.web.bind.support.WebBindingInitializer;  
  6. import org.springframework.web.context.request.WebRequest;  
  7.   
  8. public class MyWebBinding implements WebBindingInitializer {  
  9.   
  10.     public void initBinder(WebDataBinder binder, WebRequest request) {  
  11.         //1. 使用spring自带的CustomDateEditor  
  12.         //SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");  
  13.         //binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true));  
  14.           
  15.         //2. 自定义的PropertyEditorSupport  
  16.         binder.registerCustomEditor(Date.classnew DateConvertEditor());  
  17.   
  18.     }  
  19.   
  20. }  

Java代码  收藏代码
  1. package com.fsj.spring.util;  
  2.   
  3. import java.beans.PropertyEditorSupport;  
  4. import java.text.ParseException;  
  5. import java.text.SimpleDateFormat;  
  6. import org.springframework.util.StringUtils;  
  7.   
  8. public class DateConvertEditor extends PropertyEditorSupport {  
  9.     private SimpleDateFormat datetimeFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
  10.     private SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");  
  11.   
  12.     public void setAsText(String text) throws IllegalArgumentException {  
  13.         if (StringUtils.hasText(text)) {  
  14.             try {  
  15.                 if (text.indexOf(":") == -1 && text.length() == 10) {  
  16.                     setValue(this.dateFormat.parse(text));  
  17.                 } else if (text.indexOf(":") > 0 && text.length() == 19) {  
  18.                     setValue(this.datetimeFormat.parse(text));  
  19.                 }else{  
  20.                     throw new IllegalArgumentException("Could not parse date, date format is error ");  
  21.                 }  
  22.             } catch (ParseException ex) {  
  23.                 IllegalArgumentException iae = new IllegalArgumentException("Could not parse date: " + ex.getMessage());  
  24.                 iae.initCause(ex);  
  25.                 throw iae;  
  26.             }  
  27.         } else {  
  28.             setValue(null);  
  29.         }  
  30.     }  
  31. }  

 3. 之前做项目有时会忘记添加hirbernate的映射文件,所以把sessionFactory的配置改成 

Xml代码  收藏代码
  1. <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">  
  2.         <property name="dataSource" ref="dataSource"/>  
  3.        <property name="mappingDirectoryLocations">  
  4.          <list><!-- 这里直接映射的pojo类所在的包,简单方便不用没次加一个pojo类都需要到这里来添加 -->  
  5.             <value>classpath:com/fsj/spring/model</value>  
  6.          </list>  
  7.        </property>  
  8.         <property name="hibernateProperties">  
  9.             <props>  
  10.                 <prop key="hibernate.dialect">  
  11.                     org.hibernate.dialect.MySQLDialect  
  12.                 </prop>  
  13.                 <prop key="hibernate.show_sql">  
  14.                     true  
  15.                 </prop>  
  16.             </props>  
  17.         </property>  
  18.     </bean>  


4. 事务管理失效问题,解决办法:在applicationContext.xml中的自动扫描组件要除去扫描controller,在spring3-servlet.xml中扫描controller 
applicationContext.xml中 
Xml代码  收藏代码
  1. <context:component-scan base-package="com.fsj.spring">  
  2.         <context:exclude-filter type="regex" expression="com.fsj.spring.web.*"/>  
  3.     </context:component-scan>  

spring3-servlet.xml中 
<context:component-scan base-package="com.fsj.spring.web" />

5. 用Interceptor做简单的权限控制: 

Xml代码  收藏代码
  1. <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">  
  2.         <property name="interceptors">  
  3.             <list>  
  4.                 <bean class="com.fsj.spring.util.MyHandlerInterceptor"/>  
  5.             </list>  
  6.         </property>  
  7.     </bean>  


Java代码  收藏代码
  1. package com.fsj.spring.util;  
  2.   
  3. import javax.servlet.http.HttpServletRequest;  
  4. import javax.servlet.http.HttpServletResponse;  
  5.   
  6. import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;  
  7.   
  8. public class MyHandlerInterceptor extends HandlerInterceptorAdapter {  
  9.   
  10.     @Override  
  11.     public boolean preHandle(HttpServletRequest request,  
  12.             HttpServletResponse response, Object handler) throws Exception {  
  13.         //就简单判断了一下,如果要详细控制可以用spring security  
  14.         String url = request.getRequestURI();  
  15.         if(url.endsWith("helloWorld") || url.endsWith("user/login") || url.endsWith("user/login1"))  
  16.             return true;  
  17.         if(request.getSession() != null && request.getSession().getAttribute(Constants.USER_INFO_SESSION) != null)   
  18.             return true;  
  19.           
  20.         response.sendRedirect(request.getContextPath() + "/helloWorld");      
  21.         return false;  
  22.               
  23.     }  
  24.       
  25. }  
6. 重复提交的问题,解决办法:我只是简单的用了重定向的方法,如果用户的网络卡,不停的F5刷新还是会重复提交的,可以结合token去处理。

引用


<!-- 启用基于注解的处理器映射,添加拦截器,类级别的处理器映射 -->  
    <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">  
        <property name="interceptors">  
            <list>  
                <bean class="com.fsj.spring.util.MyHandlerInterceptor"/>  
            </list>  
        </property>  
    </bean> 


这个配置可以用mvc的标签配置更方便点,个人感觉
Xml代码  收藏代码
  1. <!-- 针对类、方法级别的权限拦截器 -->  
  2.     <mvc:interceptors>  
  3.     <!-- 管理员的权限拦截器 -->  
  4.         <mvc:interceptor>  
  5.             <mvc:mapping path="/adminhome/*" />  
  6.             <mvc:mapping path="/roles/*" />  
  7.             <mvc:mapping path="/sysuser/*" />  
  8.             <mvc:mapping path="/record/*" />  
  9.             <mvc:mapping path="/deliver/*" />  
  10.             <mvc:mapping path="/sysmonitor/*" />  
  11.             <mvc:mapping path="/moduleconf/*" />  
  12.             <mvc:mapping path="/business/*" />  
  13.             <mvc:mapping path="/userapp/*" />  
  14.             <mvc:mapping path="/payment/*" />  
  15.             <bean class="com..web.interceptor.LoginInterceptor"></bean>  
  16.         </mvc:interceptor>  
  17.     <!-- 普通用户的权限拦截器 -->  
  18.         <mvc:interceptor>  
  19.             <mvc:mapping path="/userhome/*" />  
  20.             <mvc:mapping path="/user/*" />  
  21.             <bean class="com..web.interceptor.PhoneUserLoginInterceptor"></bean>  
  22.         </mvc:interceptor>  
  23.     </mvc:interceptors>  



嗯,看着你用mvc标签的配置是方便些,还有什么好的见意,希望多讨论下。

  • spring3.zip (288.3 KB)
  • 下载次数: 8017
0 0
原创粉丝点击