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

action类

package edu.hust.action;

import java.util.Calendar;
import java.util.Date;

import com.opensymphony.xwork2.ActionSupport;

public class RegisterAction extends ActionSupport {

private static final long serialVersionUID = 1L;

private String username;
private String password;
private String repassword;
private int age;
private Date birthday;
private Date graduation;

//为了节省篇幅, 便于阅读, 这里将setter方法和getter方法全部省略了

public void validate() {
/*
* 1.遇到类型转换错误的时候(也就是说不能进行类型转换), struts2框架自动生成一条错误信息,并且将该错误信息放到addFieldError里面, 最后这个信息会显示在相应的错误页中。
* 在这里我们不推荐使用struts2的自动验证,其一其功能有限,其二其错误输出信息只是给程序员看的,而会让使用者一头雾水。
* 解决方法:找到自动提示的错误信息,将错误信息内容覆盖为我们希望看到的--通过资源文件。
*
* 2.空表单提交struts如何处理(不论是从register.jsp提交还是从register.action提交, 以下结论都符合)
* (1)String类型, setter方法接收的值为空字符串:是"", 而不是null。
* (2)int类型, setter方法接收的值为0。
* (3)Date类型, setter方法接收的值为null。
*
* 2.错误表单提交且类型无法转换
* (1)int类型(如表单中输入abc, 则无法转换为int类型), setter方法接收的值为0。
* (2)Date类型(如表单中输入abc, 则无法转换为Date类型), setter方法接收的值为null。
* 这种错误struts2会自动生成错误信息:这就带来一个bug, 如果是空表单提交, struts2不会自动生成错误信息, 我们必须人为添加错误信息, 人为添加后, 再出现错误表单提交, 这是错误输出页(即表单页)会将我们自定义的错误输出和系统自动添加的错误输出全打印出来, 造成了重复。
* 解决方案:(1)使用addActionError(); (2)s:textfield等表单标签有一个theme(主题)属性, 默认主题是使用表格; 还有Ajax等主题, 这里换为simple主题, 表示不再用表格封装这个标签(相当于把s:textfield变为了input type="text")。这样就可以消除了自动提示。(补充:s:form也有theme这个属性)
*
* */
if (username.trim().length() < 5 || username.trim().length() > 11) {
this.addFieldError("username", "用户名长度必须在6~10之间");
}

if (!(password.length() > 5 && password.length() < 11) || !(repassword.length() > 5 && repassword.length() < 11)) {
this.addFieldError("password", "密码长度必须在6~10之间");
} else if (!password.equals(repassword)) {
this.addFieldError("password", "请确认两次输入的密码一致");
}

if (age < 0 || age > 150) {
this.addFieldError("age", "请输入正确年龄");
}

if (birthday != null && graduation != null) {
Calendar cBirthday = Calendar.getInstance();
cBirthday.setTime(birthday);
Calendar cGraduation = Calendar.getInstance();
cGraduation.setTime(graduation);
if (cBirthday.after(cGraduation)) {
this.addFieldError("birthday", "出生日期怎么可能大于毕业日期!!好好注册!!");
}
} else {
this.addFieldError("birthday", "出生日期和毕业日期不能为空");
}

}

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

}
2.register.jsp

<%@ page contentType="text/html;charset=GBK"%>
<%@ taglib prefix="s" uri="/struts-tags" %>

<!-- struts2的s标签可以自动将程序中通过addFieldError()方法添加的错误显示出来 -->
<!-- 如果不使用struts2的s标签,可以通过s:fielderror/s:actionerror标签将错误打印出来,它的作用和struts1中的html:errors作用一致 -->
<!-- 在表单提交失败时,希望原来填过的值可以保留,struts2的s标签自动有保留功能,html标签需要通过request的el表达式实现保留 -->

<!-- 和html不同, struts2的s:form标签默认提交方式为post(method参数默认为post) -->

<s:form action="register">

<s:textfield name="username" label="请输入用户名" />
<s:password name="password" label="请输入密码" />
<s:password name="repassword" label="请重新输入密码" />
<s:textfield name="age" label="请输入密码" />
<s:textfield name="birthday" label="请输入出生日期" />
<s:textfield name="graduation" label="请输入毕业日期" />
<s:submit value="提交" />
<s:reset value="重新添加" />

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

# 全局的验证错误信息输出转换

# 例如对于age表单:没改写之前系统自动错误信息为Invalid field value for field "age". 经过下面这句改写后, 系统自动错误信息为age error

# 局部.properties和全局.properties同时作用于验证错误信息输出转换时,局部有效、全局无效。

xwork.default.invalid.fieldvalue = {0} error
# 局部的验证错误信息输出转换

# 注意命名方式。应该与在要验证的Action放在同一个包下,而且名字RegisterAction.java与RegisterAction.properties要对应起来。

# 局部的验证错误信息输出转换。例如对于age表单:没改写之前系统自动错误信息为Invalid field value for field "age". 经过下面这句改写后, 系统自动错误信息为age error

# 局部.properties和全局.properties同时作用于验证错误信息输出转换时,局部有效、全局无效。

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

<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
<package name="struts2" extends="struts-default">
<action name="register" class="edu.hust.action.RegisterAction">
<result name="input">/register.jsp</result>
<result>/result.jsp</result>
</action>
</package>
</struts>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值