初学jsp+servlet时经常碰上的几个错误:404、路径正确但页面没有任何内容、样式和图片丢失。
这几个错误曾经让我在debug时头大,现在总结一下,其实它们都跟路径有关,正是因为没有处理好路径跳转的问题,才引发了这一连串的错误。
 
 
首先要说明的是:我们的页面本来是没有问题的,导致问题发生的是路径跳转。
那么,使我们的URL路径跳转的操作有哪些呢?
大概有以下几种:
1、客户端实现的跳转(如html里的<a>标签和表单提交、js里的window.location.href)
2、request.getRequestDispatcher
3、response.sendRedirect
 
 
那么这些路径跳转方式有什么不同呢?
 
首先是客户端实现的跳转:
 
客户端实现的跳转最不容易出现问题,
但值得注意的是“/”代表的不是项目的根路径而是tomcat里指定的根路径(默认在webapps/ROOT下)
注意:urlPatterns里的“/”除外,urlPatterns里的“/”指的是项目的根目录!
所以要用request.getContextPath()来获取项目的根路径
如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<style type="text/css">
#p1 {
height: 20%;
width: 20%
}
</style>
</head>
<body>
<a href="<%=request.getContextPath()%>/servlet/AddServlet">click</a> <img id="p1" src="<%=request.getContextPath()%>/spic/img9.jpg"/>
</body>
</html>
绝对路径这么麻烦,那么为什么不用相对路径呢?理由如下:
使用request.getContextPath()还有一点重要原因,在服务器内部(request.getRequestDispatcher)跳转后,页面对应URL路径会发生变化,而此时若再以相对路径去请求资源很可能请求不到需要的资源,此时就会发生样式和图片丢失的问题。


服务器内部跳转(request.getRequestDispatcher)
 
以这种方式实现的跳转在服务器内部运行,不会经过客户端的处理,对应的URL路径不会发生变化,究其原因是因为http的特性只允许客户端发起的请求重新定位URL路径。因此,即使在servlet里用request.getRequestDispatcher跳转到其它路径,实际上其路径并不会发生改变,可以简单的理解为把本来要跳转到路径的资源移到原路径下运行。
可以看出如果我们在servlet里跳转到另一个servlet或jsp页面时,其路径还是原路径。
 
值得注意的是:
因为在服务器内部跳转后需要request和response对象才能进行后续操作,因此需要forward(request,response),如果没有forward就会出现页面没有任何内容的错误,因为没有获取request,不能进行后续操作。
 
 
请求重定向(response.sendRedirect)
 
当在servlet里用请求重定向时,实际上是返回给客户端信息,让客户端重新发一次http请求给指定的资源,因此才实现路径的跳转。
这样可以真正实现路径的跳转,也不容易出现资源错误,但也因为重新进行的http请求(http的无状态性),使request里保存的数据不能传递,数据只能通过“........?a=1&b=flypie”这种形式写在URL里。
 
 
 

关于tomcat内路径跳转的一些思考的更多相关文章

  1. eclipse下修改项目名导致tomcat内发布名不一致的解决方法 .

    eclipse下修改项目名导致tomcat内发布名不一致的解决方法 . ------------------------------------------------------- 解决方案: 直接 ...

  2. 开源数据库连接池之Tomcat内置连接池

    本篇介绍几种开源数据库连接池,同时重点讲述如何使用Tomcat服务器内置的数据库连接池. 之前的博客已经重点讲述了使用数据库连接池的好处,即是将多次创建连接转变为一次创建而使用长连接模式.这样能减少数 ...

  3. Servlet路径跳转问题

    Servlet中路径跳转(服务器端跳转)JSP 1.相对路径  注意这里的相对含义,相对于谁而言 经过多次试验总结,servlet相对路径跳转相对于servlet配置的xml路径(或servlet3. ...

  4. Tomcat 7 的七大新特性(更容易将Tomcat内嵌到应用去中去 )

    Tomcat的7引入了许多新功能,并对现有功能进行了增强.很多文章列出了Tomcat 7的新功能,但大多数并没有详细解释它们,或指出它们的不足,或提供代码示例.本文将明确描述TOMCAT 7中七个最显 ...

  5. Nginx配置实例-反向代理实例:根据访问的路径跳转到不同端口的服务中

    场景 Ubuntu Server 16.04 LTS上怎样安装下载安装Nginx并启动: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/detai ...

  6. CI框架--URL路径跳转与传值

    CI框架使用URL的前提是需要加载辅助函数$this->load->helper('url');当然我建议大家将所有需要加载的东西写在构造方法内,这样就不需每个控制器每个方法都去调用一次了 ...

  7. tomcat内置jdk(tomcat集成jdk)(windows环境)

    tomcat内置jdk,步骤: 1.在一个已经安装了jdk或者jre的机器上,拷贝一个jre到tomcat根目录下. 2.编辑tomcat/bin文件夹下的catalina.bat文件,在文件开头加上 ...

  8. Servlet路径跳转2--在servlet当中,跳转到某网页时的路径写法

    课程1-13   http://www.imooc.com/video/5554 Servlet路径跳转: 绝对路径:放在任何地方都对的路径 相对路径:相对于当前资源的路径 两种方法:请求重定向,服务 ...

  9. Servlet路径跳转1---使用相对路径和绝对路径,在页面上调用servlet的路径写法(超链接的方式和表单的方式)

    课程1-13   http://www.imooc.com/video/5554 Servlet路径跳转: 绝对路径:放在任何地方都对的路径 相对路径:相对于当前资源的路径 index文件 加上/,表 ...

随机推荐

  1. win7下matlab2016a配置libsvm

    1.下载libsvm https://www.csie.ntu.edu.tw/~cjlin/libsvm/ 2.解压到matlab2016a的安装目录的toolbox下 例如我的D:\Program ...

  2. 【python】如何在某.py文件中调用其他.py内的函数

    假设名为A.py的文件需要调用B.py文件内的C(x,y)函数 假如在同一目录下,则只需 import B if __name__ == "__main__": B.C(x,y) ...

  3. JavaScript 动态脚本

    动态脚本,指的是在页面加载时不存在,但将来的某一个时刻通过修改DOM动态添加的脚本. <script type="text/javascript"> function ...

  4. C++ STL中的 iterator 和 const_iterator

    我们在C++中使用STL的容器时,经常会用到迭代器.使用迭代器可以很方便的进行容器元素遍历和修改等操作. 近日,在使用Visual Studio 2015编程的时候发现,set的迭代器直接就是cons ...

  5. TRUNCATE TABLE (Transact-SQL)

    删除表中的所有行,而不记录单个行删除操作. TRUNCATE TABLE 与没有 WHERE 子句的 DELETE 语句类似:但是,TRUNCATE TABLE 速度更快,使用的系统资源和事务日志资源 ...

  6. SqlBulkCopy批量添加数据

    var sqlconn = ConfigurationManager.ConnectionStrings["SQLConnStringRead"].ConnectionString ...

  7. 升级python到2.7版本pip不可用

    升级python到2.7版本pip不可用 [root@localhost pip-7.1.2]# pip Traceback (most recent call last): File "/ ...

  8. cmp函数

    cmp(x,y),既可以比较数字大小,也可以比较字符串.如果 x < y 返回 -1, 如果 x == y 返回 0, 如果 x > y 返回 1. 数字的比较 >>> ...

  9. DDS转换工具

    本工具用于将(长宽均为 2 的指数次幂的)图像文件如 PNG.TGA.BMP.JPG 等转换为 DDS 图像(DXT 压缩类型可选,DXT1~DXT5),也可将 DDS 图像转换回此几种格式图片. 截 ...

  10. Oracle(控制用户权限)

    权限允许用户访问属于其它用户的对象或执行程序, ORACLE系统提供权限:Object 对象级.System 系统级 查看权限的数据字典: 字典名 含义 ROLE_SYS_PRIVS System p ...