一、输入校验:
1.客户端校验: 过滤正常用户的误操作,通过JS代码完成(可以绕开).
2.服务端校验: 整个应用阻止非法数据的最后防线(必须),使用Java代码.
3.数据库校验: 在数据库中通过约束来限制列的存储.
二、Struts2校验方式
1.编写代码方式校验:开发中常用;
2.配置校验:
2.1.基于XML配置校验(推荐使用)。
2.2.基于Annotation配置校验。
三、Struts2实现校验:
1) 要继承ActionSupport类
2) 重写ActionSupport类中实现的Validateable接口方法validate()方法 ,在该方法中完成验证。
3)对所有方法进行校验
4)对指定的方法进行校验
5)排除某些方法不校验
在struts-default.xml文件中,在validation拦截器引用时,增加排除方法。在这里的方法,都会不进行校验。
6)跳过校验
在不需要被校验的方法上,使用标签:@SkipValidation.
7)更改校验失败后,跳转的结果视图
在被校验的方法上,使用@InputConfig(resultName="update")标签
四、输入校验的原理
1) validate()方法在其他的业务方法之前执行
2) 验证出错转向的页面
struts.xml配置结果视图<result name="input">/validate.jsp</result>
其中input转向是在action中已经定义好的.
public static final String INPUT = "input";
3)什么时候表示验证出错(转向input所指向的页面)
* super.addFieldError("字段名称", "错误信息");
* 当集合不为空时,转向错误页面.
* 若校验失败,不会再执行Action中的业务方法.
校验失败,默认跳转到input结果视图. 在workflow拦截器中,如果有错误,默认的结果视图就是input.
五、示例代码
1)ValidateAction.java
package org.openbox.validate;
import org.apache.struts2.interceptor.validation.SkipValidation;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.interceptor.annotations.InputConfig;
public class ValidateAction extends ActionSupport{
private static final long serialVersionUID = 1L;
private String username;
private String password;
public void setUsername(String username) {
this.username = username;
}
public void setPassword(String password) {
this.password = password;
}
public String getUsername() {
return username;
}
public String getPassword() {
return password;
}
//1.对所有方法进行校验, 除此处排除的方法:<interceptor-ref name="validation">
//<param name="excludeMethods">input,back,cancel,browse</param>
public void validate() {
/* // 此处写校验代码
if (username==null||username.length()<6) {
this.addFieldError("username", "用户名不能为空,不少于6位!");
}
if (password==null||password.length()<6) {
this.addFieldError("password", "密码不能为空,不少于6位!");
}
//表单校验出错的结果视图,默认返回input,所以在struts-validate.xml中配置input结果页面
*/
}
public String input() {
System.out.println("input方法");
return NONE;
}
@Override
public String execute() throws Exception {
System.out.println("exe校验");
return NONE;
}
//跳过校验
@SkipValidation
public String list() {
System.out.println("list");
return NONE;
}
//更改失败后的结果视图
@InputConfig(resultName="update")
public String update() {
System.out.println("");
return NONE;
}
public String save() {
System.out.println("save方法");
return NONE;
}
public void validateSave() {
if (username==null||username.length()<6) {
this.addFieldError("username", "用户名不能为空,不少于6位!");
}
if (password==null||password.length()<6) {
this.addFieldError("password", "密码不能为空,不少于6位!");
}
}
}
2)validate.jsp(使用struts2标签)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>输入校验</title>
</head>
<body>
<br>
<br>
<s:form action="validate_save" method="post" theme="simple">
账号:<s:textfield name="username" /><s:property value="fieldErrors.username[0]"/><br>
密码:<s:textfield name="password" /><s:property value="fieldErrors.password[0]"/><br>
<s:submit value="ok" />
</s:form>
</body>
</html>
3)struts-validate.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
<package name="ValidatePkg" namespace="/" extends="struts-default">
<!-- 配置ACTION -->
<action name="validate_save" class="org.openbox.validate.ValidateAction" method="save">
<!-- 当输入校验出错时,跳转的结果视图 -->
<result name="input">/validate.jsp</result>
<allowed-methods>input,save,execute,list,update</allowed-methods>
</action>
</package>
</struts>