问题描述:
在教学过程中突然遇到使用struts2的验证框架时,当输入的内容不符合验证规则时,没有进入action(说明验证的拦截器生效了),但是在页面却没有显示错误提示信息,很郁闷调了很久终于发现问题...
部分代码:


<html> <body> <s:form action="Validate" method="post" > <s:textfield label="用户名" name="user.name" /> <s:textfield label="密码" name="user.pwd"/> <s:submit value="提交" /> </s:form> </body> </html>


public class ValidateAction extends ActionSupport{ private User user; public User getUser() { return user; } public void setUser(User user) { this.user = user; } public String execute() throws Exception { System.out.println("进入action"); return super.execute(); } }


public class User implements Serializable{ private String name; private String pwd; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPwd() { return pwd; } public void setPwd(String pwd) { this.pwd = pwd; } }


<!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.name"> <field-validator type="requiredstring"> <param name="trim">true</param> <message>请输入用户名</message> </field-validator> </field> </validators>


<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd"> <struts> <package name="default" extends="struts-default" namespace="/"> <action name="Validate" class="com.jb.cdjj.web.actions.ValidateAction"> <result>/index.jsp</result> <result name="input" type="redirect">/validate.jsp</result> </action> </package> </struts>
解决方案:
将struts.xml中result的type属性去掉,或使用默认的dispatcher方式.
原理在于验证框架会把错误信息注入到ValueStack的根对象中,而采用redirect重定向方式相当于用户又发起了新的请求,当然无法共享上次请求对应的ValueStack对象.
可以通过struts的debug标签看到这一过程:

本文介绍了一个关于Struts2验证框架的问题,在输入不符合规则时,虽然验证拦截器生效但未显示错误信息。通过调整struts.xml配置解决了该问题。
1154

被折叠的 条评论
为什么被折叠?



