我一直在开发一个应用程序,该应用程序目前正在部署到许多环境中。但是,当部署到某些环境时,我们在上下文路径方面遇到了问题。这是一个在 Tomcat 6 上运行的 Java/Spring 应用程序。部署过程由系统管理员处理,因此我对该过程的了解不多,因此我试图想出一些处理该场景的方法。对于所有 URLS,我们在它们前面加上 request.getContextPath()
.在正常情况下,这工作正常。例如,如果 WAR 的文件名为 site1.war,它将被部署到
/site1/
但是,我们有几个部署 WAR 的其他环境,它包含应用程序根目录之外的根路径,因此它以
/otherroot/site1/
所以应用根路径是/site1/
并且不知道这个其他根路径 /otherroot/
.在这种情况下,调用 getContextPath() 返回 /site1/
而实际上我们想要的路径是 /otherroot/site1/
.
现在,让我感到困惑的一件事是,当我们在定义图像(图像、样式表或 javascript 文件)时在 JSF 页面中使用 #{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 正确地从客户端请求数据。
所以我的问题是,编写可以在任何给定路径下运行的应用程序的最佳策略是什么?
最佳答案
您可以通过使用可为您识别环境的拦截器来实现此目的。您可以将环境路径通过模型传递给 UI,UI 可以使用它。 例如。 /otherroot/site1/ ,这里site1是上下文名称,otherrrot是环境。
当您访问您的服务器以呈现 jsp 时,拦截器将分析此 url 并知道该 url 与 otherroot1 有关系。可以在模型中设置此环境和相关数据,该模型可用于获取 js、图像等以及任何其他 ajax 调用。
渲染页面后无需依赖 url 上下文路径。
关于Java - 管理上下文路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19116886/