论坛首页 Java企业应用论坛

Struts2讲义4

浏览 4416 次
锁定老帖子 主题:Struts2讲义4
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (5)
作者 正文
   发表时间:2009-03-11   最后修改:2009-10-24
使用ActionSupport进行校验
如果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标签本身已具备显示校验错误的能力。
  • 大小: 36 KB
  • 大小: 39.3 KB
  • 大小: 40.1 KB
  • 大小: 32.9 KB
   发表时间:2009-10-23  

应想将页面控件布局,顾
<s:form action="login" method="post" theme="simple">
采用此方式;
可是表单验证却失效,即未填用户名便提交,
this.addFieldError("userIdError", this.getText("user.userIdRequired"));
可是页面中便不显示出错信息。若把theme="simple"去掉,验证便有效。
请问楼主如何使两者都有效。

 

0 请登录后投票
   发表时间:2009-10-24  
zhangyuqing052 写道
应想将页面控件布局,顾 <br><s:form action="login" method="post" <span style="color: #ff0000;">theme="simple"</span>> <br>采用此方式; <br>可是表单验证却失效,即未填用户名便提交, <br>this.addFieldError("userIdError", this.getText("user.userIdRequired")); <br>可是页面中便不显示出错信息。若把theme="simple"去掉,验证便有效。 <br>请问楼主如何使两者都有效。

 

很奇怪,我加了theme="simple"还是行的啊,而且我的代码里是
# 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"));  
#         }  

哪里有你说的“this.addFieldError("userIdError", this.getText("user.userIdRequired"));”?
0 请登录后投票
   发表时间:2009-10-26  
黑暗浪子 写道
zhangyuqing052 写道
应想将页面控件布局,顾 <br><s:form action="login" method="post" <span style="color: #ff0000;">theme="simple"</span>> <br>采用此方式; <br>可是表单验证却失效,即未填用户名便提交, <br>this.addFieldError("userIdError", this.getText("user.userIdRequired")); <br>可是页面中便不显示出错信息。若把theme="simple"去掉,验证便有效。 <br>请问楼主如何使两者都有效。

 

很奇怪,我加了theme="simple"还是行的啊,而且我的代码里是
# 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"));  
#         }  

哪里有你说的“this.addFieldError("userIdError", this.getText("user.userIdRequired"));”?


那是我自己的代码,不是你原来的。我只是就问题而讨论问题,并非代码而讨论问题。

我的问题是要么出现验证错误信息(未加theme="simple")而布局很乱;要么是加上(theme="simple")后,布局没问题,但验证错误信息没有。
0 请登录后投票
   发表时间:2009-10-26  

JSP代码:

<s:form action="login" method="post" theme="simple">
		<table align="center" width="280">
			<tr>
				<td align="right" width="80"><s:text name="user.userId" />:</td>
				<td align="center" width="100">
					<s:textfield name="userId" size="20" /></td>
				<td width="100"></td>
			</tr>
			<tr>
				<td align="right"><s:text name="user.password" />:</td>
				<td align="center"><s:password name="password" size="21" /></td>
				<td></td>
			</tr>
			<tr>
				<td align="right"></td>
				<td align="center">
					<s:submit value="Login" />&nbsp;&nbsp;
					<s:a href="Jsp/register.jsp">
						<s:text name="register" />
					</s:a>
				</td>
				<td></td>
			</tr>
		</table>
	</s:form>

 Java Action中的validate()验证方法:

public void validate() {

  if(getUserId() == null || "".equals(getUserId())) {
   this.addFieldError("userId", this.getText("user.userIdRequired"));
  }
  
  if(getPassword() == null || "".equals(getPassword())) {
   this.addFieldError("password", this.getText("user.passwordRequired"));
  }
 }

 

resourceMsgs.properties属性文件中的配置:

user.userIdRequired = UserID not null!
user.passwordRequired = Password not null!

 

0 请登录后投票
   发表时间:2009-10-26  
zhangyuqing052 写道
黑暗浪子 写道
zhangyuqing052 写道
应想将页面控件布局,顾 <br><s:form action="login" method="post" <span style="color: #ff0000;">theme="simple"</span>> <br>采用此方式; <br>可是表单验证却失效,即未填用户名便提交, <br>this.addFieldError("userIdError", this.getText("user.userIdRequired")); <br>可是页面中便不显示出错信息。若把theme="simple"去掉,验证便有效。 <br>请问楼主如何使两者都有效。

 

很奇怪,我加了theme="simple"还是行的啊,而且我的代码里是
# 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"));  
#         }  

哪里有你说的“this.addFieldError("userIdError", this.getText("user.userIdRequired"));”?


那是我自己的代码,不是你原来的。我只是就问题而讨论问题,并非代码而讨论问题。

我的问题是要么出现验证错误信息(未加theme="simple")而布局很乱;要么是加上(theme="simple")后,布局没问题,但验证错误信息没有。

呵呵,好说。我以为是我代码的问题呢。我有时间给你看一下。然后站内短信你吧。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics