更改Tomcat Web应用程序上下文

时间:2010-01-14 16:48:55

标签: java tomcat contextpath

我有一个Web应用程序,它的设计始终在根上下文(“/”)下工作。因此,所有cssjs和链接都以/开头(例如/css/style.css)。现在我需要将此Web应用程序移动到某个不同的上下文(假设/app1)。可以使用server.xml项轻松更改app1配置文件并在新上下文[Context path=""]中启动Web应用程序。但网页被破坏是因为所有链接现在都不正确。它们指向旧的根上下文/css/style.css而不是新的app1上下文。 是否有任何神奇的方法可以修复此问题,而无需通过添加一些“上下文”变量来修复每个链接? 使用的服务器 - Tomcat 5.应用程序是用Java编写的,使用JSP,Struts2,Spring和UrlRewrite过滤器。更有意思的是听到与理论辩论中的这些问题作斗争的真实经验。 谢谢。

P.S。我没有看到UrlRewrite过滤器如何帮助我,因为它只能在app1上下文中使用。因此,对/css/style.css等链接的请求将不会传递给它。

2 个答案:

答案 0 :(得分:3)

如果您使用URL重写将ROOT重定向到您的应用程序,那么这是否会消除在ROOT中拥有应用程序的能力?如果是这样,通过切换上下文获得了什么?

我认为链接资源的一般方法是添加“上下文”变量并使链接绝对:${pagecontext.request.contextpath}/css/style.css或只是使链接相对:css/style.css

除非您有特定原因无法修改代码,否则我会对链接进行搜索/替换并完成。你应该有不超过三个或四个表达式来查找,/ css,/ images,/ javascript等。

答案 1 :(得分:2)

您应该始终通过url重写创建网址,不仅可以将会话信息添加到网址(如果需要),还可以添加上下文路径。您应该从应用程序顶部创建所有URL作为绝对路径,然后使用url-rewriting句柄将context-path添加到前端,视情况而定。

<c:url value="/css/site.css"/>

如果没有启用Cookie,那么会将/&lt;context-path&gt;/css/site.css/&lt;context-path&gt;/css/site.css;jsessionid=134345434543呈现到jsp文件中。您还可以使用c:url标记将url呈现为​​变量,然后在整个文档中多次使用该变量。只需在代码中添加var="x"属性,然后${x}会将网址呈现到您的文档中。如果您没有使用jsp来渲染输出,则需要为视图层找到合适的机制,但它们都有一个。如果你在java代码中渲染一个url,只需看看c:url标记的源代码,你就会看到它是如何完成的。

一个尴尬是CSS文件(和js文件)没有被处理,所以css和js文件中的url需要是相对路径,否则每当你更改上下文路径时它们都会中断。大多数js已经使用了相对路径,因为库维护者不知道你要将库安装到哪个路径。另一方面,CSS背景图像通常被指定为绝对URL,因为相同的CSS文件可以包含在文件层次结构的不同级别的html文件中。除了创建适当的符号链接以使相对URL始终有效或者通过JSP提供问题CSS文件以便可以适当地重写URL时,我没有简单的解决方法。我确定你可以运行的过滤器或apache模块可以进行url替换,但是当你部署到新的上下文路径时,你仍然必须手动更新你的过滤器/模块。