辛苦堆砌,转载请注明出处,谢谢!
本篇文章对上一篇文章的项目做进一步重构,使结构更加良好。我们要添加表单验证,首先要在实体类上添加一些注解,项目需要添加hibernate-validator依赖,使用javax.validation.contraints包,添加注解后的实体类如下:
package com.yjp.springmvc.blog.beans.model;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;
import org.hibernate.annotations.GenericGenerator;
@Entity
@Table(name="users")
public class User implements Serializable {
private static final long serialVersionUID = 9038460243059691075L;
@Id
@GenericGenerator(strategy = "assigned", name = "username")
@NotNull(message="用户名不能为空")
@Size(min=1, max=16, message="用户名长度为1-16字符")
private String username;
@Column
@NotNull(message="密码不能为空")
@Size(min=1, max=25, message="密码长度为1-25字符")
private String password;
@Column
@Pattern(regexp="^[0-9a-zA-Z]{1,}@[0-9a-zA-Z]{1,}\\.(com|cn)$",
message="邮箱格式不正确")
private String email;
public User() {}
public User(String username, String password, String email) {
this.username = username;
this.password = password;
this.email = email;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
用户名和密码不能为空,且有长度限制,邮箱有格式限制,添加注解后,message的内容在出错时可以用来显示。为了显示错误和使用Spring标签库,我们修改两个控制器:
package com.yjp.springmvc.blog.web.controller;
import javax.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.Errors;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import com.yjp.springmvc.blog.beans.model.User;
import com.yjp.springmvc.blog.beans.service.UserService;
@Controller
public class LoginController {
@Autowired
private UserService userService;
@RequestMapping(method=RequestMethod.GET, value="/")
public String login(Model model) {
model.addAttribute(new User());
return "login";
}
@RequestMapping(method=RequestMethod.POST, value="/checkUser")
public String checkUser(@Valid User user, Errors errors,
Model model) {
if (errors.hasErrors()) {
return "login";
}
if (userService.checkUser(user)) {
return "success";
} else {
return "fail";
}
}
}
先看看我们的LoginController,login方法会填充一个user属性,然后才会跳转到login.jsp,这是为了后面使用Spring标签做准备,我们可以通过Model提供一个对象给jsp,Spring标签库可以对对象属性进行操作。checkUser方法变化比较大,首先,上一篇文章使用@RequestParam注解的参数替换为一个User对象,实际上Spring可以按照请求参数的名称,赋值我们的User对象对应的属性。User参数前添加了@Valid注解,说明会校验User对象的属性,参数列表中添加了一个Errors类型的参数,如果验证出现错误,Spring会填充errors对象,我们会停止请求的处理,返回到发出请求的页面。注意参数的顺序,否则Spring会报错,自己也可以专门搞错,看看报的错误。同样,给出RegisterController,基本上改动相似:
package com.yjp.springmvc.blog.web.controller;
import javax.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.Errors;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import com.yjp.springmvc.blog.beans.model.User;
import com.yjp.springmvc.blog.beans.service.UserService;
@Controller
public class RegisterController {
@Autowired
private UserService userService;
@RequestMapping(method=RequestMethod.GET, value="/registerPage")
public String registerPage(Model model) {
model.addAttribute(new User());
return "register";
}
@RequestMapping(method=RequestMethod.POST, value="/register")
public String register(@Valid User user, Errors errors,
Model model) {
if (errors.hasErrors()) {
return "register";
}
if (userService.saveUser(user)) {
return "success";
} else {
return "fail";
}
}
}
最后,看一下页面如何展示我们的错误。首先是login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page isELIgnored="false"%>
<%@ taglib prefix="sf" uri="http://www.springframework.org/tags/form" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>简微</title>
<link rel="stylesheet" type="text/css" href="resources/css/login.css">
<link rel="stylesheet" type="text/css" href="resources/css/error.css">
</head>
<body>
<div class="loginPanel">
<div>
<img src="resources/images/logo.png" alt="简微"/>
</div>
<sf:form method="post" action="checkUser" commandName="user">
<table>
<tr>
<td colspan="2" align="center" style="font-weight:bold">会员登录</td>
</tr>
<tr>
<td>名称:</td>
<td><sf:input type="text" path="username" cssErrorClass="error"/></td>
</tr>
<tr>
<td colspan="2" align="center"><sf:errors path="username" cssClass="error"/></td>
</tr>
<tr>
<td>密码:</td>
<td><sf:input type="password" path="password" cssErrorClass="error"/></td>
</tr>
<tr>
<td colspan="2" align="center"><sf:errors path="password" cssClass="error"/></td>
</tr>
<tr>
<td colspan="2" align="center"><input type="submit" value="登入"></td>
</tr>
<tr>
<td align="center"><a href="registerPage">注册</a></td>
<td align="center"><a href="forgotPage">忘记密码?</a></td>
</tr>
</table>
</sf:form>
</div>
<div>
<h1>简微</h1>
<ul>
<li>说你想说</li>
<li>看你想看</li>
<li>就这么简单</li>
</ul>
</div>
</body>
</html>
我们添加了标签库
<%@ taglib prefix="sf" uri="http://www.springframework.org/tags/form" %>
启用Spring的form标签库,首先我们使用了<sf:form>标签,commandName属性,可以绑定一个对象,之后的<sf:input>标签,可以通过path属性,将该对象的属性赋值给input标签的value属性,然后我们使用了<sf:input>标签,并添加了一个cssErrorClass属性,如果查看最终显示的html,你会发现,我们这里的<sf:input>标签为(以username为例):
<input id="username" name="username" class="error" type="text" value=""/>
可以看到,由于使用cssErrorClass,input添加了一个class属性为error,这就给我们定制自己css的机会,稍后会看到。接下来,我们还使用了<sf:errors>标签,显示错误信息,其中也定义了cssClass属性,最终被转义成:
<span id="username.errors" class="error">用户名长度为1-16字符</span>
可以看到,是一个有class属性的span
基于以上的内容,我们简单定义一个CSS文件,error.css
@CHARSET "UTF-8";
input.error {
border: 2px solid red;
}
span.error {
font-family: 微软雅黑;
font-size: 12px;
color: red;
}
本篇文章,我们完成了表单的后台验证,还看了Spring标签库的使用,其他标签可以自己学习一下,可以在一定程度上简化开发。