zoukankan      html  css  js  c++  java
  • Struts2(五)数据校验

    一、概述

      在提交表单数据时,如果数据需要保存到数据库,空输入等可能会引发一些异常,为了避免引起用户的输入引起底层异常,通常在进行业务逻辑操作之前,先执行基本的数据校验。

      下面通过两种方式来阐述Struts 2的数据校验功能。

    二、重写validate方法

      我们编写的Action一般继承与ActionSupport,而ActionSupport不仅实现了Action接口,还实现了Validatable接口,提供了数据校验功能。在Validatable接口中定义一个validate方法,重写该方法,如果校验表单输入域出现错误,则将错误添加到ActionSupport类的fieldError域中,然后通过OGNL表达式输出。

      下面是用户登录界面:

    <%@ taglib prefix="s" uri="/struts-tags"%>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
    <head>
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <meta http-equiv="Content-Type" content="text/html; charset=GBK">
    <title>???????</title>
    </head>
    <body>
        <s:form action="login">
            <s:textfield name="username" key="user"></s:textfield>
            <s:textfield name="password" key="pass"></s:textfield>
            <s:submit key="登录"></s:submit>
        </s:form>
    </body>
    </html>

      用户输入数据后,提交到loginAction中:

    public class LoginActionexample extends ActionSupport
    {
        private static final long serialVersionUID = -849990804545358129L;
        private String username;
        private String password;
        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
        {
            if (getUsername().equals("xujian")&&getPassword().equals("123456"))
            {
                return SUCCESS;
            }
            else
                return ERROR;
        }
        @Override
        public void validate()
        {
            if(getUsername()==null||getUsername().trim().equals(""))
            {
                addFieldError("username","用户名不能为空");
            }
            if(getPassword()==null||getPassword().trim().equals(""))
            {
                addFieldError("password","密码不能为空");
            }
        }
    }

      上面的LoginAction类重写了validate方法,该方法会在执行excute方法之前执行,如果执行该方法之后,Action类的filedError中包含了数据校验错误,请求将被转发到input逻辑视图。

      struts.xml配置如下:

        <action name="loginexample" class="com.LoginActionexample">
                <result name="input">/login.jsp</result>
                <result name="success">/welcome.jsp</result>
                <result name="error">/error.jsp</result>
           </action>

      如果输入为空,则会提示:

      

      这是因为<s:form>标签和Struts2表单控件标签具备了输出校验提示的能力。

    三、使用Struts2的校验框架

      我们还可以不重写validate方法,而通过增加校验配置文件来进行数据校验。这个校验配置文件通过使用Struts2已有的校验器来完成对表单域的校验,下面以requiredstring校验器为例,这个校验器是一个必填校验器,指定某个表单域必须输入。

      下面是这个校验配置文件的写法:

    <?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="username">
            <field-validator type="requiredstring">
                <message key="用户名不能为空"></message>
            </field-validator>
        </field>
        <field name="password">
            <field-validator type="requiredstring">
                <message key="密码不能为空"></message>
            </field-validator>
        </field>
    </validators>

      注意:这个校验配置文件必须遵守下面两个规则:

      1、该文件命运格式必须是Action类名-validation.xml,例如本例中该文件名为:LoginActionexample-validation.xml。

      2、该文件必须与Action类的class文件位于同一路径下,本例中文件位于

      

      本例中的LoginAction类为:

    public class LoginActionexample extends ActionSupport
    {
        private static final long serialVersionUID = -849990804545358129L;
        private String username;
        private String password;
        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
        {
            if (getUsername().equals("xujian")&&getPassword().equals("123456"))
            {
                return SUCCESS;
            }
            else
                return ERROR;
        }
    }

      最后不要忘记,在struts.xml文件中依然要为input逻辑视图指定物理视图资源。

  • 相关阅读:
    HashCode和equal方法
    Quartz.NET 学习笔记整理(一)
    XAML学习笔记(一)
    【转】21个经典的哲理故事
    关于List<T>集合中的差集
    batch files
    Maintenance Plans in MS SQL 2005
    Telerik
    What is DeltaCopy
    How to Insert Values into an Identity Column in SQL Server
  • 原文地址:https://www.cnblogs.com/xujian2014/p/4902879.html
Copyright © 2011-2022 走看看