WebSphere转Tomcat迁移:跨WAR的JSP<c:import>路径批量优化求助
解决Tomcat中跨WAR JSP引入的context路径批量修改问题
我完全懂你现在的困扰——上千个JSP要手动改context属性,想想都头大。咱们直接上几个高效的解决方案,不用碰那堆JSP文件:
方案1:将WebHome部署为Tomcat根应用(最快最省心)
这是最直接的办法,原代码里的context="/"在Tomcat中默认指向ROOT应用,只要把你的WAR B(WebHome)改成ROOT应用,所有原代码都能直接复用:
- Maven配置修改:在WebHome的
pom.xml里,找到<build>节点下的<finalName>,改成ROOT:
这样打包出来的WAR就是<build> <finalName>ROOT</finalName> <!-- 其他配置保持不变 --> </build>ROOT.war,Tomcat会自动把它部署到根路径/,原代码的<c:import url="/jsp/menu_head.jsp" context="/" />就能直接找到对应的JSP了。 - 手动部署替代方案:如果不想改Maven配置,也可以把打包好的
WebHome.war重命名为ROOT.war再放到Tomcat的webapps目录下。
方案2:修正crossContext配置并实现动态context映射(适合无法修改部署名称的场景)
如果你因为某些原因不能把WebHome改成ROOT应用,那咱们把crossContext配置正确,再通过全局变量自动替换context值:
- 正确配置crossContext:
给WAR A和WAR B都开启跨上下文访问:- 在每个WAR的
META-INF/context.xml中添加(如果没有这个文件就新建):<Context crossContext="true"> <WatchedResource>WEB-INF/web.xml</WatchedResource> <WatchedResource>WEB-INF/tomcat-web.xml</WatchedResource> <WatchedResource>${catalina.base}/conf/web.xml</WatchedResource> </Context>
conf/server.xml的<Host>节点下,为两个应用分别配置:<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> <Context path="/WAR_A" docBase="WAR_A" crossContext="true" /> <Context path="/WebHome" docBase="WebHome" crossContext="true" /> <!-- 其他默认配置 --> </Host> - 在每个WAR的
- 全局注入context路径:
在WAR A中写一个简单的ServletContextListener,启动时获取WebHome的上下文路径并放到全局属性里:
然后在WAR A的public class WebHomeContextListener implements ServletContextListener { @Override public void contextInitialized(ServletContextEvent sce) { ServletContext currentContext = sce.getServletContext(); // 获取WebHome的上下文 ServletContext webHomeContext = currentContext.getContext("/WebHome"); if (webHomeContext != null) { // 把WebHome的contextPath放到全局属性中 currentContext.setAttribute("webHomeContext", webHomeContext.getContextPath()); } } }web.xml中注册这个Listener:<listener> <listener-class>com.yourpackage.WebHomeContextListener</listener-class> </listener> - 快速批量替换JSP引用:
虽然你不想手动改上千个JSP,但可以用IDE的全局替换功能,把所有context="/"替换成context="${webHomeContext}"——这个操作只需要几秒,比一个个改快多了。
方案3:用Tomcat RewriteValve做路径映射
如果以上方案都不适用,还可以通过Tomcat的重写阀把根路径的请求映射到WebHome:
- 在Tomcat的
conf/server.xml的<Host>节点下添加RewriteValve:<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> <Valve className="org.apache.catalina.valves.rewrite.RewriteValve" /> <!-- 其他配置 --> </Host> - 在Tomcat的
conf/Catalina/localhost/目录下新建rewrite.config文件,添加规则:
这样原代码的# 把对根路径下jsp的请求重写到WebHome RewriteRule ^/jsp/(.*)$ /WebHome/jsp/$1 [L]<c:import url="/jsp/menu_head.jsp" context="/" />就会被自动映射到/WebHome/jsp/menu_head.jsp。
为什么你之前的crossContext配置没生效?
你之前的配置只开启了单个应用的跨上下文访问,但crossContext="true"本身并不会改变context="/"的指向——它只是允许你的应用访问其他应用的ServletContext,并没有自动把根路径映射到WebHome,所以单独配置这个不会解决你的路径问题。
内容的提问来源于stack exchange,提问作者hell_storm2004
相关产品推荐
相关产品推荐

