我一直在研究目前正在部署到众多环境的应用程序。但是,在部署到某些环境时,我们遇到了上下文路径问题。这是在Tomcat 6上运行的Java / Spring应用程序。部署过程由系统管理员处理,因此我对该过程没有太多可见性,所以我试图想出一些处理场景的方法。对于所有网址,我们会在request.getContextPath()
前加上它们。在正常情况下,这工作正常。例如,如果WAR的文件名为site1.war,则会将其部署到
/site1/
但是,我们还有其他几个部署了WAR的环境,它包含一个在应用程序根目录之外的根路径,所以最终会以
结束 /otherroot/site1/
因此,应用程序根路径为/site1/
,并且不知道其他根路径/otherroot/
。在这种情况下,调用getContextPath()会返回/site1/
,而实际上我们想要的路径是/otherroot/site1/
。
现在,令我困惑的一件事是,当我们在定义图像(图像,样式表或javascript文件)时在JSF页面中使用#{request.contextpath}时,在查看源代码时URL是正确的。例如,给定/otherroot/site/
网址,如果我设置
<img src="#{request.contextPath}/image1.png"/>
,当我查看呈现页面的来源时,我看到/otherroot/site1/image1.png
。现在,如果我在每次呈现页面时设置一些JS变量来保存上下文路径,我会得到不同的结果。例如,
<script>
APP.ROOT_PATH = '#{request.contextPath}';
</script>
这将呈现以下内容:
APP.ROOT_PATH = '/site1'
这导致了一些问题,因为我们使用了异步请求,所以我们使用url从客户端正确地请求数据。
所以我的问题是,编写可以在任何给定路径下运行的应用程序的最佳策略是什么?
答案 0 :(得分:1)
您可以通过使用可以为您识别环境的拦截器来实现此目的。您可以将环境路径通过模型传递给UI,UI可以使用它。 例如。 / otherroot / site1 / ,在此site1中是上下文名称,otherrrot是环境。
当你哟打你的服务器渲染一个jsp时,拦截器会分析这个url并且知道url与otherroot1有关。这个environemnt和相关数据可以在模型中设置,可用于获取js,图像等以及任何其他ajax调用。
呈现页面后,无需依赖url上下文路径。