1

我一直在开发一个应用程序,该应用程序目前正在部署到众多环境中。但是,我们在部署到某些环境时遇到了上下文路径问题。这是一个在 Tomcat 6 上运行的 Java/Spring 应用程序。部署过程由系统管理员处理,因此我对该过程没有太多了解,因此我试图提出一些处理该场景的方法。对于所有 URL,我们在它们前面加上request.getContextPath(). 在正常情况下,这可以正常工作。例如,如果 WAR 的文件名为 site1.war,它将被部署到

/site1/

但是,我们还有其他几个部署了 WAR 的环境,它包含应用程序根目录之外的根路径,因此最终会出现

/otherroot/site1/

所以应用程序根路径是/site1/并且不知道这个其他根路径/otherroot/。在这种情况下,调用 getContextPath() 会返回/site1/实际上我们想要的路径是/otherroot/site1/.

现在,让我感到困惑的一件事是,当我们在 JSF 页面中定义图像(图像、样式表或 javascript 文件)时使用 #{request.contextpath} 时,在查看源代码时 URL 是正确的。例如,给定/otherroot/site/url,如果我设置

<img src="#{request.contextPath}/image1.png"/>,当我查看渲染页面的来源时,我看到了/otherroot/site1/image1.png. 现在,如果我在每次呈现页面时设置一些 JS 变量来保存上下文路径,我会得到不同的结果。例如,

<script>
    APP.ROOT_PATH = '#{request.contextPath}';
</script>

这将呈现以下内容:

APP.ROOT_PATH = '/site1'

这会导致一些问题,因为我们使用异步请求,因此我们使用 url 从客户端正确请求数据。

所以我的问题是,编写可以在任何给定路径下运行的应用程序的最佳策略是什么?

4

1 回答 1

1

您可以通过使用可以为您识别环境的拦截器来实现这一点。您可以通过模型将环境路径传递给 UI 可以使用的 UI。例如。 /otherroot/site1/,在这个 site1 是上下文名称和 otherrrot 是环境。

当你点击你的服务器渲染一个jsp时,拦截器会分析这个url并知道这个url与otherroot1有关。该环境和相关数据可以在模型中设置,可用于获取 js、图像等以及任何其他 ajax 调用。

渲染页面后,无需依赖 url 上下文路径。

于 2013-10-01T13:15:47.750 回答