jsp中的路径与跳转

在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

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

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

时间: 2024-10-07 06:38:48

jsp中的路径与跳转的相关文章

关于在jsp中的路径问题

前言: jsp作为javaweb开发中常见的视图技术,我们平时在开发项目使用的过程中,经常会导入一些静态资源,比如css\js\jpg.png等图片格式的文件,这些文件的路径成了问题,经常会出现索引不到的情况发生,本篇博客就来探究一下jsp中的路径问题. 本篇博客目录: 一:基本常识 首先告诉几个常识: 1:我们常用的web项目是运行在tomcat中,而tomcat容器不会识别包中的src文件,它识别的是编译后的class类,所以按照Eclispe的结构Project-Src-WebRoot/W

jsp中超链接路径的写法

主题 超链接不就是一个地址字符串吗?这能有什么花头? LZSB! 曾经我也是这么想的.... 最近对apache的学习让我对网页中超链接,CSS,js的路径的写法有了一些新的认识. 所以这篇文章主要分享一下我的一些想法与发现.. 相对路径 最早以前我用的就是相对路径,刚开始感觉用起来很爽...很简单...比如当前路径是localhost:8080/projectName/a.jsp 我想超链接到localhost:8080/projectName/b.jsp 我只需要写<a href="b

java基础 第十四章(Servlet声明周期、Servlet向jsp中提供数据、Servlet跳转jsp、jsp中书写java代码)

一.Servlet声明周期 1.Servlet的声明周期一般分为四步:加载.实例化.服务.销毁. 2.实例化在整个生命周期中只执行一次. 二.jsp 1.Servlet向jsp中提供数据 request.setAttribute( , ); 例:request.setAttribute("key" , "Hello"); 2.Servlet跳转jsp (1)同一请求方式:request.getRequestDispatcher("/路径").fo

jsp中的两种跳转方式分别是?有什么区别?

在JSP中跳转有两种方式 forward跳转:<jsp:forward page ="跳转页面地址"> response跳转:response.sendRedirect("跳转页面地址"); 两种跳转的区别如下 forward跳转: 服务器端跳转,地址栏不改变. 执行到跳转语句后马上执行跳转,之后的代码不再执行(跳转之前一定要释放全部资源). request设置的属性在跳转后的页面仍然可以使用. response跳转: 客户端跳转,地址栏改变. 所有代码

在Jsp中如何实现页面跳转

1使用javaScript中的window.location.href="要跳转的页面": 2在超链接中href=‘’ location=“要跳转的页面”,例如<a href="index.jsp">首页</a>: 3from表单提交:action=‘’,要跳转的页面 4使用jsp内置对象request和responce,执行请求的转发和重定向来实现页面跳转

jsp中的路径问题.

以前对路径的这个问题没有怎么深究过,知道有绝对路径和相对路径这么一个概念,带盘符的是绝对路径,不带盘符的是相对路径.如:c:\abc就是绝对路径 ,\abc就是相对当前目录的相对路径.还有什么的window的盘符"\"和linux的"/"etc. 但是这两天在jsp中引用extjs文件时我直接把html中引用语句copy进来.在html文件中访问没有任何的问题,如下: <link rel="stylesheet" type="te

JSP中URL路径获取问题

项目需求是内网也就是ip+端口号可以访问资源,但是后来要上外网可以访问,资源类似的服务,外网是前置机Nginx+tomcat,为了解决同一个登录页面适应内网和外网,就想在登录jsp中添加java判断,试了多次有了如下结果. 1 获取域名或者/前第一个请求的url名称方法是 request.getServerName(); 2 在通过basePath请求静态资源的时候,如果src开头有 "/",那src会自动补上真实路径第一个"/"前的请求地址: 如果src开头不是&

jsp中的路径

我的原则 所有路径一律使用绝对路径,就是以"/"开头的或者带host的路径.形如: /imgs/1.jpg <%= request.getContextPath()%>/imgs/1.jpg //推荐使用 http://localhost:8080/imgs/1.jpg 应该尽量避免使用类似".","./","../../"等类似的相对该文件位置的相对路径.一方面,这样当文件移动时,很容易出问题.另一方面,绝对路径

JSP中解决session超时跳转到登陆页面并跳出iframe框架或局部区域的方法

//方法1: 重定向到登录页,但是不支持跳出iframe//response.sendRedirect("/dormitory/toLoginPage"); //方法2:以输出页面并请求到登录页面的形式跳转到登录页面,可以跳出iframe(推荐)PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<script>"); ou