问题描述:
在教学过程中突然遇到使用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>
index.jsp
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();
}
}
ValidateAction.java
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;
}
}
User.java
<!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>
ValidateAction-validation.xml
<?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
解决方案:
将struts.xml中result的type属性去掉,或使用默认的dispatcher方式.
原理在于验证框架会把错误信息注入到ValueStack的根对象中,而采用redirect重定向方式相当于用户又发起了新的请求,当然无法共享上次请求对应的ValueStack对象.
可以通过struts的debug标签看到这一过程:
转载于:https://www.cnblogs.com/kknd713/p/3144009.html
相关资源:Comparing the Struts 1 and Struts 2 Web Application Frameworks