2008-05-08

struts2的校验框架有问题还是我的代码有问题?

关键字: struts2 validation
问题是这样的,我在struts2的项目中,添加了validation的xml验证框架,自己认为自己的代码是没有问题的,也在网上搜了很多资料,有很多也遇到过像我一样的问题,都是都没有最后解决,以下是我的代码和配置文件,请大家帮忙看看到底是struts2的validation的bug,还是是我的代码或配置文件错了呢


UserAction
public class UserAction extends ActionSupport{
	private static final long serialVersionUID = 1L;
	private UserDao userDao;
	private String username;
	private String password;
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public void setUserDao(UserDao userDao) {
		this.userDao = userDao;
	}
	public String login() throws Exception {
		if (userDao.login(username, password)) {
			return SUCCESS;
		} else {
			return INPUT;
		}
	}
}

UserDao
public class UserDao extends HibernateEntityExtendDao<User> {
	public boolean login(String username,String password){
		if(username==null)
			return false;
		if(username.equals("11")){
			return true;
		}else{
			return false;
		}
	}
}

struts.xml
<struts>
	<constant name="struts.custom.i18n.resources" value="i18n.messageResource" />
	<constant name="struts.enable.DynamicMethodInvocation" value="true" />
	<constant name="struts.devMode" value="true" />
	<package name="default" extends="struts-default">
		<action name="UserLogin" class="userAction"  method="login">
			<result name="success">/index.jsp</result>
			<result name="input">/login.jsp</result>
		</action>
	</package>
</struts>

补充:userAction和userDao都已经在springbean中定义
UserAction-UserLogin-validation.xml
<validators>
	<field name="username">
		<field-validator type="requiredstring">
			<message>000</message>
		</field-validator>
	</field>
	<field name="password">
		<field-validator type="requiredstring">
			<message>22</message>
		</field-validator>
	</field>
</validators>

JSP
	<body>
		<center>
			<table>
				<tr>
					<td>
						<s:form action="UserLogin!login">
							<s:textfield name="username" label="%{getText('login.username')}" />
							<s:textfield name="password" label="%{getText('login.password')}" />
							<s:submit value="%{getText('login.btnSubmit')}" />
						</s:form>
					</td>
				</tr>
			</table>
		</center>
	</body>


在jsp中我使用的是服务器端认证,所以理论上来说,不论用户的用户名是否输对,都应该会去执行UserAction的login方法,但是事实上,并没有去执行,而是直接验证失败,在页面上显示验证失败的信息了。很奇怪,也很郁闷。因为如果我把UserAction-UserLogin-validation.xml从actin包中移除的话,其他配置和代码都不改,这样程序中提交的时候,就可以跳入UserAction的login方法, 这到底是为什么呢? 为什么加了这个校验文件之后,就无法执行action了??
评论
solarcult 2008-06-27
哈哈哈哈哈,楼主太懒了,和我一样,为了节约代码行,Action里没有写相应的 get Filed的方法. set()和get()是一对啊.不然检验没有方法得到其值,当然当作null了.

加上get就好了.

http://struts.apache.org/2.x/docs/faqs.html
solarcult 2008-06-27
我也遇到这问题了,哪怕最简单的结构,也不成,总是返回错误.但是用code方式就可以.xml配置文件就不行.

实在搞不明白了,崩溃了,上面的方法也都用了.

感觉就是那个破xml验证没有从页面上得到我的field的数据值,就返回是验证错误的. Action能得到,xml得不到,郁闷死了.

不用这破玩意了,搞不明白.
zhou__hong2006 2008-06-05
配置文件的名称错了 是<action的文件名>--validation.xml
haikuo81 2008-05-27
runjia1987 写道
JSP 页面< form 加上 validate="true";
struts.xml 相应的action 配置中 添加<interceptor-ref name="validation" />




这个大哥说的很对!还有下面的错误


action级别的validate:UserAction-UserLogin-validation.xml ----〉 UserAction-validation.xml

method级别的validate: UserAction-UserLogin-validation.xml ----〉UserAction-login-validation.xml

还有就是页面需要一个出错误的<s:fielderror/>

这些都检查过没有问题的话,你的问题就解决了。
EXvision 2008-05-26
老实说,我个人对struts2的标签以及页面效验充满了反感。
根本不像struts2那么优雅。
(后台效验还是可以用用的,涉及到UI的。。实在。。。)

所以摒弃了,用jquer-validate。不知道多好用。
freepig 2008-05-23
我看了下 楼主的贴出来的代码和页面应该没什么问题?
你能否把spring那个配置文件贴出来

看看你的UserAction是否是设置成scope="prototype",如果不是验证会有问题的
runjia1987 2008-05-23
JSP 页面< form 加上 validate="true";
struts.xml 相应的action 配置中 添加<interceptor-ref name="validation" />
mhhtj 2008-05-23
liuzongan 写道
<action name="UserLogin" class="userAction" method="login">
但提交不能用
<s:form action="UserLogin!login">
还应该用
<s:form action="login">



不是把? are you sure?
应该用 <s:form action="UserLogin.action">
liuzongan 2008-05-22
<action name="UserLogin" class="userAction" method="login">
但提交不能用
<s:form action="UserLogin!login">
还应该用
<s:form action="login">
victorxiang 2008-05-21
hapinwater 写道
校验文件名字错了,把验证名改成UserAction-login-validation.xml


struts2中验证配置文件 别名命名 来源于 action 中的name 对应的值
mo198682 2008-05-21
jgl,jbl,
liujq020 2008-05-21
如使用Struts2的<s:form>,还要加属性 validate="true" theme="ajax"
<head> 里 加<s:head/>
liujq020 2008-05-21
1、action 配置时加验证拦截器
2、action 应实现Preparable接口
hapinwater 2008-05-21
校验文件名字错了,把验证名改成UserAction-login-validation.xml
348105874 2008-05-21
UserActionValidate.xml
wing929 2008-05-20
验证文件名称错了!
nighthawk 2008-05-19
我们在做validation的时候其实只有提交的时候才需要验证,所以最好是指定某个方法执行的时候才使用validation,在这里的UserAction-UserLogin-validation.xml是针对整个ACTION的操作进行验证的,你不妨把UserAction-UserLogin-validation.xml改名,把UserLogin部分改成与<s:form action="">当中与action对应的名字试试.这样就保证你只有在提交的时候进行验证.
tianzhihua 2008-05-09
看看你的DAO吧,可能进action去,但你输入的用户名不是11所以一直错误
JavaFlasher 2008-05-08
引用
所以理论上来说,不论用户的用户名是否输对,都应该会去执行UserAction的login方法,



jakexu2008 2008-05-08
myoldman 写道
1.首先validation失败是不会执行action中的方法,而是直接返回name为input的result.
2.其次如果想确认是不是真的validation失败,可以result为input的页面上添加一个(对于楼主来说就是login.jsp)<s:fielderror/>查看到底是那个字段validation failure了.


试过了,没有用的,
因为<s:fielderror/>只有当字段违反的校验规则时才会显示message ,
我定义了两个字段的校验规则是必填项,而当我在这两个字段上都输入了字符时,理论上说不应该再是校验失败,应该会去执行action,但是现在事实上程序并没有跳入action去执行,结果还是返回到了input
发表评论

提醒: 该博客已发表在公共论坛,博客所有留言会成为论坛回贴,留言请注意遵守论坛发贴规则

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

jakexu2008
搜索本博客
博客分类
最近加入圈子
最新评论