论坛首页 Java企业应用论坛

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

浏览 16317 次
精华帖 (1) :: 良好帖 (0) :: 新手帖 (1) :: 隐藏帖 (2)
作者 正文
   发表时间:2009-01-04  
jiyanliang 写道
那还真不如在Action里重写validate()方法。。

    当然,每个人有每个人的写法。我只是觉得在Visitor校验器比较适应于对一个POJO的复合属性进行检测,不用每次都必须重写Action里的validate方法,而且,对于在一个Action里有多个类似于execute()处理逻辑的时候,就要重写多个validateXxx()方法了。 
0 请登录后投票
   发表时间:2009-01-04  
好东西,回去试一下..刚刚接触2.0

要学的东西太多了,而且这些框架更新又快..
0 请登录后投票
   发表时间:2009-01-05  
我有几个问题:
1. 我之前写的好像要是内网服务器无法访问到外网的时候 或者网络差的时候 就会抛出异常,怎么让他在脱机情况下也可以用这个validation?
2. 这个验证是在server端验证吗?
3. 如果是,为什么不考虑用js验证呢?何必让server端来承受不必要的开销呢?
0 请登录后投票
   发表时间:2009-01-05   最后修改:2009-01-05
cometlj 写道

        很多和我一样的初学者可能手边都有一般李刚写的 《Struts 2 权威指南》,


首先特别感兴趣这句话。

 

其次,该功能我在struts2下用纯annotation方式没有配置成功,struts2的doc关于annotation也是几句带过,关键就是那个context还没搞明白怎么用annotation声明,别告诉我用xml,因为我已经用了annotation,不想写xml。等高人解惑。

 

	@Validations(
		visitorFields = {
			@VisitorFieldValidator(message = "Default message", fieldName="user.username", shortCircuit = true, appendPrefix = true),
			@VisitorFieldValidator(message = "Default message", fieldName="user.password", shortCircuit = true, appendPrefix = true)
        		}
	)

 

0 请登录后投票
   发表时间:2009-01-05  
ffyahoo 写道
我有几个问题:
1. 我之前写的好像要是内网服务器无法访问到外网的时候 或者网络差的时候 就会抛出异常,怎么让他在脱机情况下也可以用这个validation?
2. 这个验证是在server端验证吗?
3. 如果是,为什么不考虑用js验证呢?何必让server端来承受不必要的开销呢?

第一个问题:我确实没遇到过这种情况,因为这个是服务器端的验证,所以我想你所说的内网访问外网或者脱机情况下也使用这个validation的话,我想是不可能的。
第二个问题:这个是Sever端的验证方式
第三个问题:JS验证当然也要用的,在实际的部署中,我们是要客户端验证和服务器端验证同时都有的。不然如果用户禁用了Javascript功能,或者通过其他的方式来Crack,我想后果是不堪设想的。至于你说的Server端不必要的开销,我想这个是正常的,不过通过客户端JS验证,基本90%的恶意或者非恶意输入产生的错误都在客户端被检测出来了,我想留个服务器的压力,在客户端和服务器端验证均存在的时候,也不是很大的。至少,在安全方面考虑,Client端和Server端的验证都要有。
0 请登录后投票
   发表时间:2009-01-06  
ffyahoo 写道
我有几个问题:
1. 我之前写的好像要是内网服务器无法访问到外网的时候 或者网络差的时候 就会抛出异常,怎么让他在脱机情况下也可以用这个validation?
2. 这个验证是在server端验证吗?
3. 如果是,为什么不考虑用js验证呢?何必让server端来承受不必要的开销呢?


1.这个问题是不应该出现的,如果真的有,我猜想可能是去网络上寻找你在xml文件开始定义的dtd文件吧?

2. 是在server端验证的,你如果在struts2源代码中关于验证表单相关的部分代码设置断点,会发现框架会把验证到的错误加到一个map里面的。

3. js验证一般只是用来验证的第一步,就像银行,银行的铁门是js,而银行装钱的保险柜就是更深层的验证。其实struts2的form标签提供了一个自动生成js代码的属性的,好像是validate="true"?只是它生成的代码不太好用,也难以阅读,所以还不如我们自己去写,这样也便于代码的理解和管理。
0 请登录后投票
   发表时间:2009-01-06  
password 和repasswrod 可以设置到pojo的属性,然后验证用表达式来做
0 请登录后投票
   发表时间:2009-01-06   最后修改:2009-01-06
kjj 写道
password 和repasswrod 可以设置到pojo的属性,然后验证用表达式来做



  多谢 kjj 提醒,现在把改进的能够进行确认密码检测的代码放上来,本地测试通过

 

修改后的User的POJO为(repass为添加的属性)

package org.lj.domain.hibernate;

import java.util.Date;

/**
 * User entity.
 * 
 * @author MyEclipse Persistence Tools
 */

public class User implements java.io.Serializable {

	// Fields

	private Integer id;
	private String username;
	private String userpwd;
	private String repass;
	private Date createdAt;
	private Date updatedAt;

	// Constructors

	/** default constructor */
	public User() {
	}

	/** minimal constructor */
	public User(String username, String userpwd, Date createdAt) {
		this.username = username;
		this.userpwd = userpwd;
		this.createdAt = createdAt;
	}

	/** full constructor */
	public User(String username, String userpwd, Date createdAt, Date updatedAt) {
		this.username = username;
		this.userpwd = userpwd;
		this.createdAt = createdAt;
		this.updatedAt = updatedAt;
	}

	// Property accessors

	public Integer getId() {
		return this.id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getUsername() {
		return this.username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getUserpwd() {
		return this.userpwd;
	}

	public void setUserpwd(String userpwd) {
		this.userpwd = userpwd;
	}

	public Date getCreatedAt() {
		return this.createdAt;
	}

	public void setCreatedAt(Date createdAt) {
		this.createdAt = createdAt;
	}

	public Date getUpdatedAt() {
		return this.updatedAt;
	}

	public void setUpdatedAt(Date updatedAt) {
		this.updatedAt = updatedAt;
	}

	public String getRepass() {
		return repass;
	}

	public void setRepass(String repass) {
		this.repass = repass;
	}

}

 


修改的User-userContext-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="username">
		<field-validator type="requiredstring">
			<message>请输入用户名称</message>
		</field-validator>
	</field>
	<field name="userpwd">
		<field-validator type="requiredstring">
			<message>请输入密码</message>
		</field-validator>
		<field-validator type="fieldexpression">
			<param name="expression"><![CDATA[(userpwd==repass)]]></param>
			<message>确认密码不正确</message>
		</field-validator>
	</field>
</validators>

 


User-validation.xml不用改变--------从这点我们也可以看出用Visitor校验器的好处了,就是直接在POJO里操作,相应的修改参数context属性的xml文件,很方便的

 

相应的测试页面为register.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>
		<link href="utils/css/public.css" type="text/css" rel="stylesheet" />				
	</head>
	<body>		
	<div id="all">
		<div id="header">header</div>
		<div id="content">
		<div>已有账户,<a href="login.do">登录</a></div>
		<s:form action="pro_register.do">
			<s:textfield name="user.username" label="用户名称" />
			<s:password name="user.userpwd" label="登录密码" />
			<s:password name="user.repass" label="确认密码" />
			<s:submit value="注 册" />
		</s:form>	
		</div>
		<div id="footer">footer</div>
	</div>			
	</body>
</html>

 

两次输入的密码不同,检测成功

确认密码不正确的截图如下:



 

 

 

  • 大小: 10.2 KB
0 请登录后投票
   发表时间:2009-01-08  
struts2验证是个大败笔,哈哈。信不信有你,如果没有改源码的水平,要是有正式项目敢用struts2验证的说下。
0 请登录后投票
   发表时间:2009-01-18   最后修改:2009-01-18
flysunsystem 写道
struts2验证是个大败笔,哈哈。信不信有你,如果没有改源码的水平,要是有正式项目敢用struts2验证的说下。

第一次听人这么说!不过这样的话,我发现,基于announced 的Hibernian validat 更方便
0 请登录后投票
论坛首页 Java企业应用版

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