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

来源:互联网 发布:量子计算机 ibm 知乎 编辑:程序博客网 时间:2024/06/05 10:20

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

        本篇文章对上一篇文章的项目做进一步重构,使结构更加良好。我们要添加表单验证,首先要在实体类上添加一些注解,项目需要添加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;@Controllerpublic class LoginController {@Autowiredprivate 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;@Controllerpublic class RegisterController {@Autowiredprivate 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 0
原创粉丝点击