zoukankan      html  css  js  c++  java
  • Struts2 Validation学习

    Every input is evil!

    ------------------------------华丽的分割线-----------------------------------

    客户端提交的数据验证的方式有很多,可以在前段使用JS验证,可以在服务器端进行验证等,本文主要讲使用Struts2 Validation框架进行验证

    假定已经存在一个ValidationAction接受前端数据

    ValidationAction,代码如下:

    package com.huohuo.action;
    
    import com.opensymphony.xwork2.ActionSupport;
    
    public class ValidationAction extends ActionSupport{
        private String requiredString ;
        private int num;
        public int getNum() {
            return num;
        }
    
        public void setNum(int num) {
            this.num = num;
        }
    
        public String getRequiredString() {
            return requiredString;
        }
    
        public void setRequiredString(String requiredString) {
            this.requiredString = requiredString;
        }
        
        public String execute()
        {
            return SUCCESS;
        }
    }

    显而易见,要验证核实前段提交的两个数据,num和requiredString.重点放在Validation的配置和使用

    步骤一:在和ValidaitonAction同一个包下建立名为ValidationAction-validation.xml文件(默认起名为YourActionName-validation.xml,加载时会自动检测XMl)

    注意dtd,老版本的会提示你找不到dtd,你要使用最新的dtd,

    ValidationAction-validation.xml,代码如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <!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="requiredString"> <!--要验证的数据字段名字--> <field-validator type="requiredstring"> <!--验证的类型--> <message>This need a String!</message> </field-validator> </field>
    <field name="num"> <!--要验证的数据字段名字-->
     <field-validator type="int">    <!--验证的类型-->
      <param name="min">5</param>   
      <param name="max">10</param>
      <message>betweend 5-10</message>
    </field-validator>
    </field>
    </validators>

     注意:如果要接受的参数是user.name,user.password,那么你需要在上面ValidationAction-validation.xml加入以下代码:

    <field name="user">
      <field-validator type="visitor">
      <param name="context">visitorContext</param>
      <param name="appendPrefix"> true </param>
      <message>修改提示:</message>
      </field-validator>
    </field>

    需要在User的同一个包下建立一个xml文件,User-visitorContext-validation.xml,加入以下的代码:

    <?xml version="1.0" encoding="UTF-8"?>
    <!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="email">
        <field-validator type="requiredstring">
        <message>请输入合法的邮箱名</message>
        </field-validator>
    </field> 
    
        <field name="name">
        <field-validator type="requiredstring">
        <message>用户名不能为空</message>
        </field-validator>
    </field>
    
    <field name="password">
        <field-validator type="requiredstring">
        <message>密码不能为空</message>
        </field-validator>
    </field>
    
    </validators>

    亲测之后发现:

    在User-visitorContext-validation.xml文件设定的email类型为type="email"的数据字段不会给我验证,倒腾了几个小时我才发现,要在User中设为requiredstring,同时还需要在ValidationAction-validation.xml文件中添加email这个field

    <field name="user.email">
        <field-validator type="email">
        <message>请填写合法邮箱</message>
        </field-validator>
        </field> 

    这样,如果User-visitorContext-validation.xml设定的验证器不起作用,还可以触发ValidationAction-validation.xml设定的触发器,这两个要同时设定,如果只设定后者的不设定前者的还是不会触发。

    这样改过就会验证里面的数据了,估计是个bug,没搞明白,搞的脑袋到都大了。

    ----第二天报错了----------------------

    查到原因是因为我有3个ActionValidation.xml文件,里面都用到了user visitor,那么里面的参数 <param name="context">visitorContext</param>里面visitorContext名字要不一样,否则会出BUG

     ---------第三天报错了--------------

    我在页面加入token之后,validation居然失效了,然后我又把每个XML配置文件的<param name="context">visitorContext</param>改成一致的就好使了,妈的,要怎样!

    步骤二:

    Struts2 Validation机制如果检测到输入不合法,那么会自动返回一个名为result名字为"input",供用户二次输入,所以你要设计好"input",result,本文设置这个JSP为Input.jsp.所以你需要在struts.xml配置这个Input.jsp文件

    struts.xml代码如下:

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
        "http://struts.apache.org/dtds/struts-2.0.dtd">
    
    <struts>
     
         <constant name="struts.devMode" value="true" />
         <!--Action配置  -->
         <package name="default" namespace="/" extends="struts-default">
            <action name="validationAction" class="com.huohuo.action.ValidationAction">
                <result > /Output.jsp </result > 
                <result name ="input" > /Input.jsp </result >              //如果检测到错误,validation将会返回这个jsp
                <result name="fail">/fail.jsp</result>
            </action>
        </package>
        <!-- Add packages here -->
    </struts>

    步骤三:

    写你的Input.jsp文件进行测试,Struts2 validation要配合<s:form>标签,所以你要了解一下<s:form>标签的使用方法

    Input.jsp代码如下:

    <%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
    
    <%@taglib prefix = "s" uri ="/struts-tags" %>
    
    <%
    String path = request.getContextPath();
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
    %>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
        <base href="<%=basePath%>">
        
        <title>My JSP 'index.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">
        -->
              <s:head/>                                                   //这句代码是让出错的时候,message信息为红色的警告信息,如果不加,就是黑色的字体
      </head>
      
      <body>
        <s:form  action="validationAction">
           <s:textfield name ="requiredString" label ="Required String" /> 
           <s:textfield name ="num" label ="Required Number" /> 
        <s:submit />
    
    </s:form>
      </body>
    </html>

    为了测试,你可以再加一个Output.jsp,我put核心的显示代码如下,别忘了加<%@ s:tag blablabla%>那句话

    Output.jsp

     Required String: <s:property value ="requiredString" />
     Required number: <s:property value ="num" />   

    好了,结束,你可以使用Struts2 Validation framework进行输入测试了,是不是很简单,当然还有一些其他的验证类型,如email,date,double,url...查官方文档,穿一手鞋。

    --------------------------华丽的分割线--------------------------------------------------------------------------------------------

    使用Annotaion进行Validation注解

    只需要在ValidationAction需要验证的参数的set方法上面加上一句注释就OK

    像上面的例子,验证requiredString,只需要改为

     @RequiredStringValidator(message = "请输入关键字")

    public void setRequiredString(String requiredString) {
            this.requiredString = requiredString;
        }
    这样就可以直接使用Struts2 Validation了,不需要ValidationAction-validation.xml文件配置
    Struts2提供了集中注解:
    1.@RequiredFieldValidator
    2.@RequiredStringValidator
    3.@EmailValidator
    4.@UrlValidator
    5.@StringLengthFieldValidator
    6.@IntRangeFieldValidator
    7.@DateRangeFieldValidator
    PS:在一个Action中被validation annotaion标注的属性,会被应用到每一个Action中的方法,如果不想让其他的方法被验证,需要在该方法名上加入@SkipValidation注释

  • 相关阅读:
    病毒软件测试代码
    如何将WIN安全设置重置回默认值
    今天值班非常不爽。
    FTP命令(2)
    WORD操作
    DELPHI事务
    DELPHI一些常用的技巧
    钩子学习心得
    (转 )Delphi指针如何指向使用with开域语句创建的无名组件对象
    WebBrowser 操作记要 (DELPHI)
  • 原文地址:https://www.cnblogs.com/BrowserSnake/p/3745445.html
Copyright © 2011-2022 走看看