【问题标题】:How to do dynamic URL redirects in Struts 2?如何在 Struts 2 中进行动态 URL 重定向?
【发布时间】:2010-09-15 11:43:42
【问题描述】:

我正在尝试将我的 Struts2 应用程序重定向到生成的 URL。在这种情况下,我希望 URL 使用当前日期,或者我在数据库中查找的日期。所以/section/document变成/section/document/2008-10-06

最好的方法是什么?

【问题讨论】:

    标签: java url redirect struts2


    【解决方案1】:

    我最终继承了 Struts 的 ServletRedirectResult 并覆盖它的 doExecute() 方法来执行我的逻辑,然后再调用 super.doExecute()。它看起来像这样:

    public class AppendRedirectionResult extends ServletRedirectResult {
       private DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
    
      @Override
      protected void doExecute(String finalLocation, ActionInvocation invocation) throws Exception {
        String date = df.format(new Date());
        String loc = "/section/document/"+date;
        super.doExecute(loc, invocation);
      }
    }
    

    我不确定这是否是最好的方法,但它确实有效。

    【讨论】:

      【解决方案2】:

      我们是这样做的:

      在 Struts.xml 中,有一个动态结果,例如:

      <result name="redirect" type="redirect">${url}</result>
      

      在行动中:

      private String url;
      
      public String getUrl()
      {
       return url;
      }
      
      public String execute()
      {
       [other stuff to setup your date]
       url = "/section/document" + date;
       return "redirect";
      }
      

      实际上,您可以使用相同的技术使用 OGNL 为 struts.xml 中的任何变量设置动态值。我们已经创建了各种动态结果,包括 RESTful 链接之类的东西。很酷的东西。

      【讨论】:

      • 非常感谢,效果很好!有什么方法可以对 xml 进行更改,以便不需要将其应用于我所做的每一个操作?理想情况下,我希望它适用于我的所有行为。
      • 您可以尝试全局结果。我还没有对动态变量进行过实验,但是,只要操作返回结果,我看不出它有任何不起作用的原因。
      【解决方案3】:

      也可以使用annotations和Convention插件来避免struts.xml中的重复配置:

      @Result(location="${url}", type="redirect")
      

      ${url} 表示“使用 getUrl 方法的值”

      【讨论】:

      • 谢谢!正是我需要的。
      【解决方案4】:

      如果有人想直接在ActionClass重定向:

      public class RedirecActionExample extends ActionSupport {
      HttpServletResponse response=(HttpServletResponse) ActionContext.getContext().get(ServletActionContext.HTTP_RESPONSE);
      
          url="http://localhost:8080/SpRoom-1.0-SNAPSHOT/"+date;
          response.sendRedirect(url);
          return super.execute(); 
      }
      

      编辑:添加了一个缺失的引号。

      【讨论】:

      • 在动作类内部重定向而不是使用 struts.xml 有什么优点或缺点?我已经看到了一个区别:通过使用 struts.xml,重定向实际上是两个完全独立的请求,而您的解决方案只有一个请求?
      【解决方案5】:

      您可以使用注释重定向到另一个操作 -

      @Result(
          name = "resultName",
          type = "redirectAction",
          params = { "actionName", "XYZAction" }
      )
      

      【讨论】:

        【解决方案6】:

        可以直接从拦截器重定向,而无需考虑所涉及的操作。

        在 struts.xml 中

            <global-results>
                <result name="redir" type="redirect">${#request.redirUrl}</result>
            </global-results>
        

        在拦截器中

        @Override
        public String intercept(ActionInvocation ai) throws Exception
        {
            final ActionContext context = ai.getInvocationContext();        
            HttpServletRequest request = (HttpServletRequest)context.get(StrutsStatics.HTTP_REQUEST);
            request.setAttribute("redirUrl", "http://the.new.target.org");
            return "redir";
        }
        

        【讨论】:

        • 对我有用,我也需要在拦截器中拥有这个,谢谢!
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-18
        • 1970-01-01
        • 1970-01-01
        • 2011-04-28
        • 2013-10-15
        • 1970-01-01
        相关资源
        最近更新 更多