如何在 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 重定向?的主要内容,如果未能解决你的问题,请参考以下文章