Struts2输入校验

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Struts2输入校验相关的知识,希望对你有一定的参考价值。

struts2输入校验主要分为两种

    代码实现校验和xml配置文件实现校验

 (1)代码实现校验

   1、 对action所有方法进行validate

 action需要继承ActionSupport,并在action重写validate()方法,在validate方法中,根据页面的相应 元素名称进行相关校验,如果校验不通过,调用this.fieldError(页面元素name,出错提示信息). 然后返回INPUT对应的视图,视图中使用标签<s:fieldError name="页面元素名称"/>进行回显,一般INPUT对应的视图资源还是原来的输入页面。比如验证手机号:mobilephone;需要在action里做如下处理:

     if(mobilephone==null||"".equals(mobilephone.trim())){

   this.addFieldError("手机号码不能为空",mobilephone);

      }

    else if(!Pattern.compile("^1[358]//d{9}$").matcher(mobilephone).matches()){

  this.addFieldError("手机号格式不对",mobilephone);
  }

然后在struts.xml中配置一个<result name="input">index.jsp</result>

最后从index.jsp页面中通过<s:fielderror/>输出相关的错误信息

前面需要加入struts标签<%@ taglib uri="struts-tags" prefix="s"%》
###############################或者####################################
1)在action中,通过this.addFieldError("name", "name is error");
                   this.addFieldError("name", "name is too long");  //定义错误提示信息

       (使用此方法要继承ActionSupport,且此action在struts.xml中不用配置input结果视图
2)在JSP页面中,查看错误信息
 方式一:<!-- 以固定的css样式取出错误信息,不方便我们进行相应的处理-->
            <s:fielderror fieldName="name" theme="simple"/>
 方式二:<!-- 从存储错误信息的Map中拿数据 -->
            <s:property value="errors.name[0]"/>
            <s:property value="errors.name[1]"/>
            <!-- 显示详细的栈信息-->
             <s:debug></s:debug>

 debug中的errors是一个map类型,而name是一个数组,可以在action继续添加错误提示信息
 <s:debug></s:debug>可以查看值栈信息
  总结:从方式二我们可以看出当action中调用this.addFieldError方法时,值栈和request域中就会添加errors对象,所以我们可以在拦截器中通过request获取errors对象:
   HttpServletRequest request = ServletActionContext.getRequest();
   Map    errors = (
Map) request.getAttribute("errors");
或者
       ActionContext context = actionInvocation.getInvocationContext().getContext();
       ValueStack stack = context.getValueStack();
     
Map   errors = (Map) stack.findValue("errors")

###############################或者####################################     2、对action中指定方法进行validate

       在action中加入validateXXX()方法。(其中XXX是action中指定的方法名)

(2)配置文件实现校验

    1、对action所有方法进行validate

编写ActionClassName-validation.xml.  ActionClassName是action对应的简单类名,validation是固定写法,将这个XML文件放在与action同一个包下面,当然action还是要去继承ActionSupport这个类,下 面是配置文件的例子。其中type还有很多~例如email啥的,系统提供了能满足大部分验证需求的校验器,这些校验器的定义可以在xwork-2.x.jar中的com.opensymphony.xwork2.validator.validators下的default.xml中找到,但是校验文件的模板并没有在default.xml中,一定要复制下面的xml中的dtd到校验文件中!!!切记切记!!!。
regist.jsp页面的输入框代码:
    <s:form action="UserReg">
        <s:textfield name="username" label="用户名"></s:textfield>
        <s:password name="password1" label="密码"></s:password>  
        <s:password name="password2" label="确认密码"></s:password> 
       <s:textfield name="age" label="年龄"/>
        <sx:datetimepicker name="birthday" label="生日:" displayFormat="yyyy-MM-dd"></sx:datetimepicker>
       <s:textfield name="mobile" label="手机"></s:textfield>
       <s:textfield name="email" label="邮箱"/>
       <s:textfield name="personPage" label="个人主页"/>
        <s:submit value="注册"/>
        <s:reset value="重置"></s:reset>
    </s:form>
校验RegistAction-validation.xml如下:
  <?xml version="1.0" encoding="UTF-8"?>
  <!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.3//EN"    "http://www.opensymphony.com/xwork/xwork-validator-1.0.3.dtd">
<validators>
   <!-- username字段校验 -->
  <field name="username">
  <!--   <field-validator type="stringlength">
      <param name="minLength">4</param>
      <param name="maxLength">10</param>
      <message>用户名长度为${minLength}到${maxLength}之间!</message>    
    </field-validator>  -->
    <field-validator type="requiredstring">
          <param name="trim">true</param>
       <!-- 指定校验失败的提示信息,在INPUT对应的视图regist.jsp显示 -->
         <message >用户名不能为空!</message>
    </field-validator>
<!-- 指定name属性必须匹配正则表达式 ,长度位4到20之间-->
     <field-validator type="regex">
          <param name="expression"><![CDATA[(\w{4,20})]]></param>
           <message>您输入的用户名只能是字母和数字
                 ,且长度必须在4到20之间</message>
      </field-validator>
  </field>
  <!-- password1字段校验 -->
  <field name="password1">
    <field-validator type="requiredstring">
      <param name="trim">true</param>
      <message>错误,密码不能为空!</message>    
    </field-validator>
    <field-validator type="stringlength">
      <param name="minLength">4</param>
      <param name="maxLength">20</param>
      <message>用户密码长度为${minLength}到${maxLength}之间!</message>    
    </field-validator>
 </field>
  <!-- password2字段校验 -->
  <field name="password2">
    <field-validator type="requiredstring">
      <param name="trim">true</param>
      <message>错误,确认密码不能为空!</message>
    </field-validator>
    <field-validator type="stringlength">
      <param name="minLength">4</param>
      <param name="maxLength">20</param>
      <message>用户密码长度为${minLength}到${maxLength}之间!</message>    
    </field-validator>
    <field-validator type="fieldexpression">
       <param name="expression">password1==password2</param>
       <message>两次输入密码不一样!</message>
    </field-validator>
  </field>
<!-- 指定age属性必须在指定范围内-->
     <field name="age">
        <field-validator type="int">
             <param name="min">1</param>
             <param name="max">120</param>
            <message>年纪必须在${min}到${max}之间</message>
         </field-validator>
    </field>
   <!-- birthday字段校验,页面中是一个时间选择框 -->
  <field name="birthday">
    <field-validator type="date">
      <param name="min">1990-01-01</param>
      <param name="max">2011-04-14</param>
      <message>错误:生日应该在一个范围内!</message>   
    </field-validator>
  </field>

   <!-- 手机字段校验 -->
    <field name="mobile">
        <field-validator type="requiredstring">
            <message>手机号不能为空!</message>
        </field-validator>
         <field-validator type="regex">
            <param name="expression"><![CDATA[^1[358]/d{9}$]]></param>
            <message>电话号码格式不对</message>
        </field-validator>
    </field>

  <!-- 邮箱字段校验 -->
  <field name="email">
         <!-- 指定需要校验的字段名为email -->
         <field-validator type="email">
             <!-- 指定校验失败的提示信息 -->
             <message>你输入的邮箱必须是一个有效,如:[email protected]</message>
         </field-validator>
     </field>
   <!-- 指定Url属性的校验 -->
     <field name="personPage">
         <!-- 指定需要校验的字段名为personPage -->
         <field-validator type="url">
             <!-- 指定校验失败的提示信息 -->
             <message>你输入的个人主页地址必须有效,如:http://www.example.com</message>
         </field-validator>
     </field>
</validators>

附:
字段OGNL表达式校验器
<field name="imagefile">
    <field-validator type="fieldexpression">
        <param name="expression"><![CDATA[imagefile.length() <= 0]]></param>
        <message>文件不能为空</message>
    </field-validator>
</field>
关于struts2的身份证验证请参看:自定义身份证验证

值得注意的一点是:要在xml中写相应的文本必须要:<![CDATA[]]>的格式。。。

如果需要在myeclipse加入XML提示信息
技术分享

  •  对action中指定方法进行validate

         配置文件的名字变为 ActionClassName-actionname_xxx-validation.xml.其中actionname_xxx中 actionname是struts.xml中action的名称,xxx是该action下面的方法,一般使用这种通配符,才能做到校验指定方法。如:

struts.xml中:

 

<action name="user_*" class="action.UserAction" method="{1}“ >
    <result name="success">/message.jsp</result>
    <result name="input">/addUser.jsp</result>
</action>
   UserAction中有以下两个处理方法:
public String add() throws Exception{ 
}
public String update() throws Exception{
}
要对add()方法实施验证,校验文件的取名为: UserAction-user_add-validation.xml
要对update()方法实施验证,校验文件的取名为: UserAction-user_update-validation.xml

以上是关于Struts2输入校验的主要内容,如果未能解决你的问题,请参考以下文章

使用Struts2实现数据校验

(转)struts2:数据校验,通过XWork校验框架实现(validation.xml)

[Struts2学习笔记] -- 输入校验

笔记:Struts2 输入校验

Struts2框架---Struts2的输入校验

struts2 之 struts2数据校验