码农小汪-struts2学习5-表单的验证的两种方法

来源:互联网 发布:蜘蛛池监控软件 编辑:程序博客网 时间:2024/05/14 04:19

表单的验证对于我们现在来说,简直太正常了,可以采用的方式很多,每一种都有自己特殊的一面,如何使用好这个问题,真的不小。现在说吧,可以基于js的前台的验证,也可以是我们通过ajax配合使用json传递状态码来标识就我们的状态的信息。不仅如此,现在的h5中的表单根本不需要进行任何的验证就可以把错误的信息反馈给你,相当的强大,但是终究一点,现在我们说的是这个框架嘛,所以,我们还是来说说这个吧


表单验证

  1. 手工验证
  2. 动态的验证
    上面的两种验证方式都是可以的,动态验证是基于配配置的验证的方式,手工从名字就可以知道,完全基于手动的去实现这个验证的功能

手工验证

使用 Struts 2.0,表单数据的输入将变得非常方便,和普通的 POJO 一样在 Action 编写 Getter 和 Setter,
然后在 JSP 的 UI 标志的 name 与其对应,在提交表单到 Action 时,就可以取得其值,不需要像我们的servlet一样的不断的去get属性的值,这个样子非常的不方便哦,如今处理非常的方便塞,这个和spring的处理方式类似,采取依赖注入实现的,需要get/set方法,之前讲过

import com.opensymphony.xwork2.ActionSupport;public class Login extends ActionSupport {    private User user;    private String message;    public String getMessage() {        return message;    }    @Override    public String execute() {        if ("xmh".equals(user.getName()) && "xmh".equals(user.getPassword())) {            message = "Welcome, " + user.getName();        } else {            message = "Invalid user or password";        }        return SUCCESS;    }    public User getUser() {        return user;    }    public void setUser(User user) {        this.user = user;    }}

第二个例子直接使用从写重写 validate()方法,验证的方式,和前面的差不多
也是把校验条件写在 validate()方法里面.这样可以减少 execute()或是自定义的 action 方法的代码.struts2 在调用 execte()方法时,会先执行 validate()方法.如果没通过 validate 则会抛出 fieldError,并返回name=”input”中定义的视图.否则继续执行 execute()方法

import com.opensymphony.xwork2.ActionSupport;public class ValidateAction extends ActionSupport {    private String msg;    public String execute() {        System.out.println(SUCCESS);        return SUCCESS;    }    public void validate() {        if (!msg.equalsIgnoreCase("hello")) {            System.out.println(INPUT);            this.addFieldError("msg.hello", "必须输入 hello!");            this.addActionError("处理动作失败!");        } else {            this.addActionMessage("提交成功");        }    }    public String getMsg() {        return msg;    }    public void setMsg(String msg) {        this.msg = msg;    }}
<%@ page language="java" import="java.util.*" pageEncoding="GBK"%><%@ taglib prefix="s" uri="/struts-tags"%><html><head><title>验证数据</title></head><body>    <s:actionerror /> 这里就是上面的    <s:actionmessage />    <s:form action="validate.action" theme="simple">输入内容: <s:textfield name="msg" />        <s:fielderror>            <s:param>msg.hello</s:param>        </s:fielderror>        <br />        <s:submit value="登 录" />        <s:reset value="重填" />    </s:form></body></html>
在struts2框架中,例如在完成数据类型转换、数据校验时如果出现错误信息,我们会利用ActionSupport类中addFieldError方法来添加错误信息内容(如:在Action中使用.addFieldError("username" , "用户名已存在!");)。在JSP页面中利用<s:fielderror/>标签在相应的字段处输出错误信息。(如:JSP页面:<s:textfield name="username" label="用户名"/>,在该处后面使用<s:fielderror/>标签, 那么上面的错误信息也就会显示到username这个输入框的旁边。)但是,在实际开发中,<s:fielderror/>它会输出全部的错误信息内容。而如果想选择性地输出指定错误信息。我们可以使用如下代码解决:第一种方法:<s:fielderror>    <s:param>username</s:param> <!--显示指定的 username字段的 错误消息-->    <s:param>username2</s:param> <!--显示指定的 username2字段的 错误消息-->  <s:fielderror/>  第二种方法:<s:fielderror fieldName="username"/> <!--显示指定的 username字段的 错误消息-->  <s:fielderror fieldName="username2"/> <!--显示指定的 username2字段的 错误消息-->  

这里的东西都必须使用标签次啊可以显示出来的!,晓得?


之前不是说过?,我们的一个Action中可以写很多的的method,不同的method肯定验证的方式可能不同是,体现的逻辑也是不一样的哦,仅仅从写方法显然不够,框架给我们了一些规范的知道,可以解决那些问题的规范操作
如果输入校验只想校验某个处理逻辑,也就是仅仅校验某个处理方法,则重写 validate 方法显然不
够, validate()方法无法知道需要校验哪个处理逻辑。实际上,如果重写了 Action 的 validate 方法,则该
方法会校验所有的处理逻辑。
为了实现校验指定处理逻辑的功能,struts2 的 Action 提供了一个 validateXXX 方法。XXX 即是 Action对应的处理逻辑方法。

public class NewValidateAction extends ActionSupport {    private String msg; // 必须输入    private Integer age; // 在 13 和 20 之间    // ……省略相应的 set/get 方法    public void validateRegist(){      System.out.println("\\d 匹配数字 "+"8".matches("\\d"));   if(msg==null||"".equals(msg)){addFieldError("msg","ValidateXXX 方法:用户名为必填项");}if(age==null||age<13||age>20){addFieldError("age","ValidateXXX 方法:年龄为必填项并且为数字,范围在 13-20间");}}    public String regist() {        return SUCCESS;    }}

看上去差不多的样子哦。很方便……..

  • 使用 validate 方法来验证客户端提交的数据,但如果使用 validate 方法就会将验证代码和正常的逻辑代码混在一起,但这样做不利于代码维护,而且也很难将过些代码用于其他程序的验证。在 Struts2 中为
    我们提供了一个 Validation 框架,是通过 XML 文件进行配置。

动态验证

  • 在 action 的包下创建 action-validation.xml 文件
    这个我是在文档中找的
<field name="email_address"> //这里是action中的字段,也是form中的name的属性一一对应的, 下面就是直接调用框架给你写的就行了    <field-validator type="required">         <message>You cannot leave the email address field empty.</message>     </field-validator>     <field-validator type="email">         <message>The email address you entered is not valid.</message>     </field-validator> </field> <validator type="required">     <param name="fieldName">email_address</param>     <message>You cannot leave the email address field empty.</message> </validator> <validator type="email">     <param name="fieldName">email_address</param>    这里的fileName,是供出中使用的,也可以对于国际化    <message>The email address you entered is not valid.    </message> //这里是提示错误的信息的</validator> 

< s:fielderror />表示显示全部校验信息 ,一般没必要,


<validators>  <field name="bar">      <field-validator type="required">          <message>You must enter a value for bar.</message>      </field-validator>      <field-validator type="int">          <param name="min">6</param>          <param name="max">10</param>          <message>bar must be between ${min} and ${max}, current value is ${bar}.</message>      </field-validator>  </field>  <field name="bar2">      <field-validator type="regex">          <param name="expression">[0-9],[0-9]</param>          <message>The value of bar2 must be in the format "x, y", where x and y are between 0 and 9</message>     </field-validator>  </field>  <field name="date">      <field-validator type="date">          <param name="min">12/22/2002</param>          <param name="max">12/25/2002</param>          <message>The date must be between 12-22-2002 and 12-25-2002.</message>      </field-validator>  </field>  <field name="foo">      <field-validator type="int">          <param name="min">0</param>          <param name="max">100</param>          <message key="foo.range">Could not find foo.range!</message>      </field-validator>  </field>  <validator type="expression">      <param name="expression">foo lt bar </param>      <message>Foo must be greater than Bar. Foo = ${foo}, Bar = ${bar}.</message>  </validator></validators>

上面有很多的常用的东西,我们在使用的时候,不用特别的清楚,使用的时候直接去查找就行了。

总结: struts2 数据校验是在 web server 上的实现,因此有可能增加 web server 的负荷。所以纯粹的空值校验,可以用 JavaScript 实现的。当然如果客户端禁用 Javascript 或是不支持 JavaScript,那就是另外一回事了。另外使用 struts 作为数据校验,应尽可能地使用框架进行校验,可以实现 action 与 validation分离,减少代码量。只有在校验框架满足不了需求时,才要重写 validate()方法.最后的选择是重写validateXXX()方法

1 0
原创粉丝点击