struts2输入验证--validate()方法验证

1.action类

  1. package edu.hust.action;
  2. import java.util.Calendar;
  3. import java.util.Date;
  4. import com.opensymphony.xwork2.ActionSupport;
  5. public class RegisterAction extends ActionSupport {
  6.     
  7.     private static final long serialVersionUID = 1L;
  8.     
  9.     private String username;
  10.     private String password;
  11.     private String repassword;
  12.     private int age;
  13.     private Date birthday;
  14.     private Date graduation;
  15.     
  16.     //为了节省篇幅, 便于阅读, 这里将setter方法和getter方法全部省略了
  17.     public void validate() {
  18.         /*
  19.          * 1.遇到类型转换错误的时候(也就是说不能进行类型转换), struts2框架自动生成一条错误信息,并且将该错误信息放到addFieldError里面, 最后这个信息会显示在相应的错误页中。
  20.          *   在这里我们不推荐使用struts2的自动验证,其一其功能有限,其二其错误输出信息只是给程序员看的,而会让使用者一头雾水。
  21.          *   解决方法:找到自动提示的错误信息,将错误信息内容覆盖为我们希望看到的--通过资源文件。
  22.          * 
  23.          * 2.空表单提交struts如何处理(不论是从register.jsp提交还是从register.action提交, 以下结论都符合)
  24.          *  (1)String类型, setter方法接收的值为空字符串:是"", 而不是null。
  25.          *  (2)int类型, setter方法接收的值为0。
  26.          *  (3)Date类型, setter方法接收的值为null。
  27.          * 
  28.          * 2.错误表单提交且类型无法转换
  29.          *   (1)int类型(如表单中输入abc, 则无法转换为int类型), setter方法接收的值为0。
  30.          *   (2)Date类型(如表单中输入abc, 则无法转换为Date类型), setter方法接收的值为null。
  31.          *   这种错误struts2会自动生成错误信息:这就带来一个bug, 如果是空表单提交, struts2不会自动生成错误信息, 我们必须人为添加错误信息, 人为添加后, 再出现错误表单提交, 这是错误输出页(即表单页)会将我们自定义的错误输出和系统自动添加的错误输出全打印出来, 造成了重复。
  32.          *   解决方案:(1)使用addActionError(); (2)s:textfield等表单标签有一个theme(主题)属性, 默认主题是使用表格; 还有Ajax等主题, 这里换为simple主题, 表示不再用表格封装这个标签(相当于把s:textfield变为了input type="text")。这样就可以消除了自动提示。(补充:s:form也有theme这个属性)
  33.          * 
  34.          * */
  35.         if (username.trim().length() < 5 || username.trim().length() > 11) {
  36.             this.addFieldError("username""用户名长度必须在6~10之间");
  37.         }
  38.         
  39.         if (!(password.length() > 5 && password.length() < 11) || !(repassword.length() > 5 && repassword.length() < 11)) {
  40.             this.addFieldError("password""密码长度必须在6~10之间");
  41.         } else if (!password.equals(repassword)) {
  42.             this.addFieldError("password""请确认两次输入的密码一致");
  43.         }
  44.         
  45.         if (age < 0 || age > 150) {
  46.             this.addFieldError("age""请输入正确年龄");
  47.         }
  48.         
  49.         if (birthday != null && graduation != null) {
  50.             Calendar cBirthday = Calendar.getInstance();
  51.             cBirthday.setTime(birthday);
  52.             Calendar cGraduation = Calendar.getInstance();
  53.             cGraduation.setTime(graduation);
  54.             if (cBirthday.after(cGraduation)) {
  55.                 this.addFieldError("birthday""出生日期怎么可能大于毕业日期!!好好注册!!");
  56.             }
  57.         } else {
  58.             this.addFieldError("birthday""出生日期和毕业日期不能为空");
  59.         }
  60.         
  61.     }
  62.     
  63.     public String execute() throws Exception {
  64.         return SUCCESS;
  65.     }
  66.     
  67. }

2.register.jsp

  1. <%@ page contentType="text/html;charset=GBK"%>
  2. <%@ taglib prefix="s" uri="/struts-tags" %>
  3. <!-- struts2的s标签可以自动将程序中通过addFieldError()方法添加的错误显示出来 -->
  4. <!-- 如果不使用struts2的s标签,可以通过s:fielderror/s:actionerror标签将错误打印出来,它的作用和struts1中的html:errors作用一致 -->
  5. <!-- 在表单提交失败时,希望原来填过的值可以保留,struts2的s标签自动有保留功能,html标签需要通过request的el表达式实现保留 -->
  6. <!-- 和html不同, struts2的s:form标签默认提交方式为post(method参数默认为post) -->
  7. <s:form action="register">
  8.     
  9.     <s:textfield name="username" label="请输入用户名" />
  10.     <s:password name="password" label="请输入密码" />
  11.     <s:password name="repassword" label="请重新输入密码" />
  12.     <s:textfield name="age" label="请输入密码" />
  13.     <s:textfield name="birthday" label="请输入出生日期" />
  14.     <s:textfield name="graduation" label="请输入毕业日期" />
  15.     <s:submit value="提交" />
  16.     <s:reset value="重新添加" />
  17.     
  18. </s:form>

3.如何修改struts2在类型输入错误时自动生成的错误信息:通过"全局/局部的验证错误信息输出转换资源文件"可以实现。

  1. # 全局的验证错误信息输出转换
  2. # 例如对于age表单:没改写之前系统自动错误信息为Invalid field value for field "age". 经过下面这句改写后, 系统自动错误信息为age error
  3. # 局部.properties和全局.properties同时作用于验证错误信息输出转换时,局部有效、全局无效。
  4. xwork.default.invalid.fieldvalue = {0} error
  1. # 局部的验证错误信息输出转换
  2. # 注意命名方式。应该与在要验证的Action放在同一个包下,而且名字RegisterAction.java与RegisterAction.properties要对应起来。
  3. # 局部的验证错误信息输出转换。例如对于age表单:没改写之前系统自动错误信息为Invalid field value for field "age". 经过下面这句改写后, 系统自动错误信息为age error
  4. # 局部.properties和全局.properties同时作用于验证错误信息输出转换时,局部有效、全局无效。
  5. invalid.fieldvalue.age = age conversion error.

4.最后是struts.xml,在valudate()验证时,这里就没有特别之处了

  1. <!DOCTYPE struts PUBLIC
  2.           "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
  3.           "http://struts.apache.org/dtds/struts-2.0.dtd">
  4. <struts>
  5.     <package name="struts2" extends="struts-default">
  6.         <action name="register" class="edu.hust.action.RegisterAction">
  7.             <result name="input">/register.jsp</result>
  8.             <result>/result.jsp</result>
  9.         </action>
  10.     </package>
  11. </struts>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值