初学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. 【转载】移动web开发经验总结

    本文出自: http://blog.163.com/hsb001_mobile/blog/static/15524028020111177221254/ 1.-webkit-tap-highlight ...

  2. Interpolation particles In Katana

    I write the sphere radius interpolation for katana plugin that can transfer attributes,render attrib ...

  3. 关于yuv格式

    首先,内存分布        1:YUV420          (1):I420:              YYYYYYYY UU VV    =>YUV420P          (2): ...

  4. oncontextmenu事件

    oncontextmenu的作用是阻止浏览器默认的鼠标右键行为. 阻止弹出右键自带菜单 document.oncontextmenu=function(){ console.log('你点击了右键') ...

  5. PowerShell脚本自动设置安卓手机wifi代理

    在实际测试工作中,经常要将安卓手机通过wifi代理的形式连接到本机的fiddler或charles服务器代理进行抓包测试.最近一直在想,有没有什么方法可以自动设置安卓手机的wifi代理,曾经想通过修改 ...

  6. DllImport attribute的总结

    C#有没有方法可以直接都用已经存在的功能(比如Windows中的一些功能,C++中已经编写好的一些方法),而不需要重新编写代码? 答案是肯定,就是通过接下来要说的 DllImport . DllImp ...

  7. 【转】Checkpoint--与lazy writer区别

      checkpoint目的是减少数据库的恢复时间(服务奔溃或重启服务后的恢复),而lazy writer的目的是保证SQL OS 有空闲缓存块和系统有一定可用内存. Checkpoint和lazyW ...

  8. C#中浮点数依IEEE-754标准转二进制串 (MODBUS 浮点数转换)

    因工作需要,把再串口通信中浮点数与字节流的数据转换函数放在这,转发的,谢谢原作者. 今天花了一天的时间搜罗资料,为了解决一个串口编程的进制转化问题.因为串口传送的浮点数据格式与IEEE-754标准(3 ...

  9. 开始学习Angular Mobile UI

    介绍 Mobile AngularUI 可以让你使用Twitter Booostrap和Angular JS来开发混合移动App和桌面应用程序. 下面是是一些贯穿整个项目的步骤,我强烈的建议你去继续阅 ...

  10. 6.如何使用官方提供的nuget包实现cookie登陆

    "Microsoft.AspNetCore.Authentication.Cookies": "1.0.0", 这里需要用到的是这个nuget包 public ...