Struts2简单数据校验

  Struts2简单数据校验

客户端和服务器端数据校验两种

  1.客户端数据校验

客户端也分为手工和自动校验两种方式。

  1.1手工方式校验:

Web应用中的用户输入校验是必要的,对输入进行校验,可以尽量保证输入数据的有效性,而客户端主要是通过javascript来实现。以下代码即是客户端验证:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script language="javascript">
        function checkForm(){
            var username  = document.myForm.username.value;
            if(username==""){
                alert("用户名不能为空!")
                document.myForm.username.focus();
                return false;
            }
            var username  = document.myForm.password.value;
            if(username==""){
                alert("密码不能为空!")
                document.myForm.password.focus();
                return false;
            }
            var age = document.myForm.age.value;
            if(age==""){
                alert("年龄不能为空!")
                document.myForm.age.focus();
                return false;
            }            
            
        }
     </script>

</head>
<body>

    <form action = "" name = "myForm" method="post" onsubmit="return checkForm();">
        用户名:<input type = "text" name = "username" /><br/>
        密码: <input type = "text" name = "password" /><br/>
        年龄: <input type = "text" name = "age" /><br/>
        <input type = "submit" value="注册"/>
    </form>
</body>
</html>

注意:但是也有很多方法可以绕过客户端验证

1 如果浏览器在Internet属性中的禁止JS脚本

2 将网页源代码另存为,删除js脚本,然后修改一下地址

  1.2 自动方式校验

将form标签的validate属性设置为true,form标签根据所配置的验证规则,自动生成客户端JavaScript验证代码。

但是前提是:form的主题(theme)为xhtml或者css_xhtml,不能为simple;页面必须由Action跳转而来,如果直接访问JSP页面,客户端自动校验无法生效,且报错
注册视图页面:

<body>

    <s:fielderror></s:fielderror>
    <!-- 通过指定表单的validate属性为true,使用自动客户端JavaScript验证,表单theme采用默认的xhtml -->    
    <!--  同时注意,struts2 2.3.4.1版本.指定validate为true后,该表单所在页面须通过Action转向而来,才能生效,否则直接访问页面会报错-->
    <!-- 良好编程习惯:MVC开发中,所有页面都经控制器中转而来 -->
    <s:form action="register" validate="true">
        <s:textfield name="username" label="用户名"></s:textfield>
        <s:password name="password" label="密码"></s:password>
        <s:password name="pwdagain" label="密码确认"></s:password>
        <s:textfield name = "age" label="年龄"></s:textfield>
        <s:textfield name = "email" label="邮箱"></s:textfield>
        <s:submit value="注册"></s:submit>
    </s:form>
    <s:debug></s:debug>
</body>

 

所以服务器端验证也是非常必要的

  2.服务端验证

服务器端验证有两种方法,手工验证和通过校验器验证两种方式。

  2.1 手工方式校验

在开发Action的过程中,要继承ActionSupport类,ActionSupport类提供了添加校验错误信息的方法,例如:

addFieldError():添加属性级别的错误消息

addActionError():添加Action级别的错误消息

addActionMessge():添加Action级别的一般性消息

然后在利用fielderror、actionerror、actionmessag等非表单UI标签在视图页面中显示相应的错误信息。

以下是服务器端手工方式校验的视图页面:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>用户注册页面</title>
</head>
<body>
<!-- fielderror标签显示Action方法中addFieldError方法增加的所有属性级别错误信息,没有则不显示 -->
<!-- fielderror标签显示的信息有附加的样式,即使将主题theme设置为simple -->
    <s:fielderror></s:fielderror>
    
<!-- 通过debug观察ActionContext,我们可以取出(没有样式的)特定错误信息的原始数据,再自行控制采用何种样式,显示在哪里等等 -->
    <s:property value = "fieldErrors.username[0]"/>
    <s:property value = "fieldErrors.password[0]"/>
    <s:property value = "fieldErrors.age[0]"/>
    
    <s:form action="Action地址" theme="simple">
        用户名:<s:textfield name="username"></s:textfield><br/>
        密码:<s:password name="password"></s:password><br/>
        年龄:<s:textfield name = "age"></s:textfield><br/>
        <s:submit value="注册"></s:submit>
    </s:form>
    <s:debug></s:debug>
</body>
</html>

以下就是开发的注册Action页面RegisterAction类:

public class RegisterAction extends ActionSupport {
    private String username;
    private String password;
    private int age;
    

    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String execute() throws Exception {
        // TODO Auto-generated method stub
        //通过addActionMessage方法可以添加一些一般性信息,比如注册成功后的欢迎信息等等
        this.addActionMessage("欢迎啊");
        return this.SUCCESS;
    }
    
    /*
     * Struts2会首先调用validate方法,如果Action类中通过addFieldError或者addActionError方法
     增加了错误信息,称为Action类校验失败,校验失败,Struts2框架自动跳转到名字为"input"的result视图
     我们需要在struts.xml中为该Action配置一个名字为"input"的result,作为校验失败的跳转视图
     注意:如果校验失败,直接跳转到与"input"对应的视图,execute方法不会再执行了,校验通过,则继续执行execute方法
     */
    @Override
    public void validate() {
        // TODO Auto-generated method stub
        if(username.equals(""))
            this.addFieldError("username", "用户名不能为空");
        if(password.equals(""))
            this.addFieldError("password", "密码不能为空");
        if(age>100||age<1)
            this.addFieldError("age", "年龄不合法");
    }
}

  2.2 服务器端通过校验器校验

针对常用的校验规则,Struts2提供了一些内置校验器,可以通过配置直接使用,以减轻开发者编写校验代码的负担。一个校验器(validator)是一个Java类,框架根据配置文件中的配置和定义,会自动调用这个校验Java类。

校验文件的命名格式要求:(1)Action类名-validation.xml (2)如示例中的:RegisterAction-validation.xml

校验文件的位置要求:放在跟Action类同一目录下

在配置文件中有很多内置校验器:

(1)必填字符串校验器(requiredstring):校验指定字段是否不为null,并且不为空字符串(长度>0)
(2)字符串长度校验器(stringlength),该校验器的常用参数:maxLength:指定最大长度(不指定则不检查),minLength:指定最小长度(不指定则不检查)
(3)整数校验器(int):校验指定的整数是否在一定的范围内,该校验器的常用参数,min:指定最大整数值,max:指定最大整数值
(4)邮件地址校验器(email):校验是否是合法邮件格式

以下就是注册视图页面register.jsp:

<body>
    <s:fielderror></s:fielderror>    
    <s:form action="register" theme="simple">
        用户名:<s:textfield name="username"></s:textfield><br/>
        密码:<s:password name="password"></s:password><br/>
        年龄:<s:textfield name = "age"></s:textfield><br/>
        邮箱:<s:textfield name = "email"></s:textfield><br/>
        <s:submit value="注册"></s:submit>
    </s:form>
    <s:debug></s:debug>
</body>

以下就是配置校验器配置文件:RegisterAction-validation.xml

<validators>
    <field name="username">
    <!--针对username字段,使用requiredstring校验器,确保不为null且不为空  -->
        <field-validator type="requiredstring">
            <message>用户名不能为空</message>
        </field-validator>
    </field>
    <field name="password">
    <!--针对password字段,使用requiredstring校验器,确保不为null且不为空  -->
        <field-validator type="requiredstring">
            <message>密码不能为空</message>
        </field-validator>
    <!--针对password字段,使用stringlength校验器,确保长度不能小于6  -->
        <field-validator type="stringlength">
            <param name="minLength">6</param>
            <message>密码长度不能小于6</message>
        </field-validator>
    </field>
    <field name="age">
    <!--针对age字段,使用int校验器,确保数值在1到100之间  -->
        <field-validator type="int">
            <param name="min">1</param>
            <param name="max">100</param>
            <message>年龄值不合法,应在1-100之间</message>
        </field-validator>
    </field>
    <field name="email">
    <!--针对email字段,使用email校验器,确保邮箱格式正确  -->
        <field-validator type="email">
            <message>邮箱地址不合法</message>
        </field-validator>
    </field>
</validators>
以下就是注册Action:RegisterAction

public class RegisterAction extends ActionSupport {
    private String username;
    private String password;
    private int age;
    private String email;
    

    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 String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String execute() throws Exception {
        // TODO Auto-generated method stub
        return this.SUCCESS;
    }
}

  2.3 校验过程中的自动类型转换

表单提交请求参数值都是字符串类型,Struts2框架会根据Action属性进行自动类型转换;

比如上例表单age字段值(String)与Action的age属性(int类型)之间的自动类型转换;
如果类型转换失败,Struts2框架把异常信息封装到fielderror里。

posted @ 2012-12-06 14:14  java任我行  阅读(467)  评论(0)    收藏  举报