问题描述:
在教学过程中突然遇到使用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标签看到这一过程: