2

検証メソッドをオーバーライドし、使用してエラーを追加しました 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>
4

2 に答える 2

3

エラーが判明しました (フィールドとアクションはチェーン全体で維持されません。

以下はこれを証明します (struts2-conventions-plugin-VERSION を想定):

アクション 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 番目のアクション (#2) では、注釈とそれらをサポートするためのインポートを追加する必要があります。

import org.apache.struts2.convention.annotation.InterceptorRef;
import org.apache.struts2.convention.annotation.InterceptorRefs;

@InterceptorRefs({
    @InterceptorRef(value = "store", params = {"operationMode","RETRIEVE"}),
    @InterceptorRef("defaultStack"),
})

そして今、それは機能します。

于 2012-04-05T20:10:24.700 に答える
2

とにかくアクションチェーンを使用する場合(IMOはほとんど必要なく、ほとんど良いアイデアではなく、ほとんどの場合、アクション間の意図しない結合につながります)、チェーンインターセプターがすでに提供しているものを使用し、「チェーン」以外のものを構成しないようにします。 。

ドキュメントによると:

  • struts.xwork.chaining.copyErrors-アクションエラーをコピーするにはtrueに設定します
  • struts.xwork.chaining.copyFieldErrors-フィールドエラーをコピーするには、trueに設定します
  • struts.xwork.chaining.copyMessages-アクションメッセージをコピーするにはtrueに設定します
于 2012-04-06T12:51:30.870 に答える