Struts2 的验证规则大概有以下数种:
required:必填校验器
requiredstring:必填字符串校验器
int:整数校验器
double:双精度浮点数校验器
date:日期校验器
expression:表达式校验器
fieldexpression:字段表达式校验器
email:电子邮件校验器
url:网址校验器
visitor:Visitor校验器
conversion:转换校验器
stringlength:字符串长度校验器
regex:正则表达式校验器
常用的验证规则:
1。必填检验
<validators>
<field name="username">
<field-validator type="required">
<message>指定检验失败的提示信息</message>
</field-validator>
</field>
</validators>
2。必填字符串检验
<validators>
<field name="username">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>指定检验失败的提示信息</message>
</field-validator>
</field>
</validators>
3。整数检验器/浮点检验
<validators>
<field name="age">
<field-validator type="int">
<param name="min">1</param>
<param name="max">150</param>
<message>年纪必须在1到150之间</message>
</field-validator>
</field>
</validators>
4。日期检验
<validators>
<field name="birth">
<field-validator type="date">
<param name="min">1900-01-01</param>
<param name="max">2050-02-21</param>
<message key="birth.range"/>
</field-validator>
</field>
</validators>
5.字段表达式检验器(要求指定字段满足一个逻辑表达式)
<validators>
<field name="re_pass">
<field-validator type="fieldexpression">
<!--指定逻辑表达式 -->
<param name="expression"> (pass eq re_pass)</param>
<message>密码必须和确认密码相等</message>
</field-validator>
</field>
</validators>
6.邮件地址校验
<validators>
<field name="email">
<field-validator type="email">
<message>你的电子邮件地址必须是一个有效的电邮地址</message>
</field-validator>
</field>
</validators>
7。网址
检验
<validators>
<field name="url">
<field-validator type="url">
<message>你的主页地址必须是一个有效的网址</message>
</field-validator>
</field>
</validators>
8.字符串长度检验
<validators>
<field name="user">
<field-validator type="stringlength">
<param name="minlength">4</param>
<param name="maxlength">20</param>
<message>你的用户名长度必须在4到20之间</message>
</field-validator>
</field>
</validators>
9.正则表达式检验
<validators>
<field name="user">
<field-validator type="regex">
<param name="expression_r"><![CDATA[(\w{4,25})]]></param>
<message>您输入的用户名只能是字母和数组,且长度必须在4到25之间</message>
</field-validator>
</field>
</validators>
实例
login.jsp
- <%@ page language="<a href="http://lib.youkuaiyun.com/base/javase" class='replace_word' title="Java SE知识库" target='_blank' style='color:#df3434; font-weight:bold;'>Java</a>" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
- <%@taglib prefix="s" uri="/struts-tags" %>
- <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- <title></title>
- </head>
- <body>
-
- <s:form action="login" validate="true">
- <s:textfield name="username" label="用户名"></s:textfield>
- <s:password name="password" label="密 码"></s:password>
- <s:submit value="提交"></s:submit>
- </s:form>
- </body>
- </html>
LoginAction.java
- package com.petrochina.action.system;
-
- import com.opensymphony.xwork2.ActionSupport;
-
- public class LoginAction extends ActionSupport {
-
- private static final long serialVersionUID = 1L;
- private String username;
- private String password;
-
- @Override
- public String execute() throws Exception {
- if (getUsername().equals("admin") && getPassword().equals("admin")) {
- return SUCCESS;
- } else {
- return INPUT;
- }
- }
-
- 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;
- }
- }
校验文件LoginAction-validation.xml,其生成路径要和LoginAction.class在一起.
- <?xml version="1.0" encoding="UTF-8"?>
-
- <!DOCTYPE validators PUBLIC
- "-//OpenSymphony Group//XWork Validator 1.0.2//EN"
- "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
- <validators>
-
- <field name="username">
-
- <field-validator type="requiredstring">
-
- <message key="user.required"/>
- </field-validator>
- </field>
-
- <field name="password">
-
- <field-validator type="requiredstring">
- <message key="pass.required"></message>
- </field-validator>
-
- <field-validator type="stringlength">
- <param name="minLength">3</param>
- <param name="maxLength">6</param>
- <message key="pass.length"></message>
- </field-validator>
- </field>
- </validators>
struts.xml
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"
- "http://struts.apache.org/dtds/struts-2.1.dtd">
- <struts>
-
-
-
- <constant name="struts.custom.i18n.resources" value="messageResource"/>
-
- <constant name="struts.i18n.reload" value="true"/>
-
- <constant name="struts.i18n.encoding" value="UTF-8"/>
-
-
- <package name="mystruts" extends="struts-default">
- <action name="login" class="com.petrochina.action.system.LoginAction">
- <result name="success">/welcome.jsp</result>
-
- <result name="input">/login.jsp</result>
- </action>
- </package>
- </struts>
国际化资源文件messageResource_zh_CN.properties
- #struts校验
- user.required=用户名不能为空
- pass.required=密码不能为空
- pass.length=密码必须是3到6位
文件结构:

登录页面:

不输入任何内容,点击"提交",效果如下:

可见对LoginAction中的password属性定义的两个校验器都起作用了,但如果这两个校验信息同时显示有点冗余,此时可以通过设置short-circuit="true"来配置校验器短路.修改后的LoginAction-validation.xml中password字段的定义如下:
-
- <field name="password">
-
- <field-validator type="requiredstring" short-circuit="true">
- <message key="pass.required"></message>
- </field-validator>
-
- <field-validator type="stringlength">
- <param name="minLength">3</param>
- <param name="maxLength">6</param>
- <message key="pass.length"></message>
- </field-validator>
- </field>
这样如果密码为空就提交的话只会提示"密码不能为空",效果如下:

PS:直接访问jsp页面(http://localhost:8080/struts/login.jsp)会报错:

但是通过action(http://localhost:8080/struts/login.action)就可以正常访问,去掉struts的客户端验证(在jsp页面的form表单中去掉validate="true"属性)也可以正常访问.在网上查了一下资料,大家的解决方法都是走action.个人觉得原因是:通过Action访问Struts2会加载LoginAction-validation.xml,从而读取配置的校验器信息,根据配置的校验器信息生成客户端校验脚本(JavaScript),如果直接访问jsp页面那么就获取不到校验器信息(Method public java.util.List org.apache.struts2.components.Form.getValidators(java.lang.String) threw an exception when invoked on org.apache.struts2.components.Form@18db6e1 - Class: freemarker.ext.beans.SimpleMethodModel),从而无法生成客户端脚本.