这个问题困扰我很久了!大家都来看看 高分了!
前提条件:
a.jsp在WEB-INF(或者其子目录)下面。a.jsp有个超链接<a herf="javaScript:voiod(0)"
onclik="test();return false"></a>
js:如下
function test(){
var url="servlet/ProjectServlet?method=getProjectLis";
window.location.href=url;
}
我有一个过滤器配置的是拦截所有servlet开头的请求即:<url-pattern>/servlet/*</url-pattern>
然后我在过滤器中输出请求的路径
就这样 我用ie访问 输出路径是:/servlet/servlet/ProjectServlet 明显多了一个/servlet。
火狐是:/servlet/ProjectServlet 完全正确。
为了使ie火狐可行!我使用就js获取项目根目录 加上根目录来访问 做法如下:
js:获取根目录:
function getContextPath() {
var pathName = document.location.pathname;
var index = pathName.substr(1).indexOf("/");
var result = pathName.substr(0,index+1);
return result;
}
修改test()函数:
function test(){
var path=getContextPath();
var url=path+"/servlet/ProjectServlet?method=getProjectList";
window.location.href=url;
}
此时ie解析和火狐相同均为:/servlet/ProjectServlet。
本以为大功告成,但是项目部署后访问就全部乱了。ie,火狐解析到的路径都是/servlet/servlet/ProjectServlet。找其原因是因为:部署后访问去掉了项目名称。我以前本地是
http://localhost:8080/项目名 这样来访问的。部署到服务器上就只是http://localhost:8080了。但是为什么会是/servlet/servlet/ProjectServlet呢?我在js中alert(path) .发现:
本地访问需要输入项目时 alert的就是项目名称。而服务器上alert的却是 /servlert (web.xml中配置的拦截开始路径)。
不知道这到底是为什么?我试了 如果a.jsp直接在webRoot下面的话 不会有这样的情况 路径写成: var url="servlet/ProjectServlet?method=getProjectLis"; 全部都是可以的!只有在web_inf下面的时候 出现上述情况!
头都大了,不知道原因。为了解决路径问题!我只好修改所以有关的路径将
var url=path+"/servlet/ProjectServlet?method=getProjectList";改为
var url=path+"/ProjectServlet?method=getProjectList"; 这样虽然说部署上去是可以了。但是不知道根本原因啊!
[解决办法]
你个问题是没有清除url的写法。
写url首先写一个/,然后你就想,这个url是给谁用的。
如果是给服务器用, /就代表当前应用,那后面的内容应该是相对路径,即不加项目名,直接文件路径即可。
如果是给浏览器用, /就代表网站,网站下有多个应用,所以/加上项目名/文件路径。
[解决办法]
应该是命名空间的问题,先看看你的web.xml <utl-pattern>里加虚拟目录了没有,再看看你的web-inf里加没加子目录,这个命名空间对于前者是虚拟的,对于后者是实际存在的,解决路径访问故障就的先定位到根目录;
[解决办法]
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>