Struts 2:返回调用页面

时间:2008-09-05 08:18:52

标签: java struts2 struts

我正在使用 Struts 2

我想从一个Action返回到调用它的页面。

说我在页面 x.jsp ,我调用Visual动作来改变会话中的CSS首选项;我想返回 x.jsp 而不是固定页面(即 home.jsp

以下是相关的 struts.xml 片段:

<action
   name="Visual"
   class="it.___.web.actions.VisualizationAction">
   <result name="home">/pages/home.jsp</result>
</action>

我的VisualizationAction.execute()当然会返回主页

是否有任何“魔法”常数(比如说,INPUT_PAGE)我可以回来做这个伎俩?

我是否必须使用更复杂的方法(即提取请求页面并转发给它)?

T.I.A。

5 个答案:

答案 0 :(得分:3)

您可以在struts.xml中使用动态结果。例如:

<action
   name="Visual"
   class="it.___.web.actions.VisualizationAction">
   <result name="next">${next}</result>
</action>

然后在您的操作中,您将创建一个名为next的字段。因此,要调用该操作,您将传递要转发到下一个页面的名称。然后该操作返回“next”,struts将知道要转到哪个页面。

这篇文章有一个更好的解释:Stack Overflow

答案 1 :(得分:1)

return INPUT;

会做到这一点。 INPUT常量在Action接口本身中定义。它表明行动需要更多的投入。

如果您指的是将您带到操作输入页面的页面,则调用页面,那么您的输入页面将必须在操作的请求范围中存储HTTP标头“Referer”。

答案 2 :(得分:1)

我的解决方案涉及一个界面和一个拦截器。您可以为您可能想要重定向的所有 操作实施以下界面:

public interface TargetAware {
  public String getTarget();
  public void setTarget(String target);
}

如果需要,拦截器只是确保设置目标:

public class SetTargetInterceptor extends MethodFilterInterceptor implements Interceptor {
   public String doIntercept(ActionInvocation invocation) {
      Object action = invocation.getAction();
      HttpServletRequest request = (HttpServletRequest) invocation.getInvocationContext().get(StrutsStatics.HTTP_REQUEST);
      if (action instanceof TargetAware) {
         TargetAware targetAwareAction = (TargetAware) action;
         if (targetAwareAction.getTarget() == null)
            targetAwareAction.setTarget(getCurrentUri(request));
      }     
      return invocation.invoke();
   }

   // I'm sure we can find a better implementation of this...
   private static String getCurrentUri(HttpServletRequest request) {
      String uri = request.getRequestURI();
      String queryString = request.getQueryString();
      if (queryString != null && !queryString.equals(""))
         uri += "?" + queryString;
      return uri;
   }

   public void init() { /* do nothing */ }
   public void destroy() { /* do nothing */ }
}

从那时起,一旦这两个位就位并且您的操作实现了TargetAware接口(如果您希望必须重定向到它们),那么您可以访问target参数您需要的时候使用JSP。将该参数传递到VisualizationAction(也可能同时实现TargetAware界面!),然后按照SUCCESS,重新定位,如Vincent Ramdhanie所述:

<action name="Visual" class="it.___.web.actions.VisualizationAction">
   <result type="redirect">
      <param name="location">${target}</param>
      <param name="parse">true</param>
   </result>
</action>

我没有尝试这个策略的每一个细节。特别要注意围绕redirect结果类型的符号(取决于您的Struts2的特定版本:2.0.x和2.1.x可能会有所不同......)。

答案 3 :(得分:0)

当您通过特定操作导航用户时,我更喜欢这种方式。

http://domain.com/myAction.action

您可以使用一些参数作为指标,您想要更改当前设计: 即。

http://domain.com/myAction.action?changeDesign=silver_theme

那么,你编写了一些struts 2拦截器,其逻辑是检查这种参数'changeDesign'的存在,而这个拦截器将做更改设计的必要工作并将控制工作流程。使用拦截器,您可以将您的操作与横切逻辑分离。

答案 4 :(得分:0)

好的,在你的班级.___。web.actions.VisualizationAction,你必须返回一个包含INPUT的字符串值,然后,在struts.xml上你必须设置这样的东西:

<action name="Visual" class="it.___.web.actions.VisualizationAction">
   <result name="input">yourJspPage.jsp</result>
</action>

这会引导您进入您想要的页面。 这应该有效,我已经在2个月内开始研究struts2了