您的位置:首页 > 编程语言 > Java开发

Struts2:对Action中方法进行输入校验

2015-10-21 09:27 435 查看
源码下载地址:http://download.csdn.net/detail/zhoujing_0424/9239429

在struts2中,我们可以实现对action的所有方法进行校验或对action的指定方法进行校验。对于输入校验,struts2提供了两种实现方法:

1.采用手工编写代码实现

2.基于XML配置方式实现

1.采用手工编写代码实现

(1)首先提供输入界面inputValidate.jsp和结果显示界面message.jsp。

inputValidate.jsp:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>

<body>
<s:fielderror></s:fielderror><!-- 输出错误信息内容 -->
<form action="${pageContext.request.contextPath}/control/person/manage_update.action" method="post">
用户名:<input type="text" name="username" >不能为空<br><br>
手机号:<input type="text" name="mobile" >不能为空,并且要符合手机号格式<br><br>
<input type="submit" value="提交"><br><br>
</form>
</body>
</html>


message.jsp:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>

<body>
<%String username1=new String(request.getParameter("username").getBytes("ISO-8859-1"),"UTF-8"); %>
${message}<br>
用户名为:<%=username1 %><br>
手机号为:${mobile}<br>
</body>
</html>


(2)创建PersonAction继承ActionSupport,通过重写validate()方法实现输入校验,validate()方法会校验action中所有与execute方法签名相同的方法。当某个数据校验失败时,我们可以调用addFieldError()方法往系统的fieldErrors添加校验失败信息。如果系统的fieldErrors包含失败信息,sturts2会将请求转发到名为input的result。在input视图中,可以通过
<s:fielderror/>
标签显示失败信息。

PersonAction.java:

package cn.zj.action;

import java.util.regex.Pattern;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

public class PersonAction extends ActionSupport{
private String username;
private String mobile;

public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getMobile() {
return mobile;
}
public void setMobile(String mobile) {
this.mobile = mobile;
}

public String update(){
ActionContext.getContext().put("message", "更新成功");
return "message";
}

public String save(){
ActionContext.getContext().put("message", "保存成功");
return "message";
}

@Override
public void validate() {//validate()会对action中的所有方法校验
if(this.username==null || "".equals(this.username.trim())){
this.addFieldError("username", "用户名不能为空");
}
if(this.mobile==null || "".equals(this.mobile.trim()))
{
this.addFieldError("mobile", "手机号不能为空");
}else{
//使用正则表达式判断手机号,第一个数字为1,第二个数字为3或5或8,后面跟9位数字
if(!Pattern.compile("^1[358]\\d{8}$").matcher(mobile).matches()){
this.addFieldError("mobile", "手机号格式不正确");
}
}
}
}


(3)配置action。

struts_user.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
<package name="person" namespace="/control/person" extends="struts-default">
<action name="manage_*" class="cn.zj.action.PersonAction" method="{1}">
<result name="input">/inputValidate.jsp</result>
<result name="message">/WEB-INF/page/message.jsp</result>
</action>
</package>
</struts>


(4)测试。

a. 打开浏览器,输入http://localhost:8080/Struts2/inputValidate.jsp,界面如下:



b. 输入框中什么都不输入,点击“提交”按钮,显示结果如下:



c. 输入框中输入错误的手机号,如下:



点击“提交”按钮,结果如下:



d. 输入正确的用户名和手机号,结果如下:



(5)对action中指定方法进行校验。

上述方法会对action中的所有方法都进行输入校验,若只想对action中的指定方法进行校验,只需将PersonAction中的validate()方法名称改成validateXxx()即可,其中Xxx为对应的方法名称,Xxx的第一个字母要大写。如本例中,若只想对PersonAction中的save()方法进行校验,则可以将validate()方法名称改为validateSave()即可。

(6)总结:输入校验的流程。

a. 类型转换器对请求参数执行类型转换,并把转换后的值赋给action中的属性。

b. 如果在执行类型转换的过程中出现异常,系统会将异常信息保存到ActionContext,conversionError拦截器将异常信息封装到fieldErrors里。不管类型转换是否出现异常,都会进入第c步。

c. 系统通过反射技术先调用action中的validateXxx()方法,Xxx为方法名。

d. 再调用action中的validate()方法。

e. 经过上面4步,如果系统中的fieldErrors存在错误信息(即存放错误信息的集合的size大于0),系统自动将请求转发至名称为input的视图。如果系统中的fieldErrors没有任何信息,系统将执行action中的处理方法。

2.基于XML配置方式实现

(1)使用基于XML配置方式实现输入校验时,Action也需要继承ActionSupport,并提供校验文件,校验文件和action类放在同一个包下。校验文件的名称格式为:ActionClassName-validate.xml,其中ActionClassName位action的简单类名,-validate.xml为固定写法。和上面方式1(即手工编写代码实现输入校验,以下简称方式1)对应,我们在PersonAction类所在包下创建PersonAction-validate.xml文件,文件内容如下:

ActionClassName-validate.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
"-//OpenSymphony Group//XWork Validator 1.0.2//EN"
"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">

<validators>
<field name="username"><!-- action中需要校验的属性 -->
<field-validator type="requiredstring"><!-- 指定校验器 -->
<param name="trim">true</param> <!-- 为校验器中的属性trim注值,trim默认值也为true,可以省略不写,作用为去掉字符串前后的空格 -->
<message>XML用户名不能为空</message><!-- 校验失败后的提示信息 -->
</field-validator>
</field>
<field name="mobile"><!-- action中需要校验的属性 -->
<field-validator type="requiredstring"><!-- 指定校验器 -->
<message>XML手机号不能为空</message><!-- 校验失败后的提示信息 -->
</field-validator>
<field-validator type="regex"><!-- 指定校验器 -->
<param name="expression"><![CDATA[^1[358]\d{9}$]]></param><!-- 为expression属性注入值 -->
<message>XML手机号格式不正确</message><!-- 校验失败后的提示信息 -->
</field-validator>
</field>
</validators>


其中,
<field>
指定action中要校验的属性;
<field-validator>
指定校验器,上面指定的校验器requiredstring和regex都由strut2系统提供,系统提供了能满足大部分验证需求的校验器;
<message>
为校验失败后的提示信息。

(2)PersonAction与方式1的相同,只需将validate()方法删除即可。

代码省略。

(3)测试。

测试方法与方式1相同,省略。

(4)对action中指定方法进行校验。

当校验文件取名为ActionClassName-validate.xml时,会对action中的所有处理方法进行输入验证。如果只需要对action中的某个方法实施校验时,只需将文件名取为:ActionClassName-ActionName-validate.xml,其中ActionName为struts.xml中的action名称。例如方式1中对action中的save方法进行校验时,则文件名为:PersonAction-manage_save-validation.xml。

(5)附:struts2提供的校验器列表。

- required:必填校验器,要求field的值不能为null)

- requiredstring:必填字符串校验器,要求field的值不能为null,并且长度大于0,默认情况下会对字符串去前后空格

- stringlength:字符串长度校验器,要求field的值必须在指定的范围内,否则校验失败,minLength参数指定最小长度,maxLength参数指定最大长度,trim参数指定校验field之前是否去除字符串前后的空格

- regex:正则表达式校验器,检查被校验的field是否匹配一个正则表达式,expression参数指定正则表达式,caseSensitive参数指定进行正则表达式匹配时,是否区分大小写,默认值为true

- int:整数校验器,要求field的整数值必须在指定范围内,min指定最小值,max指定最大值

- double:双精度浮点数校验器,要求field的双精度浮点数必须在指定范围内,min指定最小值,max指定最大值

- fieldexpression:字段OGNL表达式校验器,要求field满足一个ognl表达式,expression参数指定ognl表达式,该逻辑表达式基于ValueStack进行求值,返回true时校验通过,否则不通过

- email:邮件地址校验器,要求如果field的值非空,则必须是合法的邮件地址

- url:网址校验器,要求如果field的值非空,则必须是合法的url地址

- date:日期校验器,要求field的日期值必须在指定范围内,min指定最小值,max指定最大值

- conversion:转换校验器,指定在类型转换失败时,提示的错误信息

- visitor:用于校验action中的复合属性,它指定一个校验文件用于校验复合属性中的属性

- expression:OGNL表达式校验器,expression参数指定ognl表达式,该逻辑表达式基于ValueStack进行求值,返回true时校验通过,否则不通过,该校验器不可用在字段校验器风格的配置中
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: