论坛首页 Java企业应用论坛

关于Struts2中visitor校验器的解决方法

浏览 16368 次
精华帖 (1) :: 良好帖 (0) :: 新手帖 (1) :: 隐藏帖 (2)
作者 正文
   发表时间:2009-01-02   最后修改:2009-01-03

   这段时间重新开始拾起JAVA的学习,也是为了以后的工作打算,积累一些经验。

 

   记得开始的时候,学习Struts2中的输入校验,就对Vistor校验器情有独钟。首先,一般我们在提交表单的时候,对表单的各字段就要有校验的过程,实际部署过程中要分 客户端校验 和服务器端校验。 客户端校验使用rapid validation等第三方客户端校验框架就可以实现,而且比Struts2本身自带的客户端校验方式更好,但服务器端校验却可以分为好几种:

 

 

1.如果在Action中只有一个处理逻辑的话,可以重写ActionSupport中的validate()方法。

 

2.如果在Action中存在多个类似于execute的处理逻辑的话,我们可以重写validateXxx()方法(Xxx为不同的处理逻辑名称,例如有validateRegist()方法,就是处理Regist业务逻辑)

 

3.编写对应于Action的validate 的xml文件。这个应该是最为常用的一种解决方案了,但是有一个问题,Action众多,或者在Action中有多个对应一个或多个POJO的处理逻辑,那么这些xml文件就会随着Action文件和处理逻辑的增加而相应的增加,这显然不是个好的现象。  所以如果只是针对POJO来写相应的validate xml文件,无疑会好很多。  这就是Visitor校验器的功用了。

 

     很多和我一样的初学者可能手边都有一般李刚写的 《Struts 2 权威指南》,里面正好讲了visitor校验器,但是我照着书上讲的步骤重复做了N次都没有正确,于是乎在网上搜索了相关的文章,最后终于发现书上没有讲完整  (P280-P281)

 

以下我来举个例子:

 

  我建立了一个User的POJO,处理逻辑为UserAction, 测试页面为login.jsp

login.jsp

<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
		<title>用户登录页面</title>
		<style type="text/css">
.errorMessage {
	font-weight: bold;
	color: red;
}
</style>
	</head>
	<body>		
		<s:form action="pro_login.do">
			<s:textfield name="user.username" label="用户名称" />
			<s:password name="user.userpwd" label="登录密码" />
			<s:submit value="登 录" />
		</s:form>
	</body>
</html>

 

 

  那么我的Visitor校验器为

 

 

 UserAction-validation.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="user">
		<field-validator type="visitor">
			<param name="context">userContext</param>
			<param name="appendPrefix">true</param>
			<message></message>
		</field-validator>
	</field>
</validators>

 

 

 -------------------------------------------------------------------

(注:context参数可以随便设置,只要保持一致就可以了)

 -------------------------------------------------------------------

User-userContext-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">
        <field-validator type="requiredstring">
            <message>请输入用户名称</message>
        </field-validator>
    </field>
    <field name="userpwd">
        <field-validator type="requiredstring">
        	<message>请输入登录密码</message>
        </field-validator>
    </field>
</validators>

 

 

 

 

 

 

其中context参数将作为验证User类属性的文件名的一部分,如user属性返回一个User对象,那么用于验证User对象属性的文件名为User-abc-validation.xml

      这个文件要和User.class文件在同一个目录中。也就是要放到你的POJO文件相同的目录路径下,不然的话Visitor校验器就不会起作用。

     这个就是李刚老师没有写全的地方,附加个项目截图就更为清楚了。



 

 



 这样的话,Visitor校验器就起作用了。

 

 

 

 

 

 



 

  • 大小: 10.2 KB
  • 大小: 27.6 KB
   发表时间:2009-01-03  
楼主能不能把代码格式整理一下,看着费劲的说
0 请登录后投票
   发表时间:2009-01-03  
kjj 写道
楼主能不能把代码格式整理一下,看着费劲的说

不好意思,第一次在javaeye上发帖,还不是很熟悉。
0 请登录后投票
   发表时间:2009-01-03  
我也做过,一直为好多actions 各自配置validator 发愁,vistor 验证可以解决这个问题吧!
0 请登录后投票
   发表时间:2009-01-03  
kjj 写道
我也做过,一直为好多actions 各自配置validator 发愁,vistor 验证可以解决这个问题吧!

  visitor校验器,按我的理解就是:从最根本的POJO验证出发,所有的action验证都是遵循POJO里验证的规则,这样无疑会节省很多代码,而且业务逻辑更简洁明了。
0 请登录后投票
   发表时间:2009-01-03  
密码和确认密码怎么配置呢?
0 请登录后投票
   发表时间:2009-01-03  
GOOD JOB
0 请登录后投票
   发表时间:2009-01-03  
cometlj 写道
kjj 写道
我也做过,一直为好多actions 各自配置validator 发愁,vistor 验证可以解决这个问题吧!

  visitor校验器,按我的理解就是:从最根本的POJO验证出发,所有的action验证都是遵循POJO里验证的规则,这样无疑会节省很多代码,而且业务逻辑更简洁明了。

这个到好,可是如果这样配了,有些action 不需要验证又怎么办呢
0 请登录后投票
   发表时间:2009-01-04  
jiyanliang 写道
密码和确认密码怎么配置呢?

Visitor 适用于检测Action中的复合属性,例如在一个Action里包含了User类型的属性。如果要检测密码和确认密码的功能,可以使用字段表达式校验器。或者,更为负责任的解决方法是 手动验证 ,既在Action里重写validate()方法,或者是重写validateXxx()方法。
0 请登录后投票
   发表时间:2009-01-04  
那还真不如在Action里重写validate()方法。。
0 请登录后投票
论坛首页 Java企业应用版

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