Struts2数据校验详解

1,通过配置文件来校验数据

此配置文件名格式为(ActionName-validation.xml),此文件应该放在与Action相同包下

<?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="name">
               <!-- short-circuit="true" 为短路校验 防止因为一项 校验没过而输出多条校验失败提示信息 -->
		<field-validator type="requiredstring"  short-circuit="true">
			<param name="trim">true</param>
			<message>此项必填</message>
		</field-validator>
	</field>
	<field name="password">
		<field-validator type="requiredstring" short-circuit="true">
			<param name="trim">true</param>
                        <!-- 此处通过key 可以从国际化资源中获取信息(如下为国际化资源) -->
			<message key="pass.tip" />
		</field-validator>
	</field>
</validators>


############################################################

#国际化资源文件(src/in_zh_CN.properties)
pass.tip=请务必写上密码

Action类需要继承AcitonSupport类(否则校验器将不起作用)

public class Validation extends ActionSupport{
	private String name;
	private String password;
	
	public String execute(){
		System.out.println("Vali");
		return Action.SUCCESS;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
}

当校验不能通过时将返回result 为input结果 。配置struts.xml文件

<action name="validation" class="com.wang.validation.Validation">
	<result name="input">/validation/v.jsp</result>
	<result>/validation/success.jsp</result>
</action>

*.jsp

<s:form  action="validation" method="post">
    	<s:textfield name="name" key="user"/>
    	<s:textfield name="password" key="password"/>
    	<s:submit value="提交"/>

</s:form>
    <!-- 可以通过<s:fielderror /> 打印校验错误信息 此处为表单struts2 会自动打印错误信息 
    此处的key是重国际化资源中来找信息
    -->
    <s:form  action="validation" method="post">
    	<s:textfield name="name" key="user"/>
    	<s:textfield name="password" key="password"/>
    	<s:submit value="提交"/>
    </s:form>

以上为服务器端进行数据校验,也可以在客服端(游览器)通过js进行数据校验(需要将客服端表单<s:form .... 中加入 validate="true")

因为action可能含有多个处理逻辑(多个类似execute方法),因此要具体到每个处理逻辑进行校验上面方法显然完不成。(上面是通过具体action类进行处理)因此可以通过改变配置文件名格式来配置到具体方法 ActionName-(配置action的name)-validation.xml

配置文件struts.xml

		<action name="validation1" class="com.wang.validation.Validation" method="method1">
			<result name="input">/validation/v1.jsp</result>
			<result>/validation/success.jsp</result>
		</action>
		
		<action name="validation2" class="com.wang.validation.Validation" method="method2">
			<result name="input">/validation/v2.jsp</result>
			<result>/validation/success.jsp</result>
		</action>

Validation-validation1-validation.xml文件(放在与action相同路径下)

<validators>
	<field name="name">
		<field-validator type="requiredstring">
			<param name="trim">true</param>
			<message>此项必填---v1</message>
		</field-validator>
	</field>
	<field name="password">
		<field-validator type="requiredstring">
			<param name="trim">true</param>
			<message key="pass.tip"/>
		</field-validator>
	</field>
</validators>

Validation-validation2-validation.xml文件(放在与action相同路径下)

<validators>
	<field name="name">
		<field-validator type="requiredstring">
			<param name="trim">true</param>
			<message>此项必填---v2</message>
		</field-validator>
	</field>
	<field name="password">
		<field-validator type="requiredstring">
			<param name="trim">true</param>
			<message key="pass.tip"/>
		</field-validator>
	</field>
</validators>

当直接访问其中一个Action(如 localhost:8080/s2p/validation/validation1.action)且校验未通过将会出现如下情况

因为开始为单个Action配置校验文件(ActionName-validation.xml)时与此校验文件进行了叠加出现多条提示信息

 

各个校验器类型

1,必填校验器 required(该项必须有值非空)

<validators>
        <!-- 此处的 name 为Action 中的name属性 -->
	<field name="name">
	    <field-validator type="required">
      		<message>此项必填</message>
	    </field-validator>
	</field>
</validators>

2,必填字符串校验器 requiredstring(非空也不可以是"")

<validators>
        <!-- 此处的 name 为Action 中的name属性 -->
	<field name="name">
	    <field-validator type="requiredstring">
      		<message>此项必填</message>
	    </field-validator>
	</field>
</validators>

3,整数校验int long short.(可以指定最大值最小值) 【与整数校验几乎相同的还有浮点校验要求校验数据为双浮点】

<validators>
        <!-- 此处的 name 为Action 中的num属性 -->
	<field name="num">
	    <field-validator type="int">
                <param name="min">0</param>
                <param name="max">100</param>
      		<message>所填范围必须在0~100之间</message>
	    </field-validator>
	</field>
</validators>

4,日期校验(可以指定最大值最小值))[未指定日期格式系统将使用默认格式如下]

<validators>
        <!-- 此处的 name 为Action 中的date属性 -->
	<field name="date">
	    <field-validator type="date">
                <param name="min">1990-01-01</param>
                <param name="max">2000-01-03</param>
      		<message>所填范围必须在1990-01-01~2000-01-03之间</message>
	    </field-validator>
	</field>
</validators>

5,字段表达式校验器

<validators>
        <!-- 此处的 name 为Action 中的date属性 -->
	<field name="date">
	    <field-validator type="fieldexpression">
                <!-- 此表达式返回一个布尔值 只有档期返回true时校验通过 -->
                <param name="expression>(表达式可以是OGNL表达式)</param>
       		<message>未通过校验</message>
	    </field-validator>
	</field>
</validators>

6,邮件地址和网址校验器

<validators>
        <!-- 此处的 name 为Action 中的email属性 -->
	<field name="email">
	    <field-validator type="email">        
       		<message>请填写一个有效的邮箱地址</message>
	    </field-validator>
	</field>
</validators>
<validators>
        <!-- 此处的 name 为Action 中的url属性 -->
	<field name="url">
	    <field-validator type="url">        
       		<message>请填写一个有效的网路地址</message>
	    </field-validator>
	</field>
</validators>

7,Visitor校验器(复合类型校验)

<validators>
	<!-- 该user为一复合类型 里面包含name password等属性 -->
	<field name="user">
	    <field-validator type="visitor">
	    	<!-- 指定校验规则文件 context -->        
       		<param name="context">userContext</param>
       		<!-- 指定校验失败后提示信息是加下面的前缀 -->
       		<param name="appendPrefix">true</param>
       		<!-- 对应前缀  -->
       		<message>用户的:</message>
	    </field-validator>
	</field>
</validators>

以上校验文件并未指定User校验规则 还需为其创建校验规则文件(放在User相同路径下)[校验文件名应该为User-validation.xml 但上面校验文件指定了context 为 userContext 所以 名字为 User-userContext-validation.xml]

8,转换校验器(检验被校验字段校验时是否出现类型转化的错误)

<validators>
	<field name="age">
	    <field-validator type="conversion">
	    	<!-- 类型转化错误后表单域是否保存原来输入的错误 -->
	    	<param name="repopulateField">true</param>
       		<message>你所输入的必须为一个整数</message>
	    </field-validator>
	</field>
</validators>

9,字符长度校验

<validators>
	<field name="str">
	    <field-validator type="stringlength">
	    	<param name="minLength">4</param>
	    	<param name="maxLength">20</param>
       		<message>你所输入的字符范围为4~20</message>
	    </field-validator>
	</field>
</validators>

10,正则表达式校验器

<validators>
	<field name="str">
	    <field-validator type="regix">
	    	<param name="regix">(输入正则表达式)</param>
	    	<!-- 正则表达式是否区分大小写 -->
	    	<param name="caseSensitive">true</param>
       		<message>......请输入正确格式</message>
	    </field-validator>
	</field>
</validators>

还可以通过在Action中加入对应注解方式来实现数据校验(参考书籍)

 

2,通过在Action中写相应的校验方法实现手动校验(对应Action 需要继承 ActionSupport)

	//对所有方法都起校验作用
	public void validate(){
		System.out.println("数据校验");
		//该方法是校验失败信息加入到FieldError中(如向获取国际化文件资源可以通过getText()方法)
		addFieldError("user","数据校验失败");
	}
	
	//通过声明validateXxxx()方法校验对应方法的校验
	public void validateMethod1(){
		System.out.println("方法method1方法校验失败");
		addFieldError("user","方法method1方法校验失败");
	}

猜你喜欢

转载自blog.csdn.net/weixin_41237676/article/details/84236935
今日推荐