7

次のアクション クラスでは、パラメーター インターセプターを使用しています。

@Namespace("/admin_side")
@ResultPath("/WEB-INF/content")
@ParentPackage(value = "struts-default")
@InterceptorRefs(@InterceptorRef(value="store", params={"operationMode", "AUTOMATIC"}))
public final class TestAction extends ActionSupport implements Serializable, ValidationAware, Preparable
{
    private static final long serialVersionUID = 1L;

    private String param1;
    private String param2;

    //Getters and setters.

    public TestAction() {}

    @Action(value = "TestMessage",
        results = {
            @Result(name=ActionSupport.SUCCESS, type="redirectAction", params={"namespace", "/admin_side", "actionName", "Test"}),
            @Result(name = ActionSupport.INPUT, location = "Test.jsp")},
        interceptorRefs={
            @InterceptorRef(value="paramsPrepareParamsStack", params={"params.acceptParamNames", "param1, param2", "params.excludeParams", "extraParam", "validation.validateAnnotatedMethodOnly", "true"})
        })
    public String insert() {
        // Do something. Add or update a row to the database (one at a time).
        addActionMessage("Action message");
        addActionError("Error message");
        return ActionSupport.SUCCESS;
    }

    @Action(value = "Test",
    results = {
        @Result(name = ActionSupport.SUCCESS, location = "Test.jsp"),
        @Result(name = ActionSupport.INPUT, location = "Test.jsp")},
    interceptorRefs = {
        @InterceptorRef(value = "paramsPrepareParamsStack", params = {"params.acceptParamNames", "param1, param2", "params.excludeParams", "extraParam", "validation.validateAnnotatedMethodOnly", "true", "validation.excludeMethods", "load"})})
    public String load() throws Exception {
        // This method is just required to return an initial view on page load.
        return ActionSupport.SUCCESS;
    }

    @Override
    public void prepare() throws Exception {}
}

以下は次のとおりです<s:form>

<s:form namespace="/admin_side" action="Test" validate="true" id="dataForm" name="dataForm">
    <s:if test="hasActionMessages()">
        <s:actionmessage theme="jquery"/>
    </s:if>

    <s:if test="hasActionErrors()">
        <s:actionerror theme="jquery"/>
    </s:if>

    <s:hidden name="param1"/>
    <s:hidden name="param2"/>
    <s:hidden name="extraParam"/>
    <s:submit value="Submit" action="TestMessage"/>
</s:form>

ここでは、非表示のフォーム フィールドextraParamが宣言されていないため、アクション クラスにセッターとゲッターがありません。

この場合、このフォームが送信されると、サーバー端末に次のメッセージが表示されます。

SEVERE: 開発者通知 (struts.devMode を false に設定してこのメ​​ッセージを無効にします): 'class actions.TestAction で 'extraParam' を設定中に予期しない例外がキャッチされました: 値 ['', ] で式 'extraParam' を設定中にエラーが発生しました

params.excludeParamsextraParamアクションクラスのようにパラメーターを除外しません。

パラメータインターセプターを使用しているときに、このような例外をどうにかして防ぐことはできますか? このようなメッセージは、アクション メッセージに不必要に追加され<s:actionmessage/>、使用されている場合は、まったく表示されないはずのときに を介して表示されます。


これparamsPrepareParamsStackをアクション クラス then に置き換えるとdefaultStack、そのようなメッセージは表示されません。次のように警告を出すだけです。

警告: パラメータ [extraParam] はパターンの excludeParams リストにあります!

そのようなメッセージを無効にするように設定てください。struts.devModefalse

4

3 に答える 3

2

デフォルト設定をオーバーライドする独自のパラメーター セットを定義した場合、インターセプター パラメーターは親パッケージのインターセプター構成によって継承されないことをコメントで既に述べました。継承をオーバーライドするインターセプターパラメーターを参照してください。

インターセプターパラメーターの 2 つの異なるマップを取得するために使用される手法もいくつかあります。「 Struts2 でのインターセプター パラメーターの取得」を参照してください。

コンベンション プラグインは、親パッケージから継承した XWork パッケージ構成を作成します。Struts 2 Convention Plugin Define Multiple Parent Packagesに対する私の回答を参照してください。

したがって、独自のパラメーターをセットに追加する場合は、親構成によって設定されたデフォルトのパラメーターをオーバーライドするだけです。interceptorタグまたはタグのいずれかで、タグinterceptor-stackごとに行う必要がありますinterceptor-ref

コンベンション プラグインは@InterceprorRef同じ目的でアノテーションを使用しますが、クラスに適用すると、そのクラスの各アクションに適用されるという注意事項があります。そのため、このアノテーションをクラス レベルで使用する場合は注意してください。インターセプター スタック パラメーターをオーバーライドしているため、各パラメーター名に対してスタックで参照されるインターセプター名のドットが後に続くプレフィックスを使用する必要がありますが、これはスタック内の の一意の名前がある場合にのみ機能interceptor-refします。

paramsにインターセプターの 2 つの参照がある場合、独自のインターセプター スタックを作成し、インターセプターの各参照でパラメーターのオーバーライドを指定しない限り paramsPrepareParamsStack、2 番目をオーバーライドすることはできません。params interceptor-ref

于 2014-05-10T11:12:04.450 に答える
1

見てみましょうparamsPrepareParamsStack

 <interceptor-stack name="paramsPrepareParamsStack">
      <interceptor-ref name="exception"/>
      <interceptor-ref name="alias"/>
      <interceptor-ref name="i18n"/>
      <interceptor-ref name="checkbox"/>
      <interceptor-ref name="multiselect"/>
      <interceptor-ref name="params">
          <param name="excludeParams">dojo\..*,^struts\..*</param>
      </interceptor-ref>
      <interceptor-ref name="servletConfig"/>
      <interceptor-ref name="prepare"/>
      <interceptor-ref name="chain"/>
      <interceptor-ref name="modelDriven"/>
      <interceptor-ref name="fileUpload"/>
      <interceptor-ref name="staticParams"/>
      <interceptor-ref name="actionMappingParams"/>
      <interceptor-ref name="params">
          <param name="excludeParams">dojo\..*,^struts\..*</param>
       </interceptor-ref>
       <interceptor-ref name="conversionError"/>
       <interceptor-ref name="validation">
           <param name="excludeMethods">input,back,cancel,browse</param>
       </interceptor-ref>
       <interceptor-ref name="workflow">
           <param name="excludeMethods">input,back,cancel,browse</param>
       </interceptor-ref>
 </interceptor-stack>

paramsインターセプターは2機。アクションクラスでパラメーターを設定する場合excludeParams、これはおそらく最初のインターセプターに設定されparamsます.2番目のインターセプターのパラメーターはデフォルトのままです。これで、2 番目のparamsインターセプター (デフォルトでexcludeParams) が呼び出されると、指定された例外がスローされます。

パラメーターの設定を複製excludeParamsして、2 番目のインターセプターにも設定することができます。

 @InterceptorRef(value = "paramsPrepareParamsStack", params = {"params.acceptParamNames", "param1, param2", "params.excludeParams", "extraParam", "params.excludeParams", "extraParam", "validation.validateAnnotatedMethodOnly", "true", "validation.excludeMethods", "load"})})
于 2014-02-16T22:04:32.887 に答える