绝对路径与相对路径
如果咱们使用的URL网址是以“/”开头的,那么这个网址就叫做绝对路径。
如果咱们使用的URL网址不是“/”开头的,那么这个网址就叫做相对路径。
在相对路径上,两者的表现是相同的。
看看lingo-sample/03-03/这个例子,如果我们去请求relative/forward.jsp或redirect.jsp,然后从这里再跳转向它下面的result/result.jsp会怎样呢?
forward的例子:
<%request.getRequestDispatcher("result/result.jsp").forward(request, response);%> 这里的相对路径就是result/result.jsp。
因为刚刚请求的test.jsp是在/03-03/relative/下,所以我们的当前路径就是/03-03/relative/,执行forward的时候会寻找当前路径下的result/result.jsp,找到之后便转发请求。
redirect的例子:
<%response.sendRedirect("result/result.jsp");%> 这里的相对路径也是result/result.jsp。
因为刚刚请求的test.jsp是在/03-03/relative/下,所以我们的当前路径就是/03-03/relative/,执行redirect的时候会把当前路径加上result/result.jsp,把结果作为重定向的地址发送给浏览器,浏览器再去请求/03-03/relative/result/result.jsp,从而得到响应。
绝对路径
问题出现了,绝对路径在forward和redirect中出现了差别,还是刚才的情况,但使用绝对路径的时候写法便不同了。
forward的例子:
<%request.getRequestDispatcher("/relative/result/result.jsp").forward(request, response);%>这里的绝对路径就是/relative/result/result.jsp。在本地测试时,forward把http://localhost:8080/03-03/当作根路径,在它的基础上计算绝对路径。
这是由jsp的部署方式决定的,webapp里可以放好多项目,为了让这些项目可以互不影响、独立运行,不能让请求从一个项目直接在服务器内部转移到另一个项目。为了防止出现这种情况,在执行forward的时候干脆把项目的路径当作根目录,开发者看不到其他项目,也就不会出现问题了。
redirect的例子:
<%response.sendRedirect("/03-03/absolute/result/result.jsp");%> 这里的绝对路径却是/03-03/absolute/result/result.jsp。
在本地测试时,redirect把http://localhost:8080/当作根路径,在它的基础上计算绝对路径。
因为redirect会让浏览器重新发起一个新请求,所以不会搅乱服务器里多个项目之间的关系,也就不需要对它做限制,如果需要在多个项目之间进行跳转,就只能使用redirect。不过因为重新发起了新的请求,上次请求的那些数据都会丢失,如果有什么重要的数据,记得要重新设置。
orward导致找不到图片
找不到图片,找不到js脚本,找不到css样式表,都属于这个问题。
要演示这个问题,是非常容易的,只需要满足两个条件
forward前后的jsp页面不在一个目录下。
forward后的jsp页面里使用相对路径引用一些资源,图片,js脚本,css样式表什么的。
03-04里就模拟了这样一个环境,你进入http://localhost:8080/03-04/,选择“有问题的”:
打开03-04可以看到如下的目录结构:
|--+ 03-04 |--- index.jsp |--- test.jsp |--+ result |--- success.jsp |--- failure.jsp |--- lingo.png 刚才咱们看到的页面是failure.jsp,它里边显示图片的部分是:
<img src="lingo.png" /> 这时候就有疑问了,lingo.png和failure.jsp明明在同一个目录下,为什么无法显示。
现在请在无法显示的图片上,点击鼠标右键,选择属性,让我们看一下图片的请求地址:
图片的位置本来在http://localhost:8080/03-04/result/lingo.png,但请求的地址却是http://localhost:8080/03-04/lingo.png。问题就是丢掉了中间的/result。
再试一次index.jsp上的“没问题的”:
这次我们看到的页面是success.jsp,它里边显示图片的部分是:
<img src="result/lingo.png" /> 结果手工加上result这段路径后就可以显示图片了。
这个问题还要追溯到浏览器对html的处理方式,在html里包含的图片,css样式表,js脚本,视频等等外部资源,都需要浏览器再次向服务器发起请求。
如果这些外部资源使用了相对路径,浏览器就会在当前请求路径的基础上,加上相对路径拼接出完整的http请求,发送给服务器。这个例子中,我们请求http://localhost:8080/03-04/test.jsp,浏览器得到的当前路径就是http://localhost:8080/03-04/,failure.jsp中图片的相对路径是lingo.png,那么拼接的结果是http://localhost:8080/03-04/lingo.png。
不要怪浏览器太傻,是因为使用forward的时候浏览器并不清楚这些改变。它一直认为,既然自己请求的是test.jsp,返回的自然就是test.jsp的内容,那么再使用test.jsp当作当前路径去计算相对路径当然没有问题。是我们欺骗了浏览器,在服务器偷偷改变了请求流向,返回了其他页面的内容。
清楚了以上的请求流程,就知道如何应对这种问题了。
第一种方法:不要在不同目录之间使用forward做请求转发,保证当前路径不发生变化。
第二种方法:像上例一样修改图片路径,或全部改为绝对路径。
请根据实际需要进行选择。
分享到:
相关推荐
在此示例中,`<jsp:include>`标签用于包含`header.jsp`和`footer.jsp`两个文件。这种方式可以让头部和底部的内容在多个页面中复用。 #### 5. JSP页面跳转 JSP页面跳转有两种方式:使用`<jsp:forward>`标签和`<c:...
89、在JSP中获取当前绝对路径 90、读取表单中所有参数 91、分行写入数据 92、显示请求URL 93、判断session是否过期 94、参数式查询数据库 95、取得数据库中各栏名称 96、使用JavaBean、设置和获取Bean的属性 97、...
#### 三、绝对路径与相对路径在JSP中的应用实例 ##### 1. 相对路径的应用实例 假设我们有一个Web应用,其目录结构如下: ``` |--+03-03 |---relative | |---forward.jsp | |---redirect.jsp |--+result |---...
2. **jsp:useBean**:查找或实例化一个JavaBean,使得可以在JSP页面中操作JavaBean的属性。 3. **jsp:setProperty**:设置JavaBean的属性值。 4. **jsp:getProperty**:读取JavaBean的属性并输出到页面。 5. **jsp:...
在"Java开发指南--Servlets和JSP篇(PDG)"这个教程中,读者将深入探讨这些概念,通过实例练习提升实际开发能力。无论你是初学者还是有经验的开发者,都能从中受益,增强构建高效、可扩展的Java Web应用的能力。
JSP + Servlet 面试题知识点总结 以下是 JSP 和 Servlet 相关的知识点总结: ...JSP 和 Servlet 是 web 应用开发的基础技术,了解它们的基础知识和应用场景可以帮助开发者更好地开发 web 应用程序。
提供的幻灯片和文档可能涵盖了JSP和Servlet的基本语法、生命周期、常用API、实际开发中的应用案例等。例如,"第三部分.ppt"、"第二部分.ppt"、"第一部分.ppt"可能构成了一套完整的JSP和Servlet教学课程,详细讲解了...
- 在Java Web应用中,页面跳转通常有两种方式:重定向(Redirect)和转发(Forward)。 - **重定向**:客户端(浏览器)会收到一个新的HTTP响应,并被指示去访问新的URL。这意味着客户端会发送一个新的请求到...
过滤器的作用是可以在多个Servlet/JSP之间共享数据转换或页面处理,可以写一个过滤器类,然后在部署描述文件(web.xml)中把该过滤器与对应的Servlet/JSP联系起来。 4.forward和redirect的区别 forward是把另一个...
- **在JSP中定义类变量**:了解如何在JSP页面中定义和使用类变量。 - **JSP九大默认对象**:介绍JSP提供的九个内置对象及其用途。 #### 第15章 分页 - **数据库分页**:实现数据库查询结果的分页展示。 - **使用...
**六、Servlet API中的forward()和redirect()** 1. **forward()**:服务器端的转发,URL不变,效率较高,常用于内部跳转,避免暴露实际路径。 2. **redirect()**:客户端重定向,浏览器地址栏显示新URL,效率较低,...
本教程将深入探讨"登录超时完整实例",包括如何进行`session超时设置`以及在`JSP页面`中处理会话超时的问题。 首先,我们需要理解什么是登录超时。登录超时是指用户在一定时间内未进行任何操作,系统自动判断该用户...
JSP(JavaServer Pages)和Servlet是Java Web开发中两个核心的技术,它们主要用于构建动态网站。下面将详细阐述这两个概念以及它们在...在面试或笔试中,对这些概念的深入理解和应用能力通常是评估候选人技能的重要标准。
在这个例子中,`name`属性指定了这个`ActionForward`的名称,`path`属性定义了转发的目标路径,而`redirect`属性则表示是否需要执行重定向操作。 ### 全局转发配置 除了在Action类中动态创建并返回`ActionForward`...
任何在`<jsp:declaration>`、`<jsp:scriptlet>`、`<jsp:expression>`或`<jsp:text>`标签中声明或定义的变量都属于Page Context,关闭或刷新页面后这些数据将丢失。 2. **Request Scope(请求范围)** 请求范围的...
在书城系统中,Servlet可能会使用RequestDispatcher的forward()方法进行请求转发,这使得多个Servlet或JSP页面可以共享同一个请求,用户不会在浏览器地址栏看到URL的变化。而Redirect()方法则是让客户端发起新的请求...
5. **jsp:forward**:用于转发请求到另一个页面,不改变客户端地址栏中的URL。 6. **jsp:plugin**:用于生成适当的插件代码(如Java Applet的或标签)。 #### 三、Forward与Redirect的区别 - **forward**(转发)...