public class User { private String username; private String password; private String nickname; private String email; .... // 要加入有参构造函数和无参构造函数 }
2.创建UserController:
这里的一个重点就是, SpringMVC的Controller是单例模式的。
因此和DWR是有本质区别的 http://alleni123.iteye.com/admin/blogs/1984135
这个链接中的DWR实例我们使用了static来保持变量的一致性。
而在SpringMVC中就不需要那么做了,直接使用private map<Str,User>这样的变量就可以了。
@Controller @RequestMapping("/user") //这里表示我们访问这个控制器的时候,首先要在地址栏加入/user, public class UserController { private Map<String,User> users=new HashMap<String,User>(); public UserController(){ users.put("alleni", new User("alleni","123","小兰子","[email protected]")); users.put("eline", new User("eline","123","小李子","[email protected]")); users.put("dou", new User("dou","123","小德子","[email protected]")); System.out.println("UserController()"); } //要访问这个方法,就要在url中输入/users @RequestMapping(value="/users",method=RequestMethod.GET) //method=RequestMethod.GET表示只有get请求才会被这个方法处理。 public String list(Model model,HttpServletResponse res){ res.setContextType("utf-8"); model.addAttribute("users",users); return "user/list"; //这里表示路径WEB-INF/jsp/user/list.jsp, 也就是hello-servlet.xml中配置的prefix和suffix的值所表达的路径和后缀。 } }
在WEB-INF/jsp/user目录创建一个list.jsp文件,如下:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'list.jsp' starting page</title> </head> <body> <!-- users对应model.addAttribute("users",users)的key值 --> <c:forEach items="${users}" var="um"> ${um.value.username} ---${um.value.nickname} ---${um.value.password} ---${um.value.email} </c:forEach> </body> </html>
以上是在视图中显示用户的方法。
接下来是如何通过表单添加用户。
3.添加用户
添加用户我们首先在Controller里面加入以下两个方法:
//通过add路径,跳转到用户添加页面。当用户发送的是get请求,就会访问这里 @RequestMapping(value="/add",method=RequestMethod.GET) public String add(Model model){ //这里如果不放一个User对象到model里面,就会报错 // Neither BindingResult nor plain target object for bean name 'user' available as request attribute //因为前台会根据modelAttribute="user">的user来获取User的getter和setter方法,才能进行数据添加。 model.addAttribute(new User()); return "user/add"; } //在具体添加用户时,是POST请求,就访问这里。 //form提交的时候就会post请求了。-->sf:form method="post" @RequestMapping(value="/add",method=RequestMethod.POST) public String add(User user){ users.put(user.getUsername(), user); return "redirect:/user/users"; //redirect表示客户端跳转,也就是form被提交以后客户要跳转到的页面 //注意: 这里是用户端跳转,因此参数必须是我们的控制器的地址路径。 //这里并不是直接访问WEB-INF/下面的内容,而是访问我们控制器的RequestMapping的值所对应的方法内容,再由该方法访问WEB-INF下的页面。 }
第一个方法用于跳转到用户添加页面,并通知SpringMVC我们所要添加的对象类型。
model.addAttribute(new User());
这里还有一种方法就是通过注释来告诉SpringMVC要添加的对象类型。
public String add(@ModelAttribute("user") User user)
这里的user便是对象类型的key,也就是jsp页面的modelAttribute的值。
第二个方法用于处理用户添加请求,并在添加成功后让用户跳转到显示用户的页面。
====
用户添加页面:
<%@ taglib prefix="sf" uri="http://www.springframework.org/tags/form" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'add.jsp' starting page</title> </head> <body> <!--user对应的是model.addAttribute(new User());这里的对象类型--> <sf:form method="post" modelAttribute="user"> 用户名称:<sf:input path="username"/> 用户密码: <sf:input path="password"/> 用户昵称: <sf:input path="nickname"/> 用户邮箱: <sf:input path="email"/> <input type="submit" value="添加用户"/> </sf:form> </body> </html>
4.验证用户信息
我们可以通过实现JSR303标准的validator工具来帮助验证用户信息。
最常见就是Hibernate提供的validator
4.1 加入hibernate-validator
<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>4.3.1.Final</version> </dependency>
4.2修改User.java类,分别在getter上加入注释:
@NotEmpty(message="用户名不能为空") public String getUsername() { return username; } @Range(min=3,max=10,message="密码的长度必须在3-10之间") public String getPassword() { return password; } @Email(message="邮箱的格式不正确") public String getEmail() { return email; }
4.3 修改Controller里面的接受POST请求的方法,加入验证注释
@RequestMapping(value="/add",method=RequestMethod.POST) public String add(@Validated User user, BindingResult result){ //BindResult是验证结果类,必须紧跟@Validator 类后面,否则会报错。 if(result.hasErrors()){ //说明有错误 return "user/add"; //有错误则跳转到add视图中, } ...}
4.4 修改add.jsp页面,加入错误信息的显示
<sf:form method="post" modelAttribute="user"> 用户名称:<sf:input path="username"/><sf:errors path="username"/><br/> 用户密码: <sf:input path="password"/><sf:errors path="password"/><br/> 用户昵称: <sf:input path="nickname"/> <br/> 用户邮箱: <sf:input path="email"/><sf:errors path="email"/><br/> <input type="submit" value="添加用户"/> </sf:form>
这里我第一次测试的时候没有出现预期的错误信息。
找了半天原因,才发现是hello-servlet.xml配置文件的问题。
这里必须要加入
<!-- JSR-303 support will be detected on classpath and enabled automatically --><mvc:annotation-driven/>
这里在Spring reference文件中查找一下Configuring a JSR-303 Validator for use by Spring MVC就能看到具体说明