13. 输入校验
在struts2中,我们可以实现对action的所有方法进行校验或者对action的指定方法进行校验。
对于输入校验,struts2提供了两种实现方法:
1. 采用手工编写代码实现。
2. 基于XML配置方式实现。
3. 采用Annotations配置方式实现(deprecated)。
这一节,主要讨论采用手工编写代码实现校验。
13.1 对action所有方法进行校验
通过重写validate() 方法实现, validate()方法会校验action中所有与execute方法签名相同public String xxx()的方法,即在调用action的execute等方法之前对用户的输入信息进行校验。当某个数据校验失败时,我们应该调用addFieldError()方法往系统的fieldErrors添加校验失败信息(为了使用addFieldError()方法,action需要继承ActionSupport ),如果系统的fieldErrors包含失败信息,struts2会将请求转发到名为input的result视图。在input视图中可以通过显示失败信息。
案例一:对用户输入的用户名和手机号码进行校验。要求输入字段不能为空,手机号码符合要求。
(1)用户输入界面input.jsp
<form action="/Struts2Study/day05_2/login.action" method="post">
username:<input type="text" name="username"/><br>
phone: <input type="text" name="phone"/><br>
<input type="submit" value="注册">
</form>
(2)LoginAction对用户输入进行校验
public class LoginAction extends ActionSupport{
private String message;
private String username;
private String phone;
// 省略了set和get方法
public String execute() {
this.message = "注册成功!";
return "message";
}
/* ActionSupport类的validates()方法实现了默认的校验实现,但没有实质性的校验
* 因此ActionSupport的子类需要覆盖这个方法以提供校验。
*/
@Override
public void validate() {
if (this.username == null || "".equals(this.username)) {
this.addFieldError("errormessage", "用户名不能为空!");
}
if (this.phone == null || "".equals(this.phone)) {
this.addFieldError("errormessage", "号码不能为空!");
} else {
String regex ="^1[358]\\d{9}$";
boolean phone = Pattern.compile(regex).matcher(this.phone).matches();
if (!phone) {
this.addFieldError("errormessage", "号码格式出错!");
}
}
}
}
(3)配置struts.xml
<package name="day05-2" namespace="/day05_2" extends="struts-default">
<action name="login" class="com.markliu.day05.interceptor.LoginAction" method="execute">
<result name="message">/pages/day05/message.jsp</result>
<result name="input">/pages/day05/input.jsp</result>
</action>
</package>
如果验证失败,即validate()函数执行完,且设置类错误信息addFieldError(),则不会继续执行action中锁验证的方法,直接跳转到name为input的视图,此处重新转发到登录输入界面。
(4)为input视图获取fielderror信息
<s:fielderror />
13.2 对action指定方法进行校验
通过validateXxx()方法实现, validateXxx()只会校验action中方法名为Xxx的方法。其中Xxx的第一个字母要大写。当某个数据校验失败时,我们应该调用addFieldError()方法往系统的fieldErrors添加校验失败信息(为了使用addFieldError()方法,action可以继承ActionSupport ),如果系统的fieldErrors包含失败信息,struts2会将请求转发到名为input的result。在input视图中可以通过<s:fielderror/>
显示失败信息。
所以上述案例如果只针对save方法进行校验,则只提供validateSave()即可:
public void validateSave() {
if (this.username == null || "".equals(this.username)) {
this.addFieldError("errormessage", "用户名不能为空!");
}
if (this.phone == null || "".equals(this.phone)) {
this.addFieldError("errormessage", "号码不能为空!");
} else {
String regex ="^1[358]\\d{9}$";
boolean phone = Pattern.compile(regex).matcher(this.phone).matches();
if (!phone) {
this.addFieldError("errormessage", "号码格式出错!");
}
}
}
13.3 校验执行流程:
- 类型转换器对请求参数执行类型转换,并把转换后的值赋给action中的属性。
- 转换过程中若出现异常,则将异常信息保存到ActionContext中,conversionError拦截器将其添加到fieldError中。不管类型转换是否出现异常,都会进入第3步。
- 通过反射调用validateXxx()方法(自定义校验的方法)。
- 调用validate()。
如果未出现异常,则转入用户请求的处理方法,如果出现异常,则转入inout视图所指定的视图资源。
注意:由于类型转换出现异常,也会将错误信息添加到fileErrors中,不管validateXxx()和validate()方法校验是否成功,都会跳转到input视图,所以如果应用中出现校验正确仍然跳转到input视图,则需考虑是否是类型转换异常。当然了,类型转换异常在后台console中还容易发现。
转载请注明出处:http://blog.csdn.net/mark_lq/article/details/49804285