struts 2字段错误值未显示

时间:2012-04-05 09:44:04

标签: struts2 struts-validation

我有覆盖验证方法并使用添加错误 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>

2 个答案:

答案 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以复制操作消息