springMVC之增删改查

来源:互联网 发布:英语基础知识软件 编辑:程序博客网 时间:2024/04/28 05:23


来自:http://blog.csdn.net/zdp072/article/details/38691049

一、核心原理

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 plaincopyprint?在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 plaincopyprint?在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 plaincopyprint?在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 plaincopyprint?在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 plaincopyprint?在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 plaincopyprint?在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 plaincopyprint?在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 plaincopyprint?在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
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 宝骏5602挡升3挡有点卡怎么办 剥开的榴莲没熟壳又扔了怎么办 视频播放器激活码设备超限了怎么办 ai如何把右边菜单栏隐藏了怎么办 矫正牙齿粘牙齿的胶掉了怎么办 3m双面胶生产的时候胶不干怎么办 新房赠送面积没地热想接地热怎么办 教育网注册报名的用户名忘了怎么办 艺术生校考通过文化没过本线怎么办 想做主持人 但不是播音专业怎么办 微信登录版本最低登录不上怎么办 所录微课的视频声音小是怎么办 电脑开机黑屏只有光标在闪怎么办 联想家悦重装系统时驱动缺失怎么办 ps做到一半电脑重启了怎么办 宝宝起风疹怎么办 要注意的问题 惠普笔记本刚换的显卡又坏了怎么办 电脑装驱动时不注意点了跳过怎么办 刚抱回来的小猫不吃饭怎么办 三年级小孩字认的太少怎么办 孩子写字手出汗怎么办用什么笔壳 墙壁被小孩用彩色笔画花了怎么办 传图识字里有些字识别不了怎么办 一岁四个月宝宝智力发育迟缓怎么办 小打架受伤对方家长不配合怎么办 宝宝要上幼儿园了家长该怎么办 断奶涨奶怎么办又能防止乳房变形 孩子在幼儿园被小朋友打了怎么办 孩子在幼儿园被小朋友咬了怎么办 孩子被同学打了家长该怎么办? 孩子把同学打了打人家长该怎么办 孩子和同学发生矛盾家长该怎么办 孩子同学给孩子要东西家长该怎么办 如果遇到不讲理的孩子和家长怎么办 孩子调皮又被老师留校了怎么办 孩子拼音f和sh发音不清怎么办 自己在家生的孩子怎么办出生证明 在家念地藏经招来众生不走怎么办 家是济宁孩子上学想在济南上怎么办 高一孩子成绩严重下滑家长怎么办 商铺租客不交租金又不搬走怎么办