Spring MVC 实现增删改查

来源:互联网 发布:淘宝发安能物流好恶心 编辑:程序博客网 时间:2024/05/01 10:48

一、核心原理

1. 用于发送请求给服务器: /home.htm

2. 请求被DispatchServlet拦截到

3. DispatchServlet通过HandleMapping检查url有没有对应的Controller, 如果有则调用Controller

4. Controller开始执行业务逻辑

5. Controller执行完毕后, 如果返回字符串, 则ViewResolver将字符串转化成相应的视图对象;

如果返回ModelAndView对象, 该对象本身就包含了视图对象信息.

6. DispatchServlet将视图对象中的数据输出给服务器.

7. 服务器将数据输出给客户端.

二、REST风格

1. 查询:
传统:  /user_query?id=123
rest: /user/123
2. 删除:
传统:  /user_delete?id=123
rest: /user/123/delete
3. 更新:
传统:  /user_update?id=123
rest: /user/123/update
4. 列表:
传统:  /user_list
rest: /user/users


三、增删改查

1. 代码结构



2. web.xml 配置DispatchServlet

[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
  3.          xmlns="http://java.sun.com/xml/ns/javaee"   
  4.          xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   
  5.          http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">  
  6.            
  7.   <!-- user需要和配置文件user-servlet.xml名字对应 -->  
  8.   <servlet>  
  9.     <servlet-name>user</servlet-name>  
  10.     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
  11.     <load-on-startup>1</load-on-startup>  
  12.   </servlet>  
  13.   <servlet-mapping>  
  14.     <servlet-name>user</servlet-name>  
  15.     <url-pattern>/</url-pattern>  
  16.   </servlet-mapping>  
  17.     
  18.   <!-- 配置过滤器, 设置编码为UTF-8 -->  
  19.   <filter>  
  20.         <filter-name>CharacterFilter</filter-name>  
  21.         <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>  
  22.         <init-param>  
  23.             <param-name>encoding</param-name>  
  24.             <param-value>UTF-8</param-value>  
  25.         </init-param>  
  26.     </filter>  
  27.     <filter-mapping>  
  28.         <filter-name>CharacterFilter</filter-name>  
  29.         <url-pattern>/*</url-pattern>  
  30.     </filter-mapping>  
  31. </web-app>  

 <load-on-startup>1</load-on-startup>是启动顺序,让这个Servlet随Servletp容器一起启动。

 <url-pattern>/</url-pattern> 会拦截所有的请求。

在DispatcherServlet的初始化过程中,框架会在web应用的 WEB-INF文件夹下寻找名为[servlet-name]-servlet.xml 的配置文件,

生成文件中定义的bean。我们配的是user,所以它会找到user-servlet.xml文件。


3. user-servlet.xml

[html] view plaincopy在CODE上查看代码片派生到我的代码片
  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:context="http://www.springframework.org/schema/context"  
  5.     xmlns:mvc="http://www.springframework.org/schema/mvc"  
  6.     xsi:schemaLocation="http://www.springframework.org/schema/mvc   
  7.         http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd  
  8.         http://www.springframework.org/schema/beans   
  9.         http://www.springframework.org/schema/beans/spring-beans.xsd  
  10.         http://www.springframework.org/schema/context   
  11.         http://www.springframework.org/schema/context/spring-context-3.1.xsd">  
  12.       
  13.     <!-- spring自动扫描的包名 -->  
  14.     <context:component-scan base-package="com.zdp"></context:component-scan>  
  15.       
  16.     <!-- 使用spring注解 -->  
  17.     <mvc:annotation-driven />  
  18.       
  19.     <!-- 设置返回url前缀和后缀 -->  
  20.     <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">  
  21.         <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>  
  22.         <property name="prefix" value="/WEB-INF/jsp/"></property>  
  23.         <property name="suffix" value=".jsp"></property>  
  24.     </bean>  
  25.       
  26.     <!-- 指明静态资源位置 -->  
  27.     <mvc:resources location="/WEB-INF/resources/" mapping="/resources/**"/>  
  28. </beans>  

<context:component-scan/> 扫描指定的包中的类上的注解,常用的注解有:

@Controller 声明Action组件
@Service  声明Service组件    @Service("userService") 
@Repository 声明Dao组件
@Component 泛指组件, 当不好归类时. 
@RequestMapping("/user") 将url和类绑定 

@RequestParam("name") String username   用于将指定的请求参数赋给方法中的形参, 如果请求参数名称和形参一致, 则不需要这种写法

@Resource 用于注入,( j2ee提供的 ) 默认按名称装配,@Resource(name="beanName") 
@Autowired 用于注入,(srping提供的) 默认按类型装配 
@Transactional( rollbackFor={Exception.class}) 事务管理
@ResponseBody
@Scope("prototype")   设定bean的作用域

/WEB-INF/resources映射到ResourceHttpRequestHandler进行处理,location指定静态资源的位置.

配置了<mvc:annotation-driven />,spring会自动帮我们注册这个bean,就不须要我们显示的注册这个bean了。

4. User.java

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. /** 
  2.  * 实体类 
  3.  */  
  4. public class User {  
  5.     private String username;  
  6.     private String password;  
  7.   
  8.     public User() {  
  9.           
  10.     }  
  11.   
  12.     public User(String username, String password) {  
  13.         this.username = username;  
  14.         this.password = password;  
  15.     }  
  16.       
  17.     @NotEmpty(message="用户名不能为空")  
  18.     public String getUsername() {  
  19.         return username;  
  20.     }  
  21.   
  22.     public void setUsername(String username) {  
  23.         this.username = username;  
  24.     }  
  25.       
  26.     @Size(min=1,max=10,message="密码的长度应该在1和10之间")  
  27.     public String getPassword() {  
  28.         return password;  
  29.     }  
  30.   
  31.     public void setPassword(String password) {  
  32.         this.password = password;  
  33.     }  
  34. }  

5. UserController.java

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. @Controller  
  2. @RequestMapping("/user")  
  3. public class UserController {  
  4.     // 使用map模拟数据库   
  5.     private Map<String, User> userMap = new HashMap<String, User>();  
  6.   
  7.     public UserController() {  
  8.         userMap.put("zhangsan"new User("zhangsan""123"));  
  9.         userMap.put("lishimin"new User("lishimin""456"));  
  10.     }  
  11.   
  12.     // 获取用户列表   
  13.     // 访问方法: http://localhost/springmvc_user/user/users  
  14.     @RequestMapping(value = "/users", method = RequestMethod.GET)  
  15.     public String list(Model model) {  
  16.         model.addAttribute("users", userMap);  
  17.         return "/user/list";  
  18.     }  
  19.   
  20.     // 跳转到添加用户页面(get请求)  
  21.     // 访问方法: http://localhost/springmvc_user/user/add  
  22.     @RequestMapping(value = "/add", method = RequestMethod.GET)  
  23.     public String add(@ModelAttribute("user") User user) {  
  24.         return "user/add";  
  25.     }  
  26.   
  27.     // 具体的添加用户处理方法(post请求)   
  28.     // 注意: BindingResult必须在User之后, 中间不能有其他的参数  
  29.     @RequestMapping(value = "/add", method = RequestMethod.POST)  
  30.     public String add(@Validated User user, BindingResult br) throws IOException { // @Validated: 对User数据进行校验  
  31.         if (br.hasErrors()) {  
  32.             return "user/add"// 如果有错误, 则直接跳转到add添加用户页面  
  33.         }  
  34.         userMap.put(user.getUsername(), user);  
  35.         return "redirect:/user/users"// 重定向到用户列表页面  
  36.     }  
  37.       
  38.     // 查看用户信息  
  39.     // 访问方法: http://localhost/springmvc_user/user/zhangsan  
  40.     @RequestMapping(value="/{username}", method=RequestMethod.GET)  
  41.     public String show(@PathVariable String username, Model model) { // @PathVariable: 路径里面的值作为参数  
  42.         model.addAttribute(userMap.get(username));   
  43.         return "user/show";  
  44.     }  
  45.       
  46.     // 跳转到修改用户信息页面  
  47.     // 访问方法: http://localhost/springmvc_user/zhangsan/update  
  48.     @RequestMapping(value="/{username}/update", method=RequestMethod.GET)   
  49.     public String update(@PathVariable String username, Model model) { // @PathVariable: 路径里面的值作为参数  
  50.         model.addAttribute(userMap.get(username)); // 等同: model.addAttribute("user", userMap.get(username));  
  51.         return "user/update";  
  52.     }  
  53.       
  54.     // 具体的修改用户处理方法(post请求)   
  55.     // 注意: BindingResult必须在User之后, 中间不能有其他的参数  
  56.     @RequestMapping(value="/{username}/update", method=RequestMethod.POST)  
  57.     public String update(@PathVariable String username, @Validated User user, BindingResult br) {  
  58.         if(br.hasErrors()) {  
  59.             return "user/update"// 如果有错误, 则直接跳转到update修改用户页面  
  60.         }  
  61.         userMap.remove(username);  
  62.         userMap.put(user.getUsername(), user);  
  63.         return "redirect:/user/users";  
  64.     }  
  65.       
  66.     // 删除用户信息  
  67.     // 访问方法: http://localhost/springmvc_user/zhangsan/delete  
  68.     @RequestMapping(value="/{username}/delete",method=RequestMethod.GET)  
  69.     public String delete(@PathVariable String username) {  
  70.         userMap.remove(username);  
  71.         return "redirect:/user/users";  
  72.     }  
  73.       
  74. }  

一般建议返回字符串, 但我们也可以返回ModelMap、ModelAndView、map、List、Set、Object、无返回值。 

返回字符串: 根据返回值找对应的显示页面。路径规则为:prefix前缀 + 返回值 + suffix后缀组成



6. jsp pages

① list.jsp

[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>  
  2. <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>  
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
  4. <html>  
  5. <head>  
  6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
  7. <title>用户列表 </title>  
  8. <!-- 引入静态文件, 需要在user-servlet.xml配置映射关系 -->  
  9. <link rel="stylesheet" href="<%=request.getContextPath()%>/resources/css/main.css" type="text/css">  
  10. </head>  
  11. <body>  
  12. <a href="add">添加</a>  
  13. <br/>  
  14.     <c:forEach items="${users}" var="usermap">  
  15.         <a href="${usermap.value.username}">${usermap.value.username}</a>  
  16.         -- <a href="${usermap.value.username}/update">修改</a>  
  17.         -- <a href="${usermap.value.username}/delete">删除</a><br/>  
  18.     </c:forEach>  
  19. </body>  
  20. </html>  

② add.jsp

[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>  
  2. <%@ taglib prefix="sf" uri="http://www.springframework.org/tags/form" %>  
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
  4. <html>  
  5. <head>  
  6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
  7. <title>添加用户</title>  
  8. </head>  
  9. <body>  
  10. <!-- 如没写action, 也会提交给add(匹配文件名) -->  
  11. <sf:form method="post" modelAttribute="user" action="add">  
  12.     Username:<sf:input path="username"/><sf:errors path="username"/><br/>  
  13.     Password:<sf:password path="password"/><sf:errors path="password"/><br/>  
  14.     <input type="submit" value="添加用户"/>  
  15. </sf:form>  
  16. </body>  
  17. </html>  
③ show.jsp

[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>  
  2. <%@ taglib prefix="sf" uri="http://www.springframework.org/tags/form" %>  
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
  4. <html>  
  5. <head>  
  6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
  7. <title>用户详细信息</title>  
  8. </head>  
  9. <body>  
  10.     Username:${user.username}<br/>  
  11.     Password:${user.password}<br/>  
  12. </body>  
  13. </html>  
④ update.jsp

[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>  
  2. <%@ taglib prefix="sf" uri="http://www.springframework.org/tags/form" %>  
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
  4. <html>  
  5. <head>  
  6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
  7. <title>修改用户</title>  
  8. </head>  
  9. <body>  
  10. <!-- 如没写action, 也会提交给update(匹配文件名) -->  
  11. <sf:form method="post" modelAttribute="user" action="update">  
  12.     Username:<sf:input path="username"/><sf:errors path="username"/><br/>  
  13.     Password:<sf:password path="password"/><sf:errors path="password"/><br/>  
  14.     <input type="submit" value="修改用户"/>  
  15. </sf:form>  
  16. </body>  
  17. </html>  
0 0
原创粉丝点击