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);
    }

}

在执行方法之前调用此操作时,该语言已由 Struts2 框架填充。在执行方法中,setBestTutorialSite方法是填充私有字段bestTutorialSite

现在我想到了将这个私有字段设置bestTutorialSite为请求属性(在setRequest方法中)。但是我注意到在填充任何私有字段(如语言)之前首先调用此方法。因此在该setRequest方法中,系统打印bestTutorialSite始终为空。

我以为我可以bestTutorialSite在调用 JSP 页面之前使用(从执行方法中捕获)设置此属性。

我不认为我完全掌握了对 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 回答