0

私のアクションクラスが以下のとおりである場合:

<!-- language: lang-java -->

package org.tutorial.struts2.action;
import java.util.Map;
import org.apache.struts2.interceptor.RequestAware;
import org.tutorial.struts2.service.TutorialFinder;
import com.opensymphony.xwork2.Action;

public class TutorialAction implements Action, RequestAware {
    private String language;
    private String bestTutorialSite;

    public String execute() {
        System.out.println(language);
        setBestTutorialSite(new TutorialFinder().getBestTutorialSite(language));
        System.out.println(bestTutorialSite);       
        if (getBestTutorialSite().contains("Java"))
            return SUCCESS;
        else
        return ERROR;
    }

    public String getLanguage() {
        return language;
    }

    public void setLanguage(String language) {
        this.language = language;
    }

    public String getBestTutorialSite() {
        return bestTutorialSite;
    }

    public void setBestTutorialSite(String bestTutorialSite) {
        this.bestTutorialSite = bestTutorialSite;
    }

    @Override
    public void setRequest(Map<String, Object> requestObj) {
        System.out.println(bestTutorialSite);
        requestObj.put("message", bestTutorialSite);
    }

}

このアクションが execute メソッドの前に呼び出されると、言語は Struts2 フレームワークによって既に取り込まれています。execute メソッドでは、setBestTutorialSiteメソッドはプライベート フィールドにデータを入力することbestTutorialSiteです。

ここで、このプライベート フィールドbestTutorialSiteをリクエスト属性 (setRequestメソッド内) に設定することを考えました。ただし、プライベート フィールド (言語など) が入力される前に、このメソッドが最初に呼び出されることに気付きました。したがって、このsetRequestメソッドでは、システム出力bestTutorialSiteは常に null です。

bestTutorialSiteJSP ページを呼び出す前に、(execute メソッドからキャプチャされた) を使用してこの属性を設定できると思いました。

私は Struts2 フローの理解を完全に把握しているとは思いません - 明らかに! :OP

助けてください。ありがとう。

4

2 に答える 2

1

次のようなdefaultStackを使用していると思います。

<interceptor-stack name="defaultStack">
    <interceptor-ref name="exception"/>
    <interceptor-ref name="alias"/>
    <interceptor-ref name="servletConfig"/>
    <interceptor-ref name="prepare"/>
    <interceptor-ref name="i18n"/>
    <interceptor-ref name="chain"/>
    <interceptor-ref name="debugging"/>
    <interceptor-ref name="profiling"/>
    <interceptor-ref name="scopedModelDriven"/>
    <interceptor-ref name="modelDriven"/>
    <interceptor-ref name="fileUpload"/>
    <interceptor-ref name="checkbox"/>
    <interceptor-ref name="staticParams"/>
    <interceptor-ref name="params">
        <param name="excludeParams">dojo\..*</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>

ご覧のとおり、servletConfigインターセプターはparamsインターセプターの前にあります。つまり、最初にリクエストがアクションに設定され ( servletConfigを使用)、次にアクションにリクエストパラメーターが入力されます ( paramsを使用)。

達成したいのは、インターセプターの順序を変更することです。これは、間違った方法で使用すると害を及ぼす可能性があります。

于 2013-01-29T08:14:29.447 に答える
0

最初にリクエストインターセプターが実行され、その後でexecute()メソッドが実行されると思います。それが問題かもしれません。

于 2013-01-29T02:36:07.450 に答える