码迷,mamicode.com
首页 > Web开发 > 详细

jsp中的路径与跳转

时间:2015-08-04 23:09:17      阅读:196      评论:0      收藏:0      [点我收藏+]

标签:jsp   path   sendredirect   requestdispatcher   

在jsp(serlvet)中,页面的"变换"有两种方式,第一重定向,第二转发:
先说重定向,它的调用方式是这样的
response.sendredirect("uri");
特点就是 转换后的uri地址会在地址栏显示不过之前的request里的数据不能传送给新的页面#
重定向就是,让服务器再发一个请求#
如下图,浏览器看到response里面的sendredirect,就会重新发一个请求,那么之前的请求所带的数据自然就没有了#
技术分享

转发:
实现方式是这样的:
RequestDispatcher dispatcher=request.getRequestDispatcher("b.jsp")
dispatcher.forward(request,response);


它的特点刚好与重定向相反,转发的新的地址不会再浏览器地址栏上出现,不过request的信息在新的页面里仍然可以使用#

大致的示意图如下:

技术分享

步骤2与步骤3的运行都在服务器内部,它对用户(浏览器)来说是透明的,那么新的地址,肯定不会显示在地址栏上,而且之前的request信息自然就可以用了#

先看项目框架图:
技术分享

资源引用

我们先看jsp中关于资源的引用


b.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<img width="400" height="300" src="../images/b.jpg" /> 这是第一张<br/>   
<img width="400" height="300" src="images/b.jpg" /> 这是第二张<br/>   
<img width="400" height="300" src="/images/b3.jpg" /> 这是第三张<br/>   
<img width="400" height="300" src="<%=request.getContextPath()%>/images/b.jpg" />  这是第四张<br/>   
<img width="400" height="300" src="PathTest/images/b.jpg" />  这是第五张<br/>    

当我们直接访问b.jsp时,效果如下

技术分享

根据上面的图,我们至少能得到一个结论
在jsp中,默认的根路径是并不是项目的地址,而是只到端口号那一层#即   http://ip:port/
因而,我们在jsp中引用图片,js等资源的时候,可以用两种方式
相对地址: 就是第一张图片的样子#
绝对地址: 地址以"/"开始,并且得包括项目名称#访问第四张图片的方式,tomcat容器会解析成<img width="400" height="300" src="/PathTest/images/b.jpg" />  这是第四张<br/>


服务器端跳转

OK我们看第一个例子:
a.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<img width="400" height="300" src="../images/a.jpg" />  
<a href="../testServlet">去b页面</a>  


testServlet.java
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    //    request.getRequestDispatcher("jsp/b.jsp").forward(request, response);   
        request.getRequestDispatcher("/jsp/b.jsp").forward(request, response);
    } 
如果使用服务器跳转,那么默认路径就是当前的项目,因而,上面两种url方式(不管url前面是否有"/")都可以#
(我解释一下,这个默认路径与上文说的jsp的默认路径不是一回事,这里是说,在代码层次,或者说在容器里,跳转到视图时,根路径指的是当前项目的路径#这个大家得明白#)
OK,我们跳转到了b.jsp
看看效果
技术分享
由于是服务器端跳转,地址还是servlet的,并没有改变#

那么大家想想http://localhost:8900/PathTest/testServlet 在这个地址下(记着是服务器端跳转,"b.jsp"这个页面对用户来说就是透明的,你压根就不知道你到底访问的是那个页面# 另一方面,servlet的地址是:http://localhost:8900/PathTest/testServlet, 目录却是:http://localhost:8900/PathTest)

此时访问图片1的模式 ../images/b.jpg访问的图片地址其实就是:http://localhost:8900/images/b.jpg 怎么可能会有照片?

所以,在项目中,图片一的那种相对路径的方式是没办法两全其美的#

所以最好使用,图片四的访问方式,用绝对路径#


客户端跳转

我们改动servlet,如下:

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.sendRedirect("/jsp/b.jsp");  
    } 

进入a.jsp,然后点击去b页面,效果如下:

技术分享

我们把servlet换成:

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.sendRedirect("jsp/b.jsp");
    } 
点击去b页面后,地址栏成为http://localhost:8900/PathTest/jsp/b.jsp

显示出图片一与图片四

通过上面的例子,我们又可以得出结论

客户端跳转时,它的路径并不是相对于当前的项目#

所以,如果使用绝对路径,那么就得加上项目名称如下:

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       response.sendRedirect(request.getContextPath()+"/jsp/b.jsp");
    }



参考资料:

本文大范围的参考了

http://cxshun.iteye.com/blog/1123913

这篇博客,特此说明,并表示感谢





版权声明:本文为博主原创文章,未经博主允许不得转载。

jsp中的路径与跳转

标签:jsp   path   sendredirect   requestdispatcher   

原文地址:http://blog.csdn.net/dlf123321/article/details/47281729

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!