Spring学习之旅(六) 表单校验以及Spring标签库的使用

辛苦堆砌,转载请注明出处,谢谢!

        本篇文章对上一篇文章的项目做进一步重构,使结构更加良好。我们要添加表单验证,首先要在实体类上添加一些注解,项目需要添加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标签库的使用,其他标签可以自己学习一下,可以在一定程度上简化开发。










  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值