zoukankan      html  css  js  c++  java
  • 六、Struts2之输入校验

     

    一、Struts2输入校验介绍

    Struts2的输入校验和类型转换都是对请求参数进行处理。

    输入校验顾名思义就是请求参数是否能够满足一定的要求;

    客户端校验&服务器端校验

    客户端校验是指在浏览器这端通过Javascript进行初步校验,为了减轻服务器端的负载;

    服务器端校验是校验数据的最后一道防线;

    在Struts2中,数据校验不需要写任何代码,只需要一个配置文件,配置校验的条件就可以了,非常简单;因此数据校验文件是数据校验的最重要的内容;

    二、数据校验规则文件

    1.数据校验规则文件规则:

    1.此文件中规定了参数的一些校验条件;

    2.可以包括字段型校验器和非字段型校验器;

    3.命名规则:ActionName-validation.xml,其中ActionName是Action类的名字;

    4.每个Action都有一个validation文件,规则文件放在和Action同目录下;

    5.在前面我们讲到的配置逻辑action中,如果需要对某个逻辑Action配置数据校验文件,则命名规则为:ActionName-LogicActionName-validation.xml;

    6.注意:当需要对逻辑action进行校验时,如果存在一般形式的ActionName-validaton.xml文件,则也会对此逻辑Action进行校验;

    7.输入校验失败后,和类型转换一样,会将错误封装成fieldError,并放入Action Context中,因此在JSP中添加<s:fielderror/>可显示错误,此内容也是我们在数据校验文件中配置的;

    8.当输入校验失败后,和类型转换一样,返回逻辑视图为input,因此在struts.xml中必须配<result name="input"></input>

    9.输入校验失败后,struts表单标签也会自动输出错误提示;

    字段型校验器&非字段型校验器

    字段型校验器:以每个Action属性为一个单位进行编写,即以如下风格编写:

    属性1

            规则1

            规则2

    属性2

            规则1

            规则2

    非字段型校验器:以规则为一个单位,以如下风格编写:

    规则1

            属性

    规则2

            属性

    规则3

            属性

     

    2.数据校验文件内容

    1.数据校验文件以<validators>为根元素;

    2.字段型校验器是以属性为单位的,内容模板:

    <validators>
    	<field name="">
    		<field-validator type="">
    			<param name=""></param>
    			<message></message>
    		</field-validator>
    	</field>
    
    </validators>


    3.非字段型校验器是以校验器为单位的,内容模板:

    <validator type="">
    		<param name="fieldName"></param>
    		<param name=""></param>
    		<message></message>
    </validator>

    代码示例:

    此段代码中分别对字符串、日期、整型、email进行数据校验;

    Validation01Action.java

    package org.validation.action;
    
    import java.util.Date;
    
    import com.opensymphony.xwork2.ActionSupport;
    
    public class Validation01Action extends ActionSupport {
    	private String name;
    	private String email;
    	private int age;
    	private Date date;
    	public String execute()throws Exception{
    		return SUCCESS;
    	}
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    	public String getEmail() {
    		return email;
    	}
    	public void setEmail(String email) {
    		this.email = email;
    	}
    	public int getAge() {
    		return age;
    	}
    	public void setAge(int age) {
    		this.age = age;
    	}
    	public Date getDate() {
    		return date;
    	}
    	public void setDate(Date date) {
    		this.date = date;
    	}
    	
    }


    1.jsp

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    <%@taglib prefix="s" uri="/struts-tags" %>
    
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
    
        <title>My JSP '1.jsp' starting page</title>
        
    	<meta http-equiv="pragma" content="no-cache">
    	<meta http-equiv="cache-control" content="no-cache">
    	<meta http-equiv="expires" content="0">    
    	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    	<meta http-equiv="description" content="This is my page">
    	<!--
    	<link rel="stylesheet" type="text/css" href="styles.css">
    	-->
    
      </head>
      
      <body>
    	<s:fielderror></s:fielderror>
    	<s:form action="validator01">
    		<s:textfield name="name" label="姓名"></s:textfield>
    		<s:textfield name="email" label="邮箱"></s:textfield>
    		<s:textfield name="age" label="年龄"></s:textfield>
    		<s:textfield name="date" label="日期"></s:textfield>
    		<s:submit value="提交"></s:submit>
    	</s:form>
      </body>
    </html>


     

    如果是以字段型校验器配置,则参考以下:

    Validation01Action-validation.xml

    (1)<field name="">为一个属性,name为Action属性名称;

    (2)<field-validator type="">为配置一个校验器,type为校验器的类型;

    (3)<param>为配置参数,比如最小值、最大值;

    (4)<message>为错误信息,如果需要对错误提示信息进行国际化,则可以在全局国际化资源文件中配置,在校验规则文件中编写如下形式:<message key="key"/>,key为国际化资源文件的key即可;

    <!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="name">
    		<field-validator type="requiredstring">
    			<param name="trim">true</param>
    			<message>姓名不能为空</message>
    		</field-validator>
    		<field-validator type="regex">
    
    			<param name="expression"><![CDATA[(\w{4,10})]]></param>
    			<message>姓名要在4-10位之间</message>
    		</field-validator>
    	</field>
    	<field name="age">
    		<field-validator type="requiredstring">
    			<param name="trim">true</param>
    			<message>年龄不能为空</message>
    		</field-validator>
    		<field-validator type="int">
    			<param name="min">0</param>
    			<param name="max">200</param>
    			<message>年龄范围在0-200之间</message>
    		</field-validator>
    	</field>
    	<field name="email">
    		<field-validator type="requiredstring">
    			<param name="trim">true</param>
    			<message>邮箱不能为空</message>
    		</field-validator>
    		<field-validator type="email">
    
    			<message>邮箱格式不正确</message>
    		</field-validator>
    	</field>
    	<field name="date">
    		<field-validator type="requiredstring">
    			<param name="trim">true</param>
    			<message>日期不能为空</message>
    		</field-validator>
    		<field-validator type="date">
    			<param name="min">2010-01-01</param>
    			<param name="max">2010-12-31</param>
    			<message>日期在2010-01-01到2010-12-31之间</message>
    		</field-validator>
    	</field>
    
    </validators>

    而如果采用非字段校验器,则

    (1)<validator type="">表示一个校验器,type属性表示校验器的类型;

    (2)<param name="fieldName"></param> 此元素是必要的,指定Action属性的名称;

    (3)<message>表示错误信息;

    <!DOCTYPE validators PUBLIC
            "-//Apache Struts//XWork Validator 1.0.2//EN"
            "http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd">
    
    <validators>
    	<validator type="requiredstring" short-circuit="true">
    		<param name="fieldName">name</param>
    		<param name="trim">true</param>
    		<message key="aa"></message>
    	</validator>
    	<validator type="requiredstring" short-circuit="true">
    		<param name="fieldName">age</param>
    		<param name="trim">true</param>
    		<message>年龄不能为空</message>
    	</validator>
    	<validator type="requiredstring" short-circuit="true">
    		<param name="fieldName">email</param>
    		<param name="trim">true</param>
    		<message>邮箱不能为空</message>
    	</validator>
    	<validator type="requiredstring" short-circuit="true">
    		<param name="fieldName">date</param>
    		<param name="trim">true</param>
    		<message>日期不能为空</message>
    	</validator>
    	<validator type="regex">
    		<param name="fieldName">name</param>
    		<param name="expression"><![CDATA[(\w{4,10})]]></param>
    		<message>姓名要在4-10位之间</message>
    	</validator>
    	<validator type="int">
    		<param name="fieldName">age</param>
    		<param name="min">0</param>
    		<param name="max">200</param>
    		<message>年龄范围在0-200之间</message>
    	</validator>
    	<validator type="email">
    		<param name="fieldName">email</param>
    		<message>邮箱格式不正确</message>
    	</validator>
    	<validator type="date">
    		<param name="fieldName">date</param>
    		<param name="min">2010-01-01</param>
    		<param name="max">2010-12-31</param>
    		<message>日期在2010-01-01到2010-12-31之间</message>
    	</validator>
    </validators>


    客户端校验方法:

    在JSP的<s:form>元素中添加属性 validate="true";添加后,在校验规则文件的规则会转变为客户端校验规则,即任何校验都不需要接触服务器;

    需要注意的是:如果直接访问JSP页面,并不能体现出客户端校验,只有通过访问某个action然后跳转到JSP页面才可以让客户端校验生效;


    短路校验器

    一般来说,如果我们为name配置了两个校验器:第一个是“不能为空”,第二个是“长度大于4且小于10”,则如果name字段为空时,则会同时输出这两条提示,但是实际上,如果用户输入为空的情况下,只应该输出“不能为空”,这就需要短路校验器;

    在<validator>或<field-validator>元素中添加short-circut="true"即可;

    短路校验器的规则:

    1.当非字段校验器校验失败,则其后的所有字段校验器都不会执行,而不会影响其他非字段校验器;

    2.字段校验器校验失败时,其后的所有字段校验器都不会执行;

    校验器的运行顺序

    1.非字段校验器比字段校验器先执行;

    2.从前往后执行;


    三、内建校验器

    在xwork-core-Xxx.jar的com/opensymphony/xwork2/validator/validators/default.xml中定义了内建的校验器;

    以下我们开始介绍内建校验器,以下介绍根据字段型校验器介绍;非字段校验器只需要简单变换即可;

    1.required校验器

    此校验器要求字段必须为非空;

    2.requiredstring校验器

    此校验器要求检验字符串非空并且必须长度大于0,即不能是""

    可选参数为:

    (1)trim:如果为true,则将前后的空白去掉,类似于String的trim函数;

    3.int校验器

    此校验器要求整数限定在一定范围之内;

    可选参数为:

    (1)min:最小值;

    (2)max:最大值;

    4.date校验器

    要求日期在一定范围之内;

    可选参数:

    (1)min:最小日期;

    (2)max:最大日期;

    5.fieldexpression校验器

    要求此校验器满足指定的逻辑表达式;

    可选参数:

    (1)expression:逻辑表达式;格式为:<![CDATA[(逻辑表达式)]]>

    6.email校验器

    要求字段一定要满足电子邮箱格式;

    7.url校验器

    要求字段格式满足URL格式;

    8.stringlength校验器

    要求字段是string,并且长度在一定范围之内;

    可选参数:

    (1)trim:删除前后空白;

    (2)minLength:最小长度;

    (3)maxLength:最大长度;

    9.regex校验器

    要求满足给定的正则表达式;

    可选参数:

    (1)expression:给出正则表达式;格式如:<![CDATA[(正则表达式)]]>

    (2)caseSensitive:是否区分大小写;

    四、手动校验

    如果内建校验器不满足要求,可以自定义校验器,方法是在Action类中重写public void validate()方法;并且如果不满足条件,调用addFieldError("name","message"),然后返回input逻辑视图;

    当然如果一个Action类中有多个逻辑Action,则validate方法就不管用,因此需要定义validateXxx()方法;比如:

    如果逻辑Action的处理方法是fun(),则定义validateFun()方法,实现和validate方法一样;

    注意:如果逻辑Action的校验函数是validateXxx(),则validate()一样也会被调用,因为只要对此物理Action进行校验,则validate()方法总会起作用。这和前面输入校验规则文件时一样的;

    作者:xiazdong
    出处:http://blog.xiazdong.info
    本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。
  • 相关阅读:
    MapReduce编程:数字排序
    MapReduce编程:平均成绩
    线性回归(linear regression)
    pip安装第三方库镜像源选择
    malloc/free 和 new/delete
    strcpy函数解析
    牛客-数据库SQL实战
    Numpy学习
    花式饺子
    MapReduce编程:单词去重
  • 原文地址:https://www.cnblogs.com/xiazdong/p/3058084.html
Copyright © 2011-2022 走看看