提到校验,大家想的最多的可能就是ajax加jQuery实现异步校验,可是校验不止客户端校验,服务器端也必须校验,这是我们程序猿必须具备的严谨,因为,如果我们疏忽了,很可能导致系统不能被使用。
小狼今天就来说说struts2框架提供的校验。
struts2的校验有两种
1、在action动作类中重写validate()方法
2、在action动作类包下面创建actionClassName-validation.xml
我们先来说说第一种方法
我们在jsp中先写一下
<%@ page language="java" pageEncoding="UTF-8" contentType="text/html; charset=utf-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<html>
<head>
<title>登陆测试</title>
</head>
<body>
<br>
<s:fielderror/>
<s:form name="loginForm" method="post" action="validateAction_login.love" theme="simple" >
<table border="1">
<tr>
<td>用户名</td>
<td> <s:textfield name="username" /></td>
</tr>
<tr>
<td>密码</td>
<td><s:password name="password" /></td>
</tr>
<tr>
<td> </td>
<td><s:submit value="登陆"/></td>
</tr>
</table>
</s:form>
</body>
<a href="validateAction_test.love">test其他的方法</a>
</html>
先看那个表单,下面的链接我们待会儿说。
创建一个action类,并配置一下自定义的struts.xml。把工程跑通。
我们点登陆就直接返回success.jsp了,没有做任何校验的工作。
我们现在在action类中重写一个validate()方法.
package zcy.test.validate;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import qh.Log;
import com.opensymphony.xwork2.ActionSupport;
@SuppressWarnings("serial")
public class ValidateAction extends ActionSupport {
private String username;
private String password;
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 void validate() {
// TODO Auto-generated method stub
if(username==null||username.equals("")){
this.addFieldError("username", "用户名不为空");
}
if(password==null||password.equals("")){
this.addFieldError("password", "密码不为空");
}else{
String pattern = "^[0-9a-zA-Z]{6,12}$";
Pattern p = Pattern.compile(pattern);
Matcher m = p.matcher(password);
boolean b = m.matches();
if(!b){
this.addFieldError("error", "密码的长度必须在6至12之间!");
}
}
}
public String login(){
Log.getLog().info("ValidateAction **********login()");
Log.getLog().info("username="+username);
Log.getLog().info("password="+password);
return SUCCESS;
}
public String test(){
Log.getLog().info("ValidateAction **********test()");
return SUCCESS;
}
}
这里小狼把整个action都贴出来了,当然大家看的时候最重要的还是validate()方法。这里的执行顺序是这样的,先从客户端获取username,password的值即get/set方法。然后进行校验即validate()方法。最后执行public String login(){}
什么都不填再来执行登陆,校验有效果了。
我们再来看下面的那行链接
login.jsp
<a href="validateAction_test.love">test其他的方法</a>
如果我们同样在表单中什么都不填,直接执行下面的这行链接,让他直接跳到success页面,会发现struts还是执行了我们的校验。
这种时候,让我们写两遍action,显然是不可取的。我们可以在action动作类中的validate()方法的名称改成validateLogin(),这里的Login是上文想要校验的login方法。这样就ok了。
我们再来看第二种方法xml
一样的,我们先来看jsp页面,这里我们给它取个名字loginXml.jsp
<%@ page language="java" pageEncoding="UTF-8" contentType="text/html; charset=utf-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<html>
<head>
<title>My JSP 'login.jsp' starting page</title>
</head>
<body>xml页面
<br>
<s:fielderror/>
<s:form name="loginForm" method="post" namespace="/validate"
action="validateXmlAction_login.love" theme="simple" >
<table border="1">
<tr>
<td>用户名</td>
<td> <s:textfield name="username" /></td>
</tr>
<tr>
<td>密码</td>
<td><s:password name="psw" /></td>
</tr>
<tr>
<td>年龄(不能小于0)</td>
<td> <s:textfield name="age" /></td>
</tr>
<tr>
<td> </td>
<td><s:submit value="登陆"/></td>
</tr>
</table>
</s:form>
<a href="validateXmlAction_test.love">test其他的方法</a>
</body>
</html>
同样的下面的链接先不看,先把工程跑通,创建一个action类,配置一下。
这回,我们在action类中不重写validate()方法。在action的包下面创建一个xml。
actionClassName-validation.xml,当然跟上文一样我们要指定对哪个跳转的方法实行校验,最好这么写
actionClassName-actionName-validation.xml
这里小狼贴一下取的名字ValidateXmlAction-validateXmlAction_login-validation.xml
小狼的xml是这么写的
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
"-//Apache Struts//XWork Validator 1.0.3//EN"
"http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
<validators>
<field name="username">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message><![CDATA[用户名不为空]]></message>
</field-validator>
</field>
<field name="password">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message><![CDATA[密码不为空]]></message>
</field-validator>
<field-validator type="stringlength">
<param name="minLength">6</param>
<param name="maxLength">10</param>
<message><![CDATA[密码的长度在6-10之间]]></message>
</field-validator>
</field>
</validators>
我们在跑一下工程,没有报错,执行指定actionMethod的校验,跳转到指定页面,ok