分享

二、spring mvc模拟用户增删改查以及登录和上传文件的相关流程

 暖风醉伊人 2013-09-27

二、spring mvc模拟用户增删改查以及登录和上传文件的相关流程

分类: spring 865人阅读 评论(1) 收藏 举报

1、工程结构:


spring mvc的访问地址是使用REST风格


2、web.xml的配置

  1. <servlet>  
  2.     <servlet-name>hello</servlet-name>  
  3.     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
  4.     <init-param><!-- 这两行是重新定位spring的配置文件路径,默认是在WEB-INF下面的hello-servlet.xml -->  
  5.         <param-name>contextConfigLocation</param-name>  
  6.         <param-value>WEB-INF/web-main.xml</param-value>  
  7.     </init-param>  
  8. </servlet>  
  9. <servlet-mapping>  
  10.     <servlet-name>hello</servlet-name>  
  11.     <url-pattern>*.htm</url-pattern>  
  12. </servlet-mapping>  

3、书写spring配置文件 /WebRoot/web-main.xml

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www./schema/beans"  
  3.     xmlns:xsi="http://www./2001/XMLSchema-instance"  
  4.     xmlns:context="http://www./schema/context"  
  5.     xmlns:mvc="http://www./schema/mvc"  
  6.     xsi:schemaLocation="http://www./schema/mvc http://www./schema/mvc/spring-mvc-3.1.xsd  
  7.         http://www./schema/beans http://www./schema/beans/spring-beans-3.0.xsd  
  8.         http://www./schema/context http://www./schema/context/spring-context-3.0.xsd">  
  9.       
  10.     <!-- 开始spring mvc的注解 -->  
  11.     <mvc:annotation-driven/>  
  12.       
  13.     <!-- 这样根目录下面的resource的文件(.css,.js等)就不会被spring的DispatchServlet进行过滤 -->  
  14.     <mvc:resources location="/resources/" mapping="/resources/**"/>  
  15.       
  16.     <!-- 配置注解扫描的包路径 -->  
  17.     <context:component-scan base-package="cn.edu.hj.controller"></context:component-scan>  
  18.       
  19.     <!-- 配置action中返回的视图配置  -->  
  20.     <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">  
  21.         <property name="prefix" value="/WEB-INF/jsp/"></property>  
  22.         <property name="suffix" value=".jsp"></property>  
  23.     </bean>  
  24.       
  25.     <!-- 上传文件时需要做的配置 -->  
  26.     <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">  
  27.         <property name="maxUploadSize" value="5000000"></property>  
  28.     </bean>  
  29.       
  30. </beans>  

4、操作中涉及到的一个User javabean

详细的注解验证可看这个

JSR 303 - Bean Validation 介绍及最佳实践http://www.ibm.com/developerworks/cn/java/j-lo-jsr303/index.html

  1. package cn.edu.hj.bean;  
  2. import javax.validation.constraints.Size;  
  3. import org.hibernate.validator.constraints.Email;  
  4. import org.hibernate.validator.constraints.NotEmpty;  
  5.   
  6. /** 
  7.  * 这里属性的get方法上面的注解是spring mvc的验证注解,在actioin中调用 
  8.  * @author user 
  9.  */  
  10. public class User {  
  11.     private String username;  
  12.     private String password;  
  13.     private String email;  
  14.     public User(){  
  15.           
  16.     }  
  17.     public User(String username, String password, String email) {  
  18.         this.username = username;  
  19.         this.password = password;  
  20.         this.email = email;  
  21.     }  
  22.       
  23.     @NotEmpty(message = "用户名不能为空")  
  24.     public String getUsername() {  
  25.         return username;  
  26.     }  
  27.     public void setUsername(String username) {  
  28.         this.username = username;  
  29.     }  
  30.     @NotEmpty(message = "密码不能为空")  
  31.     @Size(min = 4, max = 8, message = "密码在4~8位之间")  
  32.     public String getPassword() {  
  33.         return password;  
  34.     }  
  35.     public void setPassword(String password) {  
  36.         this.password = password;  
  37.     }  
  38.     @NotEmpty(message = "email不能为空")  
  39.     @Email(message = "email格式不正确")  
  40.     public String getEmail() {  
  41.         return email;  
  42.     }  
  43.     public void setEmail(String email) {  
  44.         this.email = email;  
  45.     }  
  46.     @Override  
  47.     public String toString(){  
  48.         return username+"#"+password+"#"+email;  
  49.     }  
  50. }  

5、模拟用户增删改查以及登录和上传文件的action处理类

  1. package cn.edu.hj.controller;  
  2. import java.io.File;  
  3. import java.io.IOException;  
  4. import java.util.LinkedHashMap;  
  5. import java.util.Map;  
  6. import javax.servlet.http.HttpServletRequest;  
  7. import javax.servlet.http.HttpSession;  
  8. import javax.validation.Valid;  
  9. import org.apache.commons.io.FileUtils;  
  10. import org.springframework.stereotype.Controller;  
  11. import org.springframework.ui.Model;  
  12. import org.springframework.validation.BindingResult;  
  13. import org.springframework.web.bind.annotation.ExceptionHandler;  
  14. import org.springframework.web.bind.annotation.PathVariable;  
  15. import org.springframework.web.bind.annotation.RequestMapping;  
  16. import org.springframework.web.bind.annotation.RequestMethod;  
  17. import org.springframework.web.bind.annotation.RequestParam;  
  18. import org.springframework.web.bind.annotation.ResponseBody;  
  19. import org.springframework.web.bind.annotation.SessionAttributes;  
  20. import org.springframework.web.multipart.MultipartFile;  
  21. import org.springframework.web.servlet.mvc.support.RedirectAttributes;  
  22. import cn.edu.hj.bean.User;  
  23.   
  24. @Controller  
  25. @RequestMapping(value = "/user")  
  26. //写上这个注解的话那么在Model中进行添加key为loginUser的时候会默认添加到session中  
  27. @SessionAttributes(value = "loginUser")  
  28. public class UserController {  
  29.       
  30.     Map<String,User> users = new LinkedHashMap<String,User>();  
  31.     public UserController(){//无参数的构造方法会默认被调用一次  
  32.         System.out.println("初始化....");  
  33.         users.put("ldh",new User("ldh""123""ldh@qq.com"));  
  34.         users.put("gfc",new User("gfc""123""gfc@qq.com"));  
  35.         users.put("zxy",new User("zxy""123""zxy@qq.com"));  
  36.         users.put("lm ",new User("lm ""123"" lm@qq.com"));  
  37.     }  
  38.     /** 
  39.      * 初始化user列表信息 
  40.      * @param model 
  41.      * @param user 
  42.      */  
  43.     public void init(Model model,User user){  
  44.         if(user != null){  
  45.             users.put(user.getUsername(), user);  
  46.         }  
  47.         model.addAttribute("users", users);  
  48.     }  
  49.       
  50.     /** 
  51.      * 跳转到list页面 
  52.      * @param model 
  53.      * @return 
  54.      */  
  55.     @RequestMapping(value = "/list.htm")  
  56.     public String list(Model model){  
  57.         init(model, null);  
  58.         return "user/userlist";  
  59.     }  
  60.       
  61.     /** 
  62.      * 跳转到添加页面 
  63.      * @return 
  64.      */  
  65.     @RequestMapping(value = "/add.htm", method = RequestMethod.GET)//使用get方法的时候  
  66.     public String add(Model model){  
  67.         //因为在页面上有个modelAttribute="user" user对象,所以要传递一个空的过去,否则报错  
  68.         model.addAttribute(new User());//默认的键为值的类型,为user  
  69.         return "user/adduser";  
  70.     }  
  71.       
  72.     /** 
  73.      * 执行添加操作,并跳转到list页面 
  74.      * @param user 如果要验证前面需要加上@Valid注解 
  75.      * @param binding 这个是在验证的时候把信息跟该类进行绑定,可以得到验证的结果信息 
  76.      * binding的参数必须要放在要验证的那个对象之后 
  77.      * @param model  
  78.      * @return 
  79.      */  
  80.     @RequestMapping(value = "/add.htm", method = RequestMethod.POST)//使用post方法的时候  
  81.     public String add(@Valid User user,BindingResult binding,Model model){  
  82.         if(binding.hasErrors()){  
  83.             return "user/adduser";  
  84.         }  
  85.         init(model, user);  
  86.         return "redirect:/user/list.htm";  
  87.     }  
  88.       
  89.     /** 
  90.      * 根据username得到user对象 
  91.      * 路径为:/springmvc/user/ldh.htm 
  92.      * @param username前面加上@PathVariable表示路径变量,会跟@RequestMapping的{username}进行对应 
  93.      * @param model 
  94.      * @return 
  95.      */  
  96.     @RequestMapping(value = "/{username}.htm",method = RequestMethod.GET)  
  97.     public String show(@PathVariable String username,Model model){  
  98.         User user = users.get(username);  
  99.         model.addAttribute("user", user);  
  100.         return "user/show";  
  101.     }  
  102.       
  103.     /** 
  104.      * 做删除操作,url类似REST风格 
  105.      * @param username 
  106.      * @return 
  107.      */  
  108.     @RequestMapping(value = "/delete/{username}.htm",method = RequestMethod.GET)  
  109.     public String delete(@PathVariable String username){  
  110.         users.remove(username);  
  111.         return "redirect:/user/list.htm";  
  112.     }  
  113.       
  114.     /** 
  115.      * 根据username得到user转到更新jsp页面 
  116.      * @param username 
  117.      * @return 
  118.      */  
  119.     @RequestMapping(value = "/update/{username}.htm",method = RequestMethod.GET)  
  120.     public String update(@PathVariable String username,Model model){  
  121.         User user = users.get(username);  
  122.         model.addAttribute("user", user);  
  123.         return "user/adduser";  
  124.     }  
  125.     /** 
  126.      * 做更新操作,url类似REST风格 
  127.      * @param user 
  128.      * @return 
  129.      */  
  130.     @RequestMapping(value = "/update/{username}.htm",method = RequestMethod.POST)  
  131.     public String update(@PathVariable String username,@Valid User user,BindingResult br){  
  132.         if(br.hasErrors()){  
  133.             return "/user/adduser";  
  134.         }  
  135.         users.put(user.getUsername(), user);  
  136.         return "redirect:/user/list.htm";  
  137.     }  
  138.       
  139.     /** 
  140.      * params = "json"相当于在方法参数中写入@RequestParam String json 
  141.      * 那么访问该视图的话必须是/springmvc/user/{username}.htm?json=.. 
  142.      * 目前tomcat不支持此类型的解析,方法可以进来,但是返回不了 
  143.      * @param username 
  144.      * @param model 
  145.      * @return 
  146.      */  
  147.     @ResponseBody//加上该注解,可以返回对象而不用是String类型  
  148.     @RequestMapping(value = "/{username}.htm",params = "json")  
  149.     public User showJson(@PathVariable String username,Model model){  
  150.         System.out.println("username:"+username);  
  151.         return users.get(username);  
  152.     }  
  153.       
  154.     /** 
  155.      * 转到登录界面 
  156.      * @return 
  157.      */  
  158.     @RequestMapping(value = "/login.htm",method = RequestMethod.GET)  
  159.     public String login(){  
  160.         return "/user/login";  
  161.     }  
  162.       
  163.     /** 
  164.      * 在登录界面进行登录 
  165.      * @param username 
  166.      * @param password 
  167.      * @param model 
  168.      * @return 
  169.      */  
  170.     @RequestMapping(value = "/login.htm",method = RequestMethod.POST)  
  171.     public String login(String username,String password,Model model){  
  172.         if(!users.containsKey(username)){  
  173.             throw new RuntimeException("用户名不存在!");  
  174.         }  
  175.         if(!password.equals(users.get(username).getPassword())){  
  176.             throw new RuntimeException("密码不正确");  
  177.         }  
  178.         //存放入session中,因为前面已经加了@SessionAttributes(value = "loginUser")注解  
  179.         model.addAttribute("loginUser", users.get(username));  
  180.         return "redirect:/user/list.htm";  
  181.     }  
  182.       
  183.     /** 
  184.      * 进行异常的捕获,这里是该action中抛出的RuntimeException都在这个方法进行捕获 
  185.      * @param ex 
  186.      * @param req 
  187.      * @return 
  188.      */  
  189.     @ExceptionHandler(value = {RuntimeException.class})  
  190.     public String handlerException(Exception ex,HttpServletRequest req){  
  191.         req.setAttribute("ex", ex);//把异常放入request请求中  
  192.         return "error";//转到error页面  
  193.     }  
  194.       
  195.     /** 
  196.      * 使用重定向来进行传递对象 
  197.      * @param model 
  198.      * @param ra 
  199.      * @return 
  200.      */  
  201.     @RequestMapping(value = "/redir.htm")  
  202.     public String redir(Model model,RedirectAttributes ra){  
  203. //      model.addAttribute("movie", "海贼王");//使用这种方式在重定向是传递不了的  
  204.         ra.addFlashAttribute("movie""海贼王");//使用这种可以  
  205.         return "redirect:/user/list.htm";  
  206.     }  
  207.       
  208.     /** 
  209.      * 跳转到上传页面 
  210.      * @param photo 
  211.      * @return 
  212.      */  
  213.     @RequestMapping(value = "upload.htm",method = RequestMethod.GET)  
  214.     public String uploadPhoto(){  
  215.         return "user/upload";  
  216.     }  
  217.       
  218.     /** 
  219.      * 进行单个文件上传 
  220.      * @param photo 这个参数名需要跟表单中上传的name属性名称一样,否则上传不成功 
  221.      * @param model 
  222.      * @return 
  223.      */  
  224.     @RequestMapping(value = "upload.htm",method = RequestMethod.POST)  
  225.     public String uploadPhoto(MultipartFile photo,Model model,HttpServletRequest req){  
  226.         System.out.println(photo.getContentType());//文件的类型,image/jpeg  
  227.         System.out.println(photo.getName());//上传的表单名称  
  228.         System.out.println(photo.getOriginalFilename());//上传的文件名  
  229.         String realpath = req.getSession().getServletContext().getRealPath("/upload/");  
  230.         System.out.println(realpath);//容器的webapp目录下  
  231.         try {  
  232.             FileUtils.copyInputStreamToFile(photo.getInputStream(), new File(realpath + "/" +photo.getOriginalFilename()));  
  233.         } catch (IOException e) {e.printStackTrace();}  
  234.         model.addAttribute("message""上传成功");  
  235.         return "user/upload";  
  236.     }  
  237.       
  238.     /** 
  239.      * 进行多个文件上传 
  240.      * @param photos 这个参数名需要跟表单中上传的name属性名称一样,否则上传不成功 
  241.      * 在批量上传的时候需要加上这个注解@RequestParam当请求参数a不存在时会有异常发生,可以通过设置属性required=false解决 
  242.      * @param model 
  243.      * @return 
  244.      */  
  245.     @RequestMapping(value = "uploads.htm",method = RequestMethod.POST)  
  246.     public String uploadPhoto(@RequestParam(required = false)MultipartFile[] photos,Model model,HttpServletRequest req){  
  247.         String realpath = req.getSession().getServletContext().getRealPath("/upload/");  
  248.         try {  
  249.             for(MultipartFile photo : photos){  
  250.                 if(photo.isEmpty())continue;//可能会有三个上传表单却不一定三个都进行上传,这样其他的就为空需要判断  
  251.                 FileUtils.copyInputStreamToFile(photo.getInputStream(), new File(realpath + "/" +photo.getOriginalFilename()));  
  252.             }  
  253.         } catch (IOException e) {e.printStackTrace();}  
  254.         model.addAttribute("message""上传成功");  
  255.         return "user/upload";  
  256.     }  
  257. }  

6,相关的jsp页面

【1】/WebRoot/index.jsp页面

  1. <body>  
  2.   This is my JSP page. <br>  
  3. </body>  

【2】/WebRoot/WEB-INF/jsp/error.jsp页面  用于显示错误信息的,action中抛出的异常被在此处显示

  1. <body>  
  2.   ${ex.message}  
  3. </body>  

【3】/WebRoot/WEB-INF/jsp/user/userlist.jsp页面  用于显示用户列表的

  1. <body>  
  2.     <a href="add.htm">Add</a>  ${loginUser.username } ${movie }<br/>  
  3.     <%Map<String,User> users = (Map<String,User>)request.getAttribute("users");  
  4.         if(users != null){  
  5.             for(User user : users.values()){  
  6.     %>    
  7.             <%=user%>  
  8.              <a href="<%=user.getUsername()%>.htm">详细</a>  
  9.              <a href="update/<%=user.getUsername()%>.htm">修改</a>  
  10.              <a href="delete/<%=user.getUsername()%>.htm">删除</a><br/>  
  11.     <%  }  
  12.             }  
  13.     %>  
  14.     <a href="login.htm">Login</a><br/>  
  15. </body>  

【4】/WebRoot/WEB-INF/jsp/user/adduser.jsp页面  用于添加修改用户的

  1. <body>  
  2. lt;%@taglib prefix="sf" uri="http://www./tags/form" %>  
  3.   <!-- 这里form的action没写就是当前的路径 -->  
  4.   <sf:form method="post" modelAttribute="user">  
  5.     username:<sf:input path="username"/><sf:errors path="username"/><br/>  
  6.     password:<sf:password path="password"/><sf:errors path="password"/><br/>  
  7.     email:<sf:input path="email"/><sf:errors path="email"/><br/>  
  8.     <input type="submit" />  
  9.   </sf:form>  
  10. </body>  

【5】/WebRoot/WEB-INF/jsp/user/show.jsp页面  用于显示某个用户信息的
  1. <body>  
  2.     <a href="javascript:history.go(-1);">返回</a><br/>  
  3.     ${user}  
  4. </body>  

【6】/WebRoot/WEB-INF/jsp/user/login.jsp页面  用户登录的

  1. <body>  
  2.   <!-- 这里form的action没写就是当前的路径 -->  
  3.   <form method="post" action="login.htm">  
  4.     username:<input type="text" name="username"/><sf:errors path="username"/><br/>  
  5.     password:<input type="password" name="password"/><sf:errors path="password"/><br/>  
  6.     <input type="submit" />  
  7.   </form>  
  8. </body>  

【7】/WebRoot/WEB-INF/jsp/user/upload.jsp页面  用户登录的

  1. <body>  
  2.   <form method="post" action="uploads.htm" enctype="multipart/form-data">  
  3.     <input type="file" name="photos"><br/>  
  4.     <input type="file" name="photos"><br/>  
  5.     <input type="file" name="photos"><br/>  
  6.     <input type="submit" />${message }  
  7.   </form>  
  8. </body>  

整个工程的下载地址为:http://download.csdn.net/detail/wxwzy738/5224307

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多