使用Struts2实现数据校验

为什么需要数据校验呢?答案很简单,假如当你登录想要京东,这时就需要数据校验了如果不输入用户名的话,那么就不会登陆成功,并且会提示出"请输入用户名"的字样

那么,在Struts2中实现数据校验的方法有哪些呢?接下来我们探讨一下。

实现数据校验有四种方法:



1.用execute()方法实现数据校验

 编写一个Action,继承ActionSupport类,重写execute()

步骤1:在Web项目的cn.happy.action下创建一个ExecuteAction(UserInfo为用户实体,其中有username和password属性,并且封装)

public class ExecuteAction extends ActionSupport {
    private UserInfo info;
    // 确认密码
    private String okpwd;

    @Override
    public String execute() throws Exception {
        if (info.getUsername().length() == 0) {
            addFieldError("username", "用户名不能为空");
        }

        if (info.getPassword().length() == 0) {
            addFieldError("pwd", "密码不能为空");
        }

        if (!info.getPassword().equals(okpwd)) {
            addFieldError("pwd", "两次密码必须一致");
        }     //判定FieldError对象中是否有错误信息
        //若有错误信息 则返回input
        if(this.hasErrors()){
            return INPUT;
        }
        return SUCCESS;
    }

步骤2:创建struts.xml文件,引用ExecuteAction类

<struts>
    <!-- 修改文件 tomact不用重启 -->
    <constant name="struts.devMode" value="true" />

    <package name="default" namespace="/" extends="struts-default">
        <!-- 测试execute方法 -->
         <action name="execute" class="cn.happy.action.ExecuteAction">
            <result name="success">success.jsp</result>
            <result name="input">regist.jsp</result>
        </action>
</struts>

步骤3.准备前段注册页面regist.jsp和成功页面success.jsp

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    <title>注册页面</title>
  </head>
  <body>
    <h2>用户注册</h2>
    <!-- 取出所有错误信息 -->
    <s:fielderror></s:fielderror>
    <s:form action="ValidateXxx" method="post">
    <s:textfield name="info.username" label="用户名"></s:textfield>
    <br/>
     <s:textfield name="info.password" label="密码"></s:textfield>
    <br/>
     <s:textfield name="okpwd" label="确认密码"></s:textfield>
    <br/>
    <s:submit value="注册"></s:submit>
    </s:form>
  </body>
</html>
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
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>成功页面</title>
  </head>
  <body>
    欢迎您!${info.username }
  </body>
</html>

我们来看一下假如用户名和密码都不输入时的效果

我们来看一下假如用户名和密码都输入时的效果

我们来看一下假如用户名和密码还有确认密码都输入时的效果,并且密码和确认密码都相同时

那么,它会进入到success.jsp页面



 2.使用validate()实现数据校验

 继承ActionSupport类,该类实现了Validateable接口,该接口中定义了一个validate()方法,在自定义的Action类中重写validate()方法,如果校验表单输入域出现错误,则将错误添加到ActionSupport类的fieldErrors域中,然后通过OGNL表达式负责输出

步骤1:创建ValidateAction类(UserInfo同样为UserInfo实体类)

public class ValidateAction extends ActionSupport{

    private UserInfo info;
    //确认密码
    private String okpwd;

    @Override
    public String execute() throws Exception{
        return SUCCESS;
    }

    //实现数据校验
    @Override
    public void validate() {
        if(info.getUsername().length()==0){
            addFieldError("username", "用户名不能为空");
        }

        if(info.getPassword().length()==0){
            addFieldError("pwd", "密码不能为空");
        }

        if(!info.getPassword().equals(okpwd)){
            addFieldError("pwd", "两次密码必须一致");
        }
    }

    public UserInfo getInfo() {
        return info;
    }
    public void setInfo(UserInfo info) {
        this.info = info;
    }
    public String getOkpwd() {
        return okpwd;
    }
    public void setOkpwd(String okpwd) {
        this.okpwd = okpwd;
    }
}

步骤2:在struts.xml文件中再配置一个action

    <!-- 测试validate方法 -->
        <action name="Validate" class="cn.happy.action.ValidateAction">
            <result name="success">success.jsp</result>
            <result name="input">regist.jsp</result>
        </action>

步骤三和上面第一种方法一样,同样是两个jsp页面,只是把<s:form action="execute" method="post">的execute改为validate就可以了。

我们来看一下假如用户名和密码都不输入时的效果

我们来看一下假如用户名和密码都输入时的效果

我们来看一下假如用户名和密码还有确认密码都输入时的效果,并且密码和确认密码都相同时

那么,它会进入到success.jsp页面



3.使用ValidateXxx方法实现数据校验

  在validate()方法中对数据验证是可以工作的,如果在字段非常多的情况下,而且每个字段又有很复杂的验证,那么我们的validate方法中的代码会越来越多。  针对特定的方法输入的数据的验证我们把他放到validateXxx方法中,Xxx是方法名的首字母大写形式

步骤1:在Web项目的cn.happy.action下创建一个ValidateXxxAction(UserInfo为用户实体,其中有username和password属性,并且封装)    

标注黄颜色背景处的代码需要注意一下


public class ValidateXxxAction extends ActionSupport{
  private UserInfo info;
  //确认密码
  private String okpwd;

  public void validateRegist(){
    if(info.getUsername().length()<6){
      addFieldError("username", "用户名长度不能小于6位");
  }
  }
  
  public String regist(){
    return SUCCESS;
  }

  @Override
  public String execute() throws Exception{
    return SUCCESS;
  }

  //实现数据校验
  @Override
  public void validate() {
    if(info.getUsername().length()==0){
      addFieldError("username", "用户名不能为空");
  }

    if(info.getPassword().length()==0){
      addFieldError("pwd", "密码不能为空");
  }

    if(!info.getPassword().equals(okpwd)){
      addFieldError("pwd", "两次密码必须一致");
  }
}

  public UserInfo getInfo() {
    return info;
  }
  public void setInfo(UserInfo info) {
    this.info = info;
  }
  public String getOkpwd() {
    return okpwd;
  }
  public void setOkpwd(String okpwd) {
    this.okpwd = okpwd;
  }
  }

步骤2:创建struts.xml文件,引用ValidateXxxAction类(这里加多了一个method属性,用来指定实现的方法)

<struts>
    <!-- 修改文件 tomact不用重启 -->
    <constant name="struts.devMode" value="true" />

    <package name="default" namespace="/" extends="struts-default">
        <!-- 测试ValidateXxx方法 -->
         <action name="ValidateXxx" class="cn.happy.action.ValidateXxxAction" method="regist">
            <result name="success">success.jsp</result>
            <result name="input">regist.jsp</result>
        </action>
</struts>

步骤3.准备前段注册页面regist.jsp和成功页面success.jsp

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    <title>注册页面</title>
  </head>
  <body>
    <h2>用户注册</h2>
    <!-- 取出所有错误信息 -->
    <s:fielderror></s:fielderror>
    <s:form action="ValidateXxx" method="post">
    <s:textfield name="info.username" label="用户名"></s:textfield>
    <br/>
     <s:textfield name="info.password" label="密码"></s:textfield>
    <br/>
     <s:textfield name="okpwd" label="确认密码"></s:textfield>
    <br/>
    <s:submit value="注册"></s:submit>
    </s:form>
  </body>
</html>
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
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>成功页面</title>
  </head>
  <body>
    欢迎您!${info.username }
  </body>
</html>

我们来看一下假如用户名和密码都不输入时的效果

我们来看一下假如用户名输入小于6位的效果

我们来看一下假如用户名和密码都输入时的效果

我们来看一下假如用户名和密码还有确认密码都输入时的效果,并且密码和确认密码都相同时

那么,它会进入到success.jsp页面



4、用struts2的验证框架实现数据校验(这里将不再Action中进行数据校验,而是在cn.happy.action下创建一个ActionName-validation.xml的文件,在这个文件中进行数据校验

① 为什么要用验证框架:

当验证规则比较复杂时,Action类的代码将变得很繁琐,假如我们要对电话号码的格式进行验证,是非常麻烦的

②验证框架的优点:

Struts2中内置了一个验证框架,将常用的验证规则进行了编码实现,使用验证框架时,用户无需再进行编码,只要在外部配置文件中指定某个字段需要进行的验证类型,并提供出错误信息即可,从而大大减轻了开发者的负担,提高开发效率

③命名规范:

1、文件的命名规则:

  ActionName-validation.xml,ActionName为需要校验的Action类名,如:UserAction-validation.xml

 2、文件存放路径:

 该文件与Action类的class文件位于同一个路径下

3、文件格式:包括如下3个配置元素

   <field>: 为每一个需要校验的字段添加一个验证元素<field>,name属性表示要校验的字段名。

       <field-validator>: 使用该元素来指定校验规则,type属性为校验规则名

       <message>: 使用该元素来指定校验出错时要显示的标签,key属性指向资源文件中的标签名

步骤1:在Web项目的cn.happy.action下创建一个ValidateXxxAction(UserInfo为用户实体,其中有username和password属性,并且封装)

public class UserAction extends ActionSupport{

    private UserInfo info;
    private String okpwd;

    @Override
    public String execute() throws Exception {
        return SUCCESS;
    }

    public UserInfo getInfo() {
        return info;
    }
    public void setInfo(UserInfo info) {
        this.info = info;
    }
    public String getOkpwd() {
        return okpwd;
    }
    public void setOkpwd(String okpwd) {
        this.okpwd = okpwd;
    }
}

步骤2.在cn.happy.action下创建UserAction-validation.xml进行数据校验

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

        <validators>

         <!-- 用户名:不能为空 长度在6-10之间 -->
         <field name="info.username">
         <field-validator type="requiredstring">
         <param name="trim">true</param>
         <message>用户名不能为空</message>
         </field-validator>

         <field-validator type="stringlength">
         <param name="maxLength">10</param>
         <param name="minLength">6</param>
        <message>用户名长度必须在${minLength}和${maxLength}之间</message>
         </field-validator>

         </field>

        <!-- 验证密码-->
        <field name="info.password">
        <field-validator type="requiredstring">
        <message>密码不能为空</message>
        </field-validator>
        </field>

        <!-- 确认密码 -->

          <field name="okpwd">
        <field-validator type="fieldexpression">
        <param name="expression">info.password==okpwd</param>
        <message>密码和确认密码必须一致</message>
        </field-validator>
        </field>

        <!-- 验证电话号码 -->    

        <field name="info.phone">
        <field-validator type="requiredstring">
        <message>电话号码不能为空</message>
        </field-validator>
        </field>

        <field name="info.phone">
        <field-validator type="regex">
        <param name="regex">^(\d{3,4}-){0,1}(\d{7,8})$</param>
        <message>电话号码格式不正确</message>
        </field-validator>
        </field>
        </validators>

步骤3.创建struts.xml

<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
    <!-- 修改文件 tomact不用重启 -->
    <constant name="struts.devMode" value="true" />
    <package name="default" namespace="/" extends="struts-default">
             <action name="regist" class="cn.happy.action.UserAction">
            <result name="success">success.jsp</result>
            <result name="input">regist.jsp</result>
        </action>
    </package>
</struts>

步骤4.准备前段注册页面regist.jsp和成功页面success.jsp

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">

    <title>注册页面</title>

  </head>

  <body>
    <h2>用户注册</h2>

    <s:form action="regist" method="post">
    <s:textfield name="info.username" label="用户名"></s:textfield>
    <br/>

     <s:textfield name="info.phone" label="电话号码"></s:textfield>
    <br/>

     <s:textfield name="info.password" label="密码"></s:textfield>
    <br/>

     <s:textfield name="okpwd" label="确认密码"></s:textfield>
    <br/>

    <s:submit value="注册"></s:submit>

    </s:form>

  </body>
</html>
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
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>成功页面</title>

  </head>

  <body>
    欢迎您!${info.username }
  </body>
</html>

我们来看一下假如用户名和密码都不输入时的效果

我们来看一下假如用户名输入小于6位的效果

我们来看一下假如用户名和密码都输入时的效果

我们来看一下假如用户名和密码还有确认密码都输入时的效果,并且密码和确认密码都相同时

那么,它会进入到success.jsp页面



Struts2的几种数据校验方式就演示到这里了,希望对前来阅读的读者有帮助!

时间: 2024-12-26 22:02:09

使用Struts2实现数据校验的相关文章

(转)struts2:数据校验,通过XWork校验框架实现(validation.xml)

转载自:http://www.cnblogs.com/nayitian/p/3475661.html struts2:数据校验,通过XWork校验框架实现(validation.xml) 根据输入校验的处理场所的不同,可以将输入校验分为客户端校验和服务器端校验两种.服务器端验证目前有两种方式: 第一种: 参考:struts2:数据校验,通过Action中的validate()方法实现校验,图解 第二种: 使用validate()方法校验时,如果Web应用中存在大量Action就需要多次重写val

Struts2之数据校验

时间:2017-1-11 11:09 --Struts2提供的数据校验 在开发中,请求参数是需要校验的:    客户端:过滤正常用户的错误操作,通过JS代码完成    服务器:Java代码 Struts2提供的校验是服务器端校验. 校验方式分为两种:    1.手动校验(编码校验)    2.配置校验(自动校验,基于Annotation,基于XML) 1.手动校验:    要求:Action类必须继承ActionSupport,需要重写validate()方法(是Validateable接口中的

Struts2(五)数据校验

一.概述 在提交表单数据时,如果数据需要保存到数据库,空输入等可能会引发一些异常,为了避免引起用户的输入引起底层异常,通常在进行业务逻辑操作之前,先执行基本的数据校验. 下面通过两种方式来阐述Struts 2的数据校验功能. 二.重写validate方法 我们编写的Action一般继承与ActionSupport,而ActionSupport不仅实现了Action接口,还实现了Validatable接口,提供了数据校验功能.在Validatable接口中定义一个validate方法,重写该方法,

Struts2学习第三天——保存登陆信息及数据校验

在JSP中服务器端保存数据的作用域通常有request.session.application,它们对应的Servlet API分别是HttpServletRquerst.HttpSession.ServletContext.同样在Struts2的控制器中也需要访问这些作用域. Struts2提供了一个ActionContext类,该类被称为Action上下文或者Action环境,Action可以通过该类访问最常用的ServletAPI. ServletAPI有多种访问方式: 1. Servle

Struts2学习笔记(九)——数据校验

Struts2的数据校验属于服务器端校验,Struts2 支持校验方式 : 手动校验(代码校验) :在服务器端通过编写java代码,完成数据校验 自动校验(配置校验) :XML配置校验(主流) 和 注解配置校验 1.手动校验 1)Struts2的手动校验步骤: 首先要从页面中获取对应的标签name属性的值,在动作类action中声明同名的属性,提供get和set方法; 要继承ActionSupport类或者实现Validateable接口: 重写Validateable接口的validate()

struts2 之 struts2数据校验

1. 数据校验一般分为2类:前端的校验(js校验),后端的校验(java代码):实际开发中大部分情况下都是采用js校验.在对数据安全要求较高的情况下可能会采用后端验证. 2.  Struts2提供了后端验证机制.有两种方式来实现,一种是通过硬编码来实现,一种是通过校验框架来实现.在struts2如果使用struts2提供校验机制,那么必须继承ActionSuport类.该类中有一个vaildete方法,在处理的action类中重写该方法,那么在执行所有方法的时候,会执行validate方法.va

深入分析JavaWeb Item46 -- Struts2数据校验与国际化

1.用户输入数据的校验 1.校验方式 a:客户端校验.(防君子防不了小人)在页面中写js脚本. 这样做的好处是: 输入错误的话提醒比较及时: 减轻服务器的压力 b.服务器端校验. 数据安全 ,整个应用阻止非法数据的最后防线 而在实际开发中通常选择:a+b 2.服务器端数据校验: 1.编程式校验:自己Action中编写一个校验代码(缺点:验证规则都写在了代码中) 前提:动作类继承ActionSupport,重写Validateable接口中的validate()方法 ,在该方法中完成验证. 步骤如

Struts2学习第二天——获取参数与数据校验

文档版本 开发工具 测试平台 工程名字 日期 作者 备注 V1.0 2016.06.14 lutianfei none struts2中获取请求参数 在struts2中action是什么?(struts2是一个mvc框架) View : jsp Model : action Control : action & StrutsPrepareAndExecuteFilter 1.属性驱动 1.直接将action做一个model(类似bean结构),就可以得到请求参数. 问题1:action封装请求参

深入分析JavaWeb 46 -- Struts2数据校验与国际化

1.用户输入数据的校验 1.校验方式 a:客户端校验.(防君子防不了小人)在页面中写js脚本. 这样做的好处是: 输入错误的话提醒比较及时: 减轻服务器的压力 b.服务器端校验. 数据安全 ,整个应用阻止非法数据的最后防线 而在实际开发中通常选择:a+b 2.服务器端数据校验: 1.编程式校验:自己Action中编写一个校验代码(缺点:验证规则都写在了代码中) 前提:动作类继承ActionSupport,重写Validateable接口中的validate()方法 ,在该方法中完成验证. 步骤如