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

来源:互联网 发布:海岛22研究所升级数据 编辑:程序博客网 时间:2024/05/22 01:55

下面的小例子用了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. }  
 转自:http://www.iteye.com/topic/1072244
原创粉丝点击