请问下大家java web项目contextpath怎么设置的?
设置css时, 原来是/<%=request.getContextPath()%>/css/styles.css
然后页面里面有链接到首页的链接,也写成/<%=request.getContextPath()%>/
本来apache使用mod_jk通过ajp连接tomcat,tomcat里面设置virtualhsot,一切正常
ProxyPass / http://localhost:800/mywebapp
ProxyPassReverse / http://localhost:800/mywebapp
发现这样首页获取,但是获取css的请求,变成http://localhost:800/mywebapp/mywebapp/css/style.css, css就获取不到了
所以页面显示就不正常了,请问下大家这个一般怎么处理的?
但是由于页面是模块化拆分的,header/footer等一些页面是共享的,而且所有的页面不一定是在同一级目录上,比如首页和具体页面,所以用相对页面也不方便处理,因为header在首页和子页面的位置不一样,用相对目录也不方便
谢谢
在公共页面引用资源,当然要写成绝对路径了,绝对路径的写法是你写的是其中一种方法。还有一种就是用el表达式:
[code="java"]
${pageContext.request.contextPath}/css/styles.css
[/code]
当然也可以用变量来替代,不过本质都是一样的。
写成公共页面就是为了好控制,要修改的时候只要修改一个地方就ok了。。呵呵。
你把代理的路径修改一下:
[quote]
ProxyPass / http://localhost:800/mywebapp
ProxyPassReverse / http://localhost:800/mywebapp
[/quote]
修改为
[quote]
ProxyPass / http://localhost:800
ProxyPassReverse / http://localhost:800
[/quote]
2、相对路径不是个好的想法,特别是存在框架的时候,控制不好就乱了。
我们都是使用统一的资源服务器的,这样写确实比较麻烦,我们一般都是写一个公共页面,在这里引入需要的资源,然后在需要的页面引入这个公共页面就好了,这样还有利于缓存浏览器缓存。
[quote]
这个地方我测试了下,这样不行啊
我的tomcat上有好几个应用,我是想让该域名输入后直接连到tomcat的mywebapp
现在这样设置的话是直接反向代理到http://localhost:800
在tomcat那边我已经设置了virtualhost
[/quote]
这样访问是需要加上项目路径的,如果你想直接访问过去的话,干脆直接把项目扔到tomcat的root路径下不就可以了
[quote]
啊,奇怪啊,难道用反向代理的人tomcat上都只有一个应用么?
悲催啊-_-
[/quote]
不是这个样子的,你的apache不是可以配置多个域名吗?不同的域名不同转发就好了。
这里是一个apache 配置示例,你琢磨琢磨
[code="java"]
NameVirtualHost :80
ServerName cms.demo.**.net.cn
ProxyPreserveHost On
ProxyRequests Off
ProxyPass / http://192.168.2.73:8081/
ProxyPassReverse / http://192.168.2.73:8081/
ErrorLog logs/cms.demo.***.net.cn_error_log
CustomLog logs/cms.demo.***.net.cn_access_log common
ServerName portal.demo.***.net.cn
ProxyPreserveHost On
ProxyRequests Off
ProxyPass / http://192.168.2.70/
ProxyPassReverse / http://192.168.2.70/
ErrorLog logs/cms.demo.***.net.cn_error_log
CustomLog logs/cms.demo.***.net.cn_access_log common
[/code]
哦,那你也给tomcat配置域名吧,用域名转发。试试
试试这种方式,也没有特别全面的测试各种情况,也许可以解决你说的问题:
String requrl = req.getRequestURL().toString();
String requri=req.getRequestURI();
String servletPath=req.getServletPath();
//2013-3-25考虑到反向代理的情况,需要进行字符串判断处理,才能获取到正确的contextPath
int i=requrl.indexOf(requri);
String s= requrl.substring(0, i) ;
if(requri.equals(servletPath)){
return s+"/";
}else{
int j=requri.indexOf(servletPath);
String contextPath=requri.substring(0,j);
return s+contextPath+"/";
}