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逻辑视图指定物理视图资源。

posted @   温布利往事  阅读(656)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗
点击右上角即可分享
微信分享提示