Struts 2:返回调用页面

时间:2020-03-05 18:48:05  来源:igfitidea点击:

我正在使用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.

解决方案

回答

return INPUT;

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

通过调用page(如果意思是将我们带到操作输入页面的页面),则输入页面将必须在Action的请求范围中存储HTTP标头" Referer"。

回答

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

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

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

这篇文章有一个更好的解释:堆栈溢出

回答

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

http://domain.com/myAction.action

我们可以使用一些参数作为指标,以更改当前设计:
IE。

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

因此,然后编写一些struts 2拦截器,该逻辑是检查此类参数'changeDesign'的存在,并且该拦截器将完成更改设计的必要工作并控制工作流程。使用拦截器,我们可以使操作与横切逻辑脱钩。

回答

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

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>

我没有尝试此策略的每个细节。特别要提防有关"重定向"结果类型的表示法(取决于Struts2特定版本:2.0.x和2.1.x在此上可能有所不同...)。

回答

好的,在类___。web.actions.VisualizationAction中,我们必须返回一个包含INPUT的字符串值,然后,在struts.xml上我们必须设置以下内容:

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

这将带我们进入所需的页面。
这应该可以工作,我已经在两个月的时间里从事struts2的工作了