如何在 Struts 2 中进行动态 URL 重定向?

Posted

技术标签:

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

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

最好的方法是什么?

【问题讨论】:

【参考方案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";

【讨论】:

对我有用,我也需要在拦截器中拥有这个,谢谢!

以上是关于如何在 Struts 2 中进行动态 URL 重定向?的主要内容,如果未能解决你的问题,请参考以下文章

您如何在 Google 表格中进行动态/依赖下拉菜单?

如何在红移中进行动态正则表达式匹配?

在CodeIgniter中进行动态路由

使用 XMLRPC 在 Python 中进行动态函数调用

使用 HTML 输入在 D3 中进行动态过滤

使用gorm golang在多个表中进行动态列搜索