日期:2014-05-18  浏览次数:20586 次

这个问题困扰我很久了!大家都来看看 高分了!
前提条件:  
    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+"/";
%>

一般不是提供这个获取根目录吗?
------解决方案--------------------
 a.jsp在WEB-INF(或者其子目录)下面。
js:如下
    function test(){
     var url="servlet/ProjectServlet?method=getProjectLis";  
     window.location.href=url;
   }
在跳到a.jsp页面的时候地址栏是不是:8080/xxx/servlet/x.jsp?
然后你的a.jsp的超链接的url就需要改变了 如:rul="../servlet/ProjectServlet?method=getProjectLis";
或写成一个 如:http:localhost:8080/项目/servlet/ProjectServlet?method=getProjectLis";