原创作者: 黑暗浪子   阅读:4414次   评论:6条   更新时间:2011-06-01    

如果From数据操作有误,比如输入不是我们需要的数据,又或者没有输入等输入原因。Action实例执行execute方法前会使用校验来进行控制。本节就是介绍如何在Struts2中实现校验功能。
技术要点
本节代码中还是使用登录功能作为示例

Action类中ActionSupport使用以及validate方法重写实现。
属性文件messageResource.properties定义以及JSP页面上错误信息如何显示。
导航结果页面演示。


演示代码

<!-------------------------文件名:LoginAction.java------------------->
public class LoginAction extends [b]ActionSupport [/b]{
	//校验方法,用来校验输入值为空或没有输入返回错误信息
	public void validate() {
		if (getUsername() == null || getUsername().trim().equals("")) {
			//返回错误信息键值,user.required包含具体内容见messageResource.properties
			addFieldError("username", getText("user.required"));
		}
		if (getPassword() == null || getPassword().trim().equals("")) {
			//返回错误信息键值,pass.required包含具体内容见messageResource.properties
			addFieldError("password", getText("pass.required"));
		}
	}
}

struts.properties定义显示信息文件名

<!------------文件名:struts.properties ------------->
#支持本地化的资源文件名定义
struts.custom.i18n.resources=messageResource
messageResource.properties定义出错信息
<!-------------------------------------------文件名:messageResource.properties -------------------------------->
#用key=value格式定义页面上显示的内容
user.required=请输入用户名!
pass.required=请输入密码!


登录JSP代码:

<!-------------------------文件名:login.jsp ------------------------>
<%@ page language="java" pageEncoding="gb2312"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<!-- struts2标签库调用声明 -->
<%@taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
	<title>登录页面</title>
</head>
<body>
	<!-- form标签库定义,以及调用哪个Action声明 -->
	<s:form action="Login">
		<table width="60%" height="76" border="0">
				<!-- 各标签定义 -->
				<s:textfield name="username" label="用户名"/>
				<s:password name="password" label="密  码" />
				<s:submit value="登录" align="center"/>				
		</table>
	</s:form>
</body>
</html> 

登录页面如图4.1所示。

图4.1  登录初始页面
不输入直接登录显出出错页面如图4.2所示。

图4.2  错误提示页面


输入数据页面如图4.3所示。



图4.3  输入数据页面
登录成功JSP代码:

<!------------------------文件名:success.jsp ------------------------>
<%@ page language="java" contentType="text/html; charset=GB2312"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
   <title>登录成功</title>
</head>  
<body>
	<!-- 取得session中用户名值 -->
    ${sessionScope.user},欢迎您~~
</body>
</html> 

登录成功页面如图4.4所示。

图4.4  登录成功页面


代码解释
(1)LoginAction类中继承ActionSupport类,此类也是Struts2自带的类之一。该类有一个validate方法,所以继承ActionSupport类的Action子类都可以通过重写此方法来定义自己开发的项目操作失败后的错误提示信息。
注意:Struts2类库里有个BaseAction类,该类也是继承ActionSupport类的。因此也可以在具体Action类代码里,直接继承BaseAction类。比如在LoginAction代码粗体所示处,将“ActionSupport”改为“BaseAction”,这样同样可以重写validate方法,不会产生任何编译错误。
如代码所示出错信息,其中addFieldError方法和getText方法也是ActionSupport类的方法,只是Action子类是直接调用没有重写它们。addFieldError方法顾名思义就是对JSP页面上Form中某个需要校验的field,如果操作有错误时候如何进行错误信息处理的方法。比如“username”就是JSP页面上这个字段的名字,而“user.required”是错误信息属性文件里定义的。我们使用 getText方法可以得到属性文件里“user.required”对应的具体错误信息。
注意:validate方法一般都是Action类执行execute方法之前执行,这样如果操作失败,就直接返回到struts.xml中定义的“input”指向的URL。而“input”指向的JSP页面也正是登录初始页面,如图4.2所示,在登录初始页面显示了错误提示信息。
(2)在Struts2中还有个很重要的概念就是属性文件,一般有个名字为struts.properties的属性文件是Struts2中全局属性配置的文件。如代码里看到的,对于本地化的处理,直接使用该文件里定义的messageResource.properties文件。
(3)messageResource.propertie文件定义的两个属性就是在Action类里显示的“user.required”和“pass.required”,采用“key=value”格式,定义了具体错误信息内容。
如果result值为“success”则转到success.jsp。在该示例中这个页面代码中我们显示了之前放置在HTTP的session里的用户名值。如图4.4所示。
如果result值为“input”则转到login.jsp。在该示例中,login.jsp将之前所述的错误提示信息值在JSP页面上显示。如图4.2所示。
(4)login.jsp里用Struts2的标签库显示Form和它里面各字段定义。具体标签使用方式可见之后章节内容,在此就不详述了。唯一值得说的就是只有在JSP页面使用Form标签,这节叙述的校验功能才会起作用。因为Form标签本身已具备显示校验错误的能力。

评论 共 6 条 请登录后发表评论
6 楼 fengshinianshao 2011-11-30 00:50
js是可以完成客户端验证,这里讲解的是struts的功能,不冲突。尤其时国际化,在开发中也会用到。不错,支持。
5 楼 monk0271 2011-05-07 16:24
4楼正解,这篇文章不错
4 楼 hanliwoyaoai 2011-04-21 09:55
有时候前台验证是可以被绕过的 
3 楼 gaiyinzhijia 2011-04-18 10:13
这种校验在前台验证就好了吧?JS完全可以做到,Action里面可以做一些前台不容易判断的校验
2 楼 diandian 2010-12-01 17:44
这样不能给 错误信息 润色加粗之类的哦。
1 楼 windFeng 2010-11-10 21:39
正准备用这个方式试试

发表评论

您还没有登录,请您登录后再发表评论

文章信息

Global site tag (gtag.js) - Google Analytics