Java 如何在Struts 2中进行动态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

我正在尝试将我的Struts2应用重定向到生成的URL。在本例中,我希望URL使用当前日期,或者我在数据库中查找的日期。所以
/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";
}