<s:textfield name="user.username" label="用户名"/>
这个name与你action中的javabean联系起来,会自己收集值(前提是你在action 中引入了user有get/set方法 ,且user实现 了javabean特点类)
而labe是用来显示这个框是用来干吗的,效果如图 :
代码是:
如果要实现表单验证:
在struts.xml中对应的action中result必须有一个是input返回的字符串
如果只想显示某个错误!
<-------------------------------------------------------------------------------------第二种:用配置文件的方式来实现------------------------------------------------------------------------------------------------->
配置文件 里的内容为:
效果如图:
action还是必须继承actionsupport
<------------------------------------------------------------------------------------动作校验------------------------------------------------------------------------------------------------->
需求是这样的:当你填年龄的时候,你必须填的比你账户的数值大:
AddUserAction-validation.xml文件中的源码是:
<!DOCTYPE validators PUBLIC
"-//Apache Struts//XWork Validator 1.0.2//EN"
"http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd">
<validators>
<field name="user.username">
<field-validator type="requiredstring">
<message>请输入用户名</message>
</field-validator>
</field>
<field name="user.password">
<field-validator type="requiredstring">
<message>请输入密码</message>
</field-validator>
</field>
<field name="user.password">
<field-validator type="requiredstring">
<message>请输入密码</message>
</field-validator>
</field>
<validator type="expression"><param name="expression"><![CDATA[user.age>=user.account]]></param>
<message>年龄必须在${user.account}岁以上,你输入的是${user.age}</message>
</validator>
</validators>
需要在input对应的页面中加入<s:actionerror/>
在xwork-core-2.3.16.jar包下的com.opensymphony.xwork2.validator.包中可以找到default.xml,里面有些我们需要的信息
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
"-//Apache Struts//XWork Validator Definition 1.0//EN"
"http://struts.apache.org/dtds/xwork-validator-definition-1.0.dtd">
<!-- START SNIPPET: validators-default -->
<validators>
<validator name="required" class="com.opensymphony.xwork2.validator.validators.RequiredFieldValidator"/>
<validator name="requiredstring" class="com.opensymphony.xwork2.validator.validators.RequiredStringValidator"/>
<validator name="int" class="com.opensymphony.xwork2.validator.validators.IntRangeFieldValidator"/>
<validator name="long" class="com.opensymphony.xwork2.validator.validators.LongRangeFieldValidator"/>
<validator name="short" class="com.opensymphony.xwork2.validator.validators.ShortRangeFieldValidator"/>
<validator name="double" class="com.opensymphony.xwork2.validator.validators.DoubleRangeFieldValidator"/>
<validator name="date" class="com.opensymphony.xwork2.validator.validators.DateRangeFieldValidator"/>
<validator name="expression" class="com.opensymphony.xwork2.validator.validators.ExpressionValidator"/>
<validator name="fieldexpression" class="com.opensymphony.xwork2.validator.validators.FieldExpressionValidator"/>
<validator name="email" class="com.opensymphony.xwork2.validator.validators.EmailValidator"/>
<validator name="url" class="com.opensymphony.xwork2.validator.validators.URLValidator"/>
<validator name="visitor" class="com.opensymphony.xwork2.validator.validators.VisitorFieldValidator"/>
<validator name="conversion" class="com.opensymphony.xwork2.validator.validators.ConversionErrorFieldValidator"/>
<validator name="stringlength" class="com.opensymphony.xwork2.validator.validators.StringLengthFieldValidator"/>
<validator name="regex" class="com.opensymphony.xwork2.validator.validators.RegexFieldValidator"/>
<validator name="conditionalvisitor" class="com.opensymphony.xwork2.validator.validators.ConditionalVisitorFieldValidator"/>
</validators>
<!-- END SNIPPET: validators-default -->
换成相应的type值就可以对相应的要求进行校验
<-------------------------------------------------------------------------------------自己实现自定义的校验类------------------------------------------------------------------------------------------------->
我们要实现校验一个文本框中,不能有中文,有中文,没有一个中文来。这是需求
中文一个字符有2个字节,一个英文数字等其它占一个字节,所以根据这个来判断
package buaa.util;
import com.opensymphony.xwork2.validator.ValidationException;
import com.opensymphony.xwork2.validator.validators.FieldValidatorSupport;
public class ChineseValidator extends FieldValidatorSupport {
/**
* 表示是否包含有中文,现有3种模式: none 没有中文字符 some 含有中文字符,默认值 all 全是中文字符
*/
private String mode = "all";
private void setMode(String mode) {
this.mode = mode;
}
public void validate(Object object) throws ValidationException {
// 获取字段名
final String fieldName = this.getFieldName();
// 获取字段值
final String fieldValue = (String) this
.getFieldValue(fieldName, object);
// 字节数
final int bytes = fieldValue.getBytes().length;
// 字符数
final int chars = fieldValue.length();
System.out.println("现在的状态是:"+mode);
if (mode.equals("none")) {
// 现在要求全不是中文字符
// 所以字节数和字符数据,两个数字必须相等
if (chars != bytes) {
this.addFieldError(fieldName, object);
}
} else if (mode.equals("some")) {
// 现在要求含有中文字符
/**
* 所以字节数据 与字符数据 必做不相等,相等则出错 另外,如果字节数据 是字符数据 的两倍,表示全是中文字符,也出错
*/
if (chars == bytes || chars * 2 == bytes) {
this.addFieldError(fieldName, object);
}
} else if (mode.equals("all")) {
/** 现在要求全是中文字符所以字节数 是字符数的两倍,否则出错 */
if (chars * 2 != bytes) {
this.addFieldError(fieldName, object);
}
}
}
}
上面这个类继承了 FieldValidatorSupport且实现了它的抽象方法 validate(Object object) 。
添加一个validators.xml文件
位置:
内容为:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
"-//Apache Struts//XWork Validator Definition 1.0//EN"
"http://struts.apache.org/dtds/xwork-validator-definition-1.0.dtd">
<!-- START SNIPPET: validators-default -->
<validators>
<!--自定义的-->
<validator name="chinese" class="buaa.util.ChineseValidator" />
<!--默认的 -->
<validator name="required"
class="com.opensymphony.xwork2.validator.validators.RequiredFieldValidator" />
<validator name="requiredstring"
class="com.opensymphony.xwork2.validator.validators.RequiredStringValidator" />
<validator name="int"
class="com.opensymphony.xwork2.validator.validators.IntRangeFieldValidator" />
<validator name="long"
class="com.opensymphony.xwork2.validator.validators.LongRangeFieldValidator" />
<validator name="short"
class="com.opensymphony.xwork2.validator.validators.ShortRangeFieldValidator" />
<validator name="double"
class="com.opensymphony.xwork2.validator.validators.DoubleRangeFieldValidator" />
<validator name="date"
class="com.opensymphony.xwork2.validator.validators.DateRangeFieldValidator" />
<validator name="expression"
class="com.opensymphony.xwork2.validator.validators.ExpressionValidator" />
<validator name="fieldexpression"
class="com.opensymphony.xwork2.validator.validators.FieldExpressionValidator" />
<validator name="email"
class="com.opensymphony.xwork2.validator.validators.EmailValidator" />
<validator name="url"
class="com.opensymphony.xwork2.validator.validators.URLValidator" />
<validator name="visitor"
class="com.opensymphony.xwork2.validator.validators.VisitorFieldValidator" />
<validator name="conversion"
class="com.opensymphony.xwork2.validator.validators.ConversionErrorFieldValidator" />
<validator name="stringlength"
class="com.opensymphony.xwork2.validator.validators.StringLengthFieldValidator" />
<validator name="regex"
class="com.opensymphony.xwork2.validator.validators.RegexFieldValidator" />
<validator name="conditionalvisitor"
class="com.opensymphony.xwork2.validator.validators.ConditionalVisitorFieldValidator" />
</validators>
校验文件AddUserAction-validation.xml的内容为
<!DOCTYPE validators PUBLIC
"-//Apache Struts//XWork Validator 1.0.2//EN"
"http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd">
<validators>
<field name="user.username">
<field-validator type="chinese">
<param name="mode"></param>
<message>用户名,全为中文</message>
</field-validator>
</field>
<field name="user.password">
<field-validator type="requiredstring">
<message>请输入密码</message>
</field-validator>
</field>
<field name="user.password">
<field-validator type="requiredstring">
<message>输入密码不一致</message>
</field-validator>
</field>
<validator type="expression"><param name="expression"><![CDATA[user.age>=user.account]]></param>
<message>年龄必须在${user.account}岁以上,你输入的是${user.age}</message>
</validator>
</validators>
效果为:
实践的时候出了点状况,还没有分析出来原因:
总结:让页面显示校验不通过,提示出来的信息,二种方式:
1、对于字段验证错误来说,在<s:form>使用xhtml风格的时候(默认是这种风格),<s;textfield/>标签会将这个字段的错误信息显示在这个文本框的上边。
2、还可用<s:fielderror/>标签来将字段验证错误信息显示在指定位置,如果不指定其fieldName属性则会显示所有的错误,如果指定了fieldName属性则会显示指定字段的错误.
注意:对于动作验证错误,可以使用<s:actionerror/>标签,它会把所有的动作验证错误显示在指定的位置。
验证器短路:
大概意思就是一个文本框中有需要验证,默认是即使第一验证不通过,也继续验证,但如果设置了某个属性,一旦第一个没有通过,后面的就不执行了