我有覆盖验证方法并使用添加错误
addFieldError("test", "test print");
并在jsp中使用
<s:fielderror />
但错误不会显示在input.jsp。
中我的jsp内容类型也是
<%@ page contentType="text/html; charset=UTF-8"%>
我的struts.xml就像
<action name="test" class="ListInfo">
<result>/input.jsp</result>
</action>
<action name="Proceed" class="Details">
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="execAndWait">
<param name="delay">100</param>
</interceptor-ref>
<result name="wait">Wait.jsp</result>
<result name="success">/Summary.jsp</result>
<result name="input" type="chain">test</result>
<result name="failure" type="chain">test</result>
</action>
答案 0 :(得分:3)
证明错误(字段和操作不会在链中维护。
以下证明了这一点(假设为struts2-conventions-plugin-VERSION):
动作foo总是链接到动作栏(所以我们只需要动作栏的视图)
动作foo
package com.quaternion.action;
import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.convention.annotation.Result;
/** #1 SOMETHING WILL BE ADDED HERE TO FIX THE ISSUE**/
@Result(name="input", type="chain", location="bar")
public class Foo extends ActionSupport{
private String name;
@Override
public void validate(){
super.addActionError("Just an action error");
super.addFieldError("name", "Name is all ways wrong... for no good reason.");
}
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
}
操作栏
package com.quaternion.action;
import com.opensymphony.xwork2.ActionSupport;
/** #2 SOMETHING WILL BE ADDED HERE TO FIX THE ISSUE**/
public class Bar extends ActionSupport{
}
查看栏:/ WEB-INF/content/bar.jsp
<%@taglib prefix="s" uri="/struts-tags"%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<body>
<h1>Action Bar</h1>
<s:actionerror/>
<s:fielderror name="name"/>
</body>
</html>
测试上面我们发现错误中没有显示任何内容。
要解决问题,我们使用商店拦截器:http://struts.apache.org/2.0.14/struts2-core/apidocs/org/apache/struts2/interceptor/MessageStoreInterceptor.html
在第一个操作(#1)中,我们需要添加注释和导入来支持它们:
import org.apache.struts2.convention.annotation.InterceptorRef;
import org.apache.struts2.convention.annotation.InterceptorRefs;
@InterceptorRefs({
@InterceptorRef(value = "store", params = {"operationMode","STORE"}),
@InterceptorRef("defaultStack"),
})
在第二个动作(#2)中,我们需要添加注释和导入来支持它们:
import org.apache.struts2.convention.annotation.InterceptorRef;
import org.apache.struts2.convention.annotation.InterceptorRefs;
@InterceptorRefs({
@InterceptorRef(value = "store", params = {"operationMode","RETRIEVE"}),
@InterceptorRef("defaultStack"),
})
现在它有效。
答案 1 :(得分:2)
如果您打算使用动作链接(几乎从不需要IMO,几乎从来不是一个好主意,并且几乎总是导致动作之间的意外耦合),请使用chaining interceptor已经提供的内容并避免配置除“链”之外的东西。
根据文档:
struts.xwork.chaining.copyErrors
- 设置为true以复制操作错误struts.xwork.chaining.copyFieldErrors
- 设置为true以复制字段错误struts.xwork.chaining.copyMessages
- 设置为true以复制操作消息