【问题标题】:Struts 2: return to calling pageStruts 2:返回调用页面
【发布时间】:2010-09-07 21:47:50
【问题描述】:

我正在使用 Struts 2

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

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

这是相关的 struts.xml 片段:

/pages/home.jsp行动>

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

我是否可以返回任何“神奇”常量(例如 INPUT_PAGE)来解决问题?

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

T.I.A.

【问题讨论】:

    标签: java struts2 struts


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:
      return INPUT;
      

      会成功的。 INPUT 常量在 Action 接口本身中定义。它表示动作需要更多输入。

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

      【讨论】:

      • 感谢您的友好(和及时)回复,nikhilbelsare
        我试过 return INPUT; 但我得到了一个 **没有为操作定义结果。___.web.actions.VisualizationAction 和结果输入**
        错误消息(非常符合预期,因为我没有在 struts 的任何地方定义“输入” .xml)。
        我真正想做的是 Struts 2 自动识别引用页面并将我转发到它,因为该操作是从许多不同的页面调用的,我无法预测INPUT。
        我想我无法解析标题...
      • 另外,您可以在每个页面中包含一个隐藏字段,告诉 Action 重定向到哪个页面。这样您就可以更好地控制事物。
      【解决方案3】:

      我的解决方案将涉及一个接口和一个拦截器。您为所有您可能希望重定向到的操作实现以下接口:

      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 接口(如果您希望必须重定向到它们),那么您就可以在您的 JSP 中访问target 参数,只要您需要它。将该参数传递给您的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 可能会有所不同...)。

      【讨论】:

        【解决方案4】:

        我更喜欢通过特定操作引导用户的方式。

        http://domain.com/myAction.action

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

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

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

        【讨论】:

          【解决方案5】:

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

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

          这将引导您到您想要的页面。 这应该可行,我已经在 struts2 上工作了 2 个月

          【讨论】:

          • 这不是用户要求的。他想根据调用页面动态改变yourJspPage.jsp
          猜你喜欢
          • 1970-01-01
          • 2014-05-13
          • 1970-01-01
          • 2016-06-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多