昨天简单分析了下路径的相对于绝对,然后在项目中遇到一个问题:如下
首先我所在url:http://localhost:8080/OnlineC/r/findAll
想到达的url:http://localhost:8080/OnlineC/r/findFiles
可以看出都是在r子目录下的请求,一个为findAll另一个是findFiles
所以我可以用相对路径进入,href="findFiles"
当我想反过来的时候http://localhost:8080/OnlineC/r/findFiles
到http://localhost:8080/OnlineC/r/findAll
请求href="findAll"发现不行,总是r/findAll才可以;
这里我们需要去了解下服务器work中,对jsp请求转换servlet有一定的了解,先不说这个;
先解释下为什么出现这个错误,原来是第二次的jsp中开头有个路径声明
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<head> <base href="<%=basePath%>"> </head>
request.getSchema()可以返回当前页面使用的协议,http 或是 https;
request.getServerName()可以返回当前页面所在的服务器的名字;
request.getServerPort()可以返回当前页面所在的服务器使用的端口,就是80;
request.getContextPath()可以返回当前页面所在的应用的名字;
所以第二次href="findAll"实际上被追加在了basePath后了也就是
http://localhost:8080/OnlineC/findAll
所以出错了,正确的http://localhost:8080/OnlineC/r/findAll
结论:当要多用相对路径的时候,如果要根据当前的路径来判断相对于哪个路径,就去掉前面那个声明,比如上面提到的都是相对于/r/路径;
如果路径多复杂,就声明好了初始路径,后面的都是相对于这个路径,比如basePath
另:这里强烈提倡用第二中,首先是jsp创建的时候就会自己声明好,毕竟那些架构师当年架构的时候想的比我们多,肯定有好处,
其次是,当后台各种转发后,我们知道 地址栏路径不会改变,这个时候你要记住转发前的url地址,如果是第一种,你就要考虑该怎么追加path,
如果:转发前http://localhost:8080/OnlineC/r/findU
要到http://localhost:8080/OnlineC/r/findAll这个请求,那么jsp追加href=“findAll”
如果:转发前http://localhost:8080/OnlineC/findU
要到http://localhost:8080/OnlineC/r/findAll这个请求,那么jsp追加href=“r/findAll”,
这里看出来就是要根据之前的url考虑怎么去追加url,但是如果是第二种方式,那么我们不需要去考虑之前的url,
比如basePath声明好=http://localhost:8080/OnlineC/
那么我们后面相对路径都是相对这个的:转发前是http://localhost:8080/OnlineC/r/findU
或者是http://localhost:8080/OnlineC/findU到达http://localhost:8080/OnlineC/r/findAll
那么相对路径都是href=“r/findAll”,
当然还有一处
[img]http://dl.iteye.com/upload/attachment/0078/7946/51a5e925-308a-3e6a-91c9-a6e666163204.jpg[/img]
这里页面时bill.jsp地址栏是http://localhost:8080/OnlineC/r/findAll
如果不声明basepath 那么应该是这个路径
<h3><a href="findFiles">查看文件</a></h3>
<h3><a href="findAll">查看人员列表</a></h3>
然后action="/OnlineC/r/s/search" 这个完成后路径就是
http://localhost:8080/OnlineC/r/s/search?**然后又转发到bill.jsp
那么我们假设要点击 查看人员列表 按钮,相对路径追加后应该是
http://localhost:8080/OnlineC/r/s/findAll,
这明显错了,正确是http://localhost:8080/OnlineC/r/findAll,所以这个jsp中我声明了初始相对路径
说了这么多希望对别人有个帮助,码字还真是累啊 。。。
首先我所在url:http://localhost:8080/OnlineC/r/findAll
想到达的url:http://localhost:8080/OnlineC/r/findFiles
可以看出都是在r子目录下的请求,一个为findAll另一个是findFiles
所以我可以用相对路径进入,href="findFiles"
当我想反过来的时候http://localhost:8080/OnlineC/r/findFiles
到http://localhost:8080/OnlineC/r/findAll
请求href="findAll"发现不行,总是r/findAll才可以;
这里我们需要去了解下服务器work中,对jsp请求转换servlet有一定的了解,先不说这个;
先解释下为什么出现这个错误,原来是第二次的jsp中开头有个路径声明
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<head> <base href="<%=basePath%>"> </head>
request.getSchema()可以返回当前页面使用的协议,http 或是 https;
request.getServerName()可以返回当前页面所在的服务器的名字;
request.getServerPort()可以返回当前页面所在的服务器使用的端口,就是80;
request.getContextPath()可以返回当前页面所在的应用的名字;
所以第二次href="findAll"实际上被追加在了basePath后了也就是
http://localhost:8080/OnlineC/findAll
所以出错了,正确的http://localhost:8080/OnlineC/r/findAll
结论:当要多用相对路径的时候,如果要根据当前的路径来判断相对于哪个路径,就去掉前面那个声明,比如上面提到的都是相对于/r/路径;
如果路径多复杂,就声明好了初始路径,后面的都是相对于这个路径,比如basePath
另:这里强烈提倡用第二中,首先是jsp创建的时候就会自己声明好,毕竟那些架构师当年架构的时候想的比我们多,肯定有好处,
其次是,当后台各种转发后,我们知道 地址栏路径不会改变,这个时候你要记住转发前的url地址,如果是第一种,你就要考虑该怎么追加path,
如果:转发前http://localhost:8080/OnlineC/r/findU
要到http://localhost:8080/OnlineC/r/findAll这个请求,那么jsp追加href=“findAll”
如果:转发前http://localhost:8080/OnlineC/findU
要到http://localhost:8080/OnlineC/r/findAll这个请求,那么jsp追加href=“r/findAll”,
这里看出来就是要根据之前的url考虑怎么去追加url,但是如果是第二种方式,那么我们不需要去考虑之前的url,
比如basePath声明好=http://localhost:8080/OnlineC/
那么我们后面相对路径都是相对这个的:转发前是http://localhost:8080/OnlineC/r/findU
或者是http://localhost:8080/OnlineC/findU到达http://localhost:8080/OnlineC/r/findAll
那么相对路径都是href=“r/findAll”,
当然还有一处
[img]http://dl.iteye.com/upload/attachment/0078/7946/51a5e925-308a-3e6a-91c9-a6e666163204.jpg[/img]
这里页面时bill.jsp地址栏是http://localhost:8080/OnlineC/r/findAll
如果不声明basepath 那么应该是这个路径
<h3><a href="findFiles">查看文件</a></h3>
<h3><a href="findAll">查看人员列表</a></h3>
然后action="/OnlineC/r/s/search" 这个完成后路径就是
http://localhost:8080/OnlineC/r/s/search?**然后又转发到bill.jsp
那么我们假设要点击 查看人员列表 按钮,相对路径追加后应该是
http://localhost:8080/OnlineC/r/s/findAll,
这明显错了,正确是http://localhost:8080/OnlineC/r/findAll,所以这个jsp中我声明了初始相对路径
说了这么多希望对别人有个帮助,码字还真是累啊 。。。