代码之家  ›  专栏  ›  技术社区  ›  Manrico Corazzi

Struts 2:返回调用页面

  •  2
  • Manrico Corazzi  · 技术社区  · 16 年前

    我正在使用 .

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

    说我在第页 x、 jsp x、 jsp 而不是固定页面(即。 home.jsp

    这是相关的 struts.xml 片段:

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

    当然是我的 VisualizationAction.execute() 返回 .


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

    5 回复  |  直到 13 年前
        1
  •  4
  •   Community CDub    8 年前

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

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

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

    Stack Overflow

        2
  •  1
  •   nikhilbelsare    16 年前
    return INPUT;
    

    我会成功的。输入常量在操作接口本身中定义。这表明行动需要更多的投入。

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

        3
  •  1
  •   pierdeux    16 年前

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

    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 (这也可以实现 接口!),等等 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
  •  0
  •   Pavel Rodionov    16 年前

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

    http://domain.com/myAction.action

    您可以使用某些参数作为要更改当前设计的指示器:

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

    然后,您编写了一些struts 2拦截器,其逻辑是检查此类参数“changeDesign”的存在,该拦截器将执行更改设计的必要工作,并将控制工作流。使用拦截器,您可以将操作与横切逻辑分离。

        5
  •  0
  •   JuanDeLosMuertos    16 年前

    好的,在您的类it.\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu.web.actions.VisualizationAction中,必须返回包含输入的字符串值,然后

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

    这将引导您进入所需页面。