struts.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="user" extends="struts-default">
<action name="user_*" class="com.struts.validation.UserAction" method="{1}">
<result name="success">/index.jsp</result>
<%-- 配置错误视图:显示校验错误信息 -->
<result name="input">/error.jsp</result>
</action>
</package>
</struts>
User.java:
package com.struts.validation;
import java.util.Date;
public class User {
private String username;
private String password;
private String email;
private Date birth;
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;
}
public Date getBirth() {
return birth;
}
public void setBirth(Date birth) {
this.birth = birth;
}
@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
", email='" + email + '\'' +
", birth=" + birth +
'}';
}
}
register.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/user_register" method="post">
用户名:<input type="text" name="user.username"><br>
密码:<input type="password" name="user.password"><br>
邮箱:<input type="text" name="user.email"><br>
生日:<input type="text" name="user.birth"><br>
<input type="submit" value="注册">
</form>
</body>
</html>
error.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%-- 显示校验错误信息 --%>
<s:fielderror/>
</body>
</html>
1、通过代码方式验证 action 中所有的方法:
UserAction.java:
package com.struts.validation;
import com.opensymphony.xwork2.ActionSupport;
/**
* 表单数据的校验:
* 前台校验:主要是通过 js 验证,表单数据是否合法;
* 后台校验:通过后台 java 代码进行验证;
*
* struts 的数据校验是通过拦截器完成的:
* <interceptor
* name="validation"
* class="org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor"/>
*
* 验证方式:
* 代码方式验证 action 中所有的方法:
* 代码方式验证 action 中指定的方法:
* XML 方式验证 action 中所有的方法:
* XML 方式验证 action 中指定的方法:
*
* 要想使用 struts 的数据校验功能,必须继承 ActionSupport;
*/
public class UserAction extends ActionSupport {
// 封装表单提交的数据
User user = new User();
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
// 重写数据校验的方法:验证 action 中的所有方法
@Override
public void validate() {
// 用户名非空校验
if (user.getUsername() == null || "".equals(user.getUsername())){
addFieldError("username", "用户名不能为空");
}
// 密码非空校验
if (user.getPassword() == null || user.getPassword().equals("")){
addFieldError("password", "密码不能为空");
}
}
// 注册业务方法:希望数据校验
public String register(){
System.out.println(user);
return SUCCESS;
}
// 列表展示业务方法:不希望数据校验,直接执行该业务方法;但是 validate() 会验证所有方法;
public String list(){
System.out.println("list");
return SUCCESS;
}
}
2、通过代码方式验证 action 中指定的方法:
UserAction.java:
package com.struts.validation;
import com.opensymphony.xwork2.ActionSupport;
public class UserAction extends ActionSupport {
// 封装表单提交的数据
User user = new User();
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
// 数据校验的方法:只验证 register 方法
// 校验指定的方法编写规范:validate + 被校验的方法(首字母大写)
public void validateRegister() {
// 用户名非空校验
if (user.getUsername() == null || "".equals(user.getUsername())){
addFieldError("username", "用户名不能为空");
}
// 密码非空校验
if (user.getPassword() == null || user.getPassword().equals("")){
addFieldError("password", "密码不能为空");
}
}
// 注册业务方法:希望数据校验
public String register(){
System.out.println(user);
return SUCCESS;
}
// 列表展示业务方法:不希望数据校验,直接执行该业务方法;
// 数据校验的方法 validateRegister(),只会校验 register 方法;
public String list(){
System.out.println("list");
return SUCCESS;
}
}
如果校验失败:用户名和密码为空,则跳转到错误视图,显示校验错误信息,如下:
代码验证:
优点:比较灵活,可以满足所有的需求;
缺点:比较繁琐,要写重复的判断验证逻辑;
适合:表单字段较少的情况用。