Struts2系统学习(14)输入校验-基于XML配置方式实现校验

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Mark_LQ/article/details/49816153

14. 输入校验

  在struts2中,我们可以实现对action的所有方法进行校验或者对action的指定方法进行校验。
  对于输入校验,struts2提供了两种实现方法:
  1. 采用手工编写代码实现。
  2. 基于XML配置方式实现。
  3. 采用Annotations配置方式实现(deprecated)。

  这一节,主要讨论基于XML配置方式实现校验。

14.1 对action所有方法进行校验

  使用基于XML配置方式实现输入校验时,Action也需要继承ActionSupport,并且提供校验文件,校验文件和action类放在同一个包下,文件的取名格式为:ActionClassName-validation.xml,其中ActionClassName为action的简单类名,-validation为固定写法。如果Action类为com.markliu.UserAction,那么该文件的取名应为:UserAction-validation.xml,放在com.markliu包下。
  校验文件模板可以从struts示例代码中复制(不过会出现些小问题,下面有分析),推荐dtd文件使用1.0.3版本。下面是校验文件的模版:

<?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>
    <field name="username">
        <field-validator type="requiredstring">
        <!-- trim默认为true -->
            <param name="trim">true</param>
            <message>用户名不能为空!</message>
        </field-validator>
    </field>
</validators>

  <field>指定action中要校验的属性,<field-validator>指定校验器,上面指定的校验器requiredstring是由系统提供的,系统提供了能满足大部分验证需求的校验器,这些校验器的定义可以在xwork-2.x.jar中的com.opensymphony.xwork2.validator.validators下的default.xml中找到。
  <message>为校验失败后的提示信息,如果需要国际化,可以为message指定key属性,key的值为资源文件中的key。
  在这个校验文件中,对action中字符串类型的username属性进行验证,首先要求调用trim()方法去掉空格,然后判断用户名是否为空。
  案例一:对action中的save和execute方法进行校验用户的输入,username不能为空,phone不能为空且符合格式要求。
  (1)用户输入input.jsp:

<s:fielderror />
<form action="/Struts2Study/day06/xmlValidator.action" method="post">
        username:<input type="text" name="username"/><br>
        phone: <input type="text" name="phone"/><br>
        <input type="submit" value="注册">
</form>

  (2)对action的save和execute方法进行校验:

package com.markliu.day06.validator;
import com.opensymphony.xwork2.ActionSupport;
public class LoginAction extends ActionSupport {

    private String username;
    private String phone;
    private String message;

    // 省略了set和get方法
    public String save() {
        this.message = "save成功!";
        return "message";
    }

    public String execute() {
        this.message = "execute成功!";
        return "message";
    }
}

  (3)在com.markliu.day06.validator包下建立LoginAction-validation.xmlLoginAction-validation.xml文件:

<?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="username">
                <field-validator type="requiredstring">
                        <param name="trim">true</param>
                        <message>username不能为空!</message>
                </field-validator>
        </field>
        <field name="phone">
                <field-validator type="requiredstring">
                        <!-- trim默认为true,可省略 -->
                        <param name="trim">true</param>
                        <message>phone不能为空!</message>
                </field-validator>

                <field-validator type="regex">
                        <!-- 注意2.1版的name为expression,具体的需要查看regex校验器对应的类RegexFieldValidator -->
                        <param name="regex"><![CDATA[^1[358]\d{9}$]]></param>
                        <message>phone格式错误!</message>
                </field-validator>
        </field>
</validators>

   发现的问题:如果采用struts2示例代码的配置模板,即:

<!DOCTYPE validators PUBLIC 
    "-//OpenSymphony Group//XWork Validator 1.0.3//EN" 
    "http://www.opensymphony.com/xwork/xwork-validator-1.0.3.dtd"> 

  会出现以下错误:

The file cannot be validated as the XML definition 
"http://www.opensymphony.com/xwork/xwork-validator-1.0.3.dtd" 
that is specified as describing the syntax of the file cannot be located.

  说明根据此dtd文件不能被加载(浏览器访问报404错误)!根本的解决方案就是查看xwork-validator-1.0.3.dtd的说明:

<?xml version="1.0" encoding="UTF-8"?>
<!--
  XWork Validators DTD.
  Used the following DOCTYPE.

  <!DOCTYPE validators PUBLIC
        "-//Apache Struts//XWork Validator 1.0.3//EN"
        "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
-->

<!ELEMENT validators (field|validator)+>
...

  文档中明确说明了使用如下DOCTYPE:

  <!DOCTYPE validators PUBLIC
        "-//Apache Struts//XWork Validator 1.0.3//EN"
        "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">

  (4)配置struts2.xml,并为result提供input.jsp视图:

<package name="day06" namespace="/day06" extends="struts-default">
            <action name="xmlValidator" class="com.markliu.day06.validator.LoginAction" method="save">
                    <result name="message">/pages/day06/message.jsp</result>
                    <result name="input">/pages/day06/input.jsp</result>        
            </action>
</package>

14.2 对action的指定方法进行校验

  当校验文件的取名为ActionClassName-validation.xml时,会对action中的所有处理方法实现输入校验。如果只需要对action中的某个action方法实施校验,那么,校验文件的取名应为:ActionClassName-ActionName-validation.xml,其中ActionName为struts.xml中action的名称,如果采用通配符访问,则需要访问action的具体名称。例如:在实际应用中,常有以下配置:

<action name="user_*" class="com.markliu.action.UserAction" method="{1}“ >
    <result name="success">/WEB-INF/page/message.jsp</result>
    <result name="input">/WEB-INF/page/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

14.3 Visitor内建校验器(补充)

  Visitor校验器主要用于校验Action里的复合属性,如一个Action里面包含了User类型的属性。假设User类包含了username和password属性,为了验证Action里User类的username和password属性输入值是否有效,就可以使用Visitor校验器。
通常情况下可以使用action名-方法名-validation.xml来校验;如此例需要验证User类,则需要添加一个User-上下文名-validation.xml来配置,且User-上下文名-validation.xml文件必须与User类在同一个包中。

  基本案例测试:
  (1)struts.xml文件配置:

    <package name="day09" namespace="/day09" extends="struts-default">
            <action name="fuheValidation" class="com.markliu.day09.FuHeValidationAction"    method="execute">
                    <result name="success">/pages/day09/message.jsp</result>
                    <result name="input">/pages/day09/login.jsp</result>
            </action>
    </package>

  (2)FuHeValidationAction请求处理类:

package com.markliu.day09;
import com.markliu.day09.bean.User;
import com.opensymphony.xwork2.ActionSupport;
public class FuHeValidationAction extends ActionSupport {
    private static final long serialVersionUID = -7433392781263108584L;
    private User user;
    public User getUser() {
        return user;
    }
    public void setUser(User user) {
        this.user = user;
    }

}

  (3)User类:

package com.markliu.day09.bean;
public class User {
    private String username;
    private String phone;
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPhone() {
        return phone;
    }
    public void setPhone(String phone) {
        this.phone = phone;
    }
}

  (4)在FuHeValidationAction所在包下创建FuHeValidationAction-validation.xml:

<?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>
        <!-- 校验的Action中的属性 -->
         <field name="user">
                <field-validator type="visitor">
                <!-- 指定校验规则文件的context名为usercontext,此名可任意取 -->
                        <param name="context">usercontext</param>
                        <!-- 指定校验失败后提示信息是否添加下面前缀,如果设置为false,则在标签对应的地方不显示错误,需要用fielderrors来显示 -->
                        <param name="appendPrefix">true</param>
                        <!-- 指定校验失败的提示信息前缀 -->
                        <message>错误:</message>
                </field-validator>
        </field>
</validators>

  (5)在User所在包下创建User-usercontext-validation.xml:

<?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="username">
                <field-validator type="requiredstring">
                        <param name="trim">true</param>
                        <message>username不能为空!</message>
                </field-validator>
        </field>
        <field name="phone">
                <field-validator type="requiredstring">
                        <!-- trim默认为true,可省略 -->
                        <param name="trim">true</param>
                        <message>phone不能为空!</message>
                </field-validator>
                <field-validator type="regex">
                        <param name="regex"><![CDATA[^1[358]\d{9}$]]></param>
                        <message>phone格式错误!</message>
                </field-validator>
        </field>
</validators>

  (6)输入界面:

    <s:fielderror />
    <form action="/Struts2Study/day09/fuheValidation" method="post">
        username:<input name="user.username" type="text"><br>
        phone:<input name="user.phone" type="text"><br> 
        <input type="submit" value="login">
    </form>


转载请注明出处:http://blog.csdn.net/mark_lq/article/details/49816153

展开阅读全文

没有更多推荐了,返回首页