Java 如何在Struts 2中进行动态URL重定向?
我正在尝试将我的Struts2应用重定向到生成的URL。在本例中,我希望URL使用当前日期,或者我在数据库中查找的日期。所以Java 如何在Struts 2中进行动态URL重定向?,java,url,redirect,struts2,Java,Url,Redirect,Struts2,我正在尝试将我的Struts2应用重定向到生成的URL。在本例中,我希望URL使用当前日期,或者我在数据库中查找的日期。所以/section/document变成了/section/document/2008-10-06 最好的方法是什么?我最终将Struts的ServletRedirectResult子类化,并在调用super.doExecute()之前重写它的doExecute()方法来执行我的逻辑。看起来是这样的: public class AppendRedirectionResult
/section/document
变成了/section/document/2008-10-06
最好的方法是什么?我最终将Struts的
ServletRedirectResult
子类化,并在调用super.doExecute()
之前重写它的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);
}
}
我不确定这是否是最好的方法,但它确实有效。以下是我们的做法:
在Struts.xml中,有一个动态结果,例如:
<result name="redirect" type="redirect">${url}</result>
实际上,您可以使用相同的技术,使用OGNL为struts.xml中的任何变量设置动态值。我们已经创建了各种各样的动态结果,包括RESTful链接之类的东西。很酷的东西。还可以使用
注释和约定插件来避免struts.xml中的重复配置:
@Result(location="${url}", type="redirect")
${url}的意思是“使用getUrl方法的值”如果有人想直接在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();
}
编辑:添加缺少的引号。您可以使用注释重定向到另一个操作-
@Result(
name = "resultName",
type = "redirectAction",
params = { "actionName", "XYZAction" }
)
可以直接从拦截器重定向,而不考虑涉及哪个操作
struts.xml中的
<global-results>
<result name="redir" type="redirect">${#request.redirUrl}</result>
</global-results>
非常感谢,效果很好!是否有某种方法可以对xml进行更改,从而不必将其应用于我所做的每一个操作?理想情况下,我希望这适用于我的所有行动。你可以尝试一个全局结果。我还没有对动态变量进行过这样的实验,但是,只要操作返回结果,我看不出有任何理由它不起作用。谢谢!这正是我所需要的。在action类内部重定向,而不是使用struts.xml进行重定向的优点或缺点是什么?我已经看到了一个区别:通过使用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";
}