如何在带有Tiles的Struts中获取真实的请求URL?

时间:2020-03-06 14:42:33  来源:igfitidea点击:

当我们将Tiles与Struts结合使用并执行...

request.getRequestURL()

...我们获得的网址例如" /WEB-INF/jsp/layout/newLayout.jsp",而不是用户输入/点击的真实URL,例如" /context/action.do"。

在1.3.x及更高版本的Struts版本中,我们可以使用javaranch上提到的解决方案,并使用请求属性" ORIGINAL_URI_KEY"获得真实的URL。

但是如何在Struts 1.2.x中执行此操作?

解决方案

我不知道Struts 1.2.x是否具有类似的Globals常量,但是我们可以通过至少两种方式创建自己的常量:

  • 在Action中获取原始请求URL并在请求上进行设置,然后从JSP调用它
  • 使用Servlet过滤器执行相同的操作

这适用于Struts 1.2

private String getOriginalUri(HttpServletRequest request) {
    String targetUrl = request.getServletPath();
    if (request.getQueryString() != null) {
        targetUrl += "?" + request.getQueryString();
    }
    return targetUrl;
}

我用这个,它也可以在Spring上使用:

<% out.println(request.getAttribute("javax.servlet.forward.request_uri")); %>

如果我们还需要查询字符串(由matchew贡献):

<% out.println(request.getAttribute("javax.servlet.forward.query_string")); %>

当我们从view / jsp / tiles层查询request.getRequestURL()时,它已经是另一个重写的请求。

正如Mwanji Ezana提到的,最合适的方法是在操作执行阶段将其保存为单独的属性。我们可能希望借助Struts2中的拦截器来自动执行此过程。