动网论坛,站长建站首选,国内使用量最多的论坛软件 动网论坛官方技术讨论区 站长工具 申请属于您自己的免费论坛
首页 | 新闻资讯 | 网站运营 | 网络编程 | 数据库 | 服务器 | 网页设计 | 图像媒体 | 网络应用 | 搜索优化 | 资源下载 | 动网主机 | DVBOX
    本站内  互联网 ASP论坛  ASP.Net论坛  PHP论坛
  
   Jsp → 阅读文章

 jsp+servlet路径状态的测试

作者来源: 
阅读 1510 人次 , 2006-3-29 4:23:00 


路径状态测试

目的
测试jsp之间互相跳转,servlet跳转jsp环境下绝对路径和相对路径的状态
寻找出一种通用的解决办法


资源

打成的war包
mywar

组成文件
jsp
a.jsp

b/
b.jsp
ccc.jsp


servlet

testservlet.java  mapping: /layer1/layer2/testservlet


流程描述
1. 由a.jsp直接跳转到b.jsp
 或
 由a.jsp提交到testservlet,testservlet根据a的提交选择相应跳转方式(forward/sendredirect)
 然后跳转到b.jsp
2. b.jsp包含一系列超链,来显示不同方式的跳转后超链的情况
 /a.jsp
 ../a.jsp
 ../../a.jsp
 ../../../a.jsp

 ccc.jsp
 /b/ccc.jsp
 ../ccc.jsp
 ../b/ccc.jsp
 ../../ccc.jsp
 ../../b/ccc.jsp
 ../../../ccc.jso
 ../../../b/ccc.jsp

 [contextpath]/b/b.jsp



测试结果


短语替换

http://localhost:8080/  => ip/
/mywar/ => war/
http://localhost:8080/mywar/  => ip/war/
/mywar  => [contextpath] (request.getcontextpath())





跳转方式 直接跳转<a ..> servlet/forward  servlet/sendredirect
 requestdispatcher.forward  response.sendredirect
---------------------+---------------------+----------------------------------+------------------------
servlet中跳转的路径 x /b/b.jsp /war/b/b.jsp
---------------------+---------------------+----------------------------------+------------------------
跳转后浏览器的地址栏  ip/war/b/b.jsp  ip/war/layer1/layer2/testservlet ip/war/b/b.jsp
---------------------+---------------------+----------------------------------+------------------------
b.jsp中的链接列表  浏览器状态条出现的链接地址
<a href="这里的描述"
---------------------+---------------------+----------------------------------+------------------------
/a.jsp  ip/a.jsp ip/a.jsp ip/a.jsp
../a.jsp  ip/war/a.jsp ip/war/layer1/a.jsp  ip/war/a.jsp
../../a.jsp ip/a.jsp ip/war/a.jsp ip/a.jsp
../../../a.jsp  ip/a.jsp ip/a.jsp ip/a.jsp

ccc.jsp ip/war/b/ccc.jsp ip/war/layer1/layer2/ccc.jsp ip/war/b/ccc.jsp
/b/ccc.jsp  ip/b/ccc.jsp ip/b/ccc.jsp ip/b/ccc.jsp
../ccc.jsp  ip/war/ccc.jsp ip/war/layer1/ccc.jsp  ip/war/ccc.jsp
../b/ccc.jsp  ip/war/b/ccc.jsp ip/war/layer1/b/ccc.jsp  ip/war/b/ccc.jsp
../../ccc.jsp ip/ccc.jsp ip/war/ccc.jsp ip/ccc.jsp
../../b/ccc.jsp ip/b/ccc.jsp ip/war/b/ccc.jsp ip/b/ccc.jsp
../../../ccc.jsp  ip/ccc.jsp ip/ccc.jsp ip/ccc.jsp
../../../b/ccc.jsp  ip/b/ccc.jsp ip/b/ccc.jsp ip/b/ccc.jsp


[contextpath]/b/b.jsp ip/war/b/b.jsp ip/war/b/b.jsp ip/war/b/b.jsp
---------------------+---------------------+----------------------------------+------------------------




总结

由上面的列表看出,只有最下面一行是有实际意义而且无论以任何方式跳转链接地址都是正确无误的
1. 在jsp中的“/”表示的根为“ip”,不包含war路径
2. 在servlet中以forward方式使用的“/”表示的根为“ip/war/”,包含了war路径
3. 在servlet中以sendredirect方式使用的“/”表示的根为ip,不包含war路径
4. 在servlet中以forward方式跳转,则浏览器的地址栏仍然为此servlet,不会改变
5. 在servlet中以sendredirect方式跳转,则浏览器的地址栏改变为目的路径
6. 相对路径的确定是以浏览器的地址栏显示的路径为基准的,而非具体的目录结构,所以
 跳转到同目录下的某个页面使用<a href="文件名">link</a>这种方式不是永久成立的
 (做asp的人不要惊讶,这里说的jsp和servlet :))
7. 为了避免jsp跳jsp,servlet跳jsp,forward方式跳转,sendredirect跳转产生的路径问题,
 对于jsp和使用sendredirect跳转的servlet,采用直接使用带
 容器路径[string request.getcontextpath()]的绝对路径就可以彻底解决,即:
1)<%
string contextpath = request.getcontextpath();
string url = contextpath + "/user/login.jsp";
 %>
 
 <a href="<%=url%>"> login</a>
 2) ....
string contextpath = request.getcontextpath();
string targetpath = contextpath + "/user/login.jsp";
requestdispatcher rd = request.getrequestdispatcher(targetpath);
rd.forward(request, response);
......

 对于使用forward跳转的servlet,则不要加容器路径,否则就重复出现 容器路径,原因参见 2

8. 如果使用的“../”过多也不会出现严重问题,“../”最多使链接到达“ip/”
9. 另外,在使用
 <jsp:include page = "url" flush="true"/>
 <%@ include file="url" %>
 <%@ page errorpage = "url" %>时,
 这里url使用的“/”表示的根为“ip/war/”,包含了war路径

 
 收藏本文  打印本文  论坛讨论  关闭窗口
· 上一篇:一个分页类
· 下一篇:深入理解和改进JSP/Servlet会话管理机制
· 利用iText在JSP中生成PDF报表
· 怎么把查询参数传给分页的类
· 快速建立Servlet和JSP的运行、调试和编译环境
· 应用JDOM处理数据库到XML转换的JSP实现 (一)
· JSP由浅入深(6)—— JSP声明


关于本站 | 联系我们 | 业务合作 | 客户案例 | 诚聘英才 | 广告合作 | 收藏本站
海口动网先锋网络科技有限公司版权所有
Copyright © 2000 - 2006 Cndw.Com
中华人民共和国电信与信息服务业务经营许可证编号 琼 ICP 020077