Servlet的学习(四)
在本篇的Servlet的学习中,主要来学习由使用MyEclipse来开发Servlet的一些小细节。
细节一:在web.xml中可以对同一个Servlet配置多个对外访问路径,并如果在web.xml中配置的信息服务器会自动加载部署,而如果是在Servlet中进行程序代码的修改,则每次都要重新部署。
首先,在使用MyEclipse创建Servlet后,会根据所创建的Servlet进行到web.xml文件的映射,如下图所示:

经过这个映射之后,在web.xml文件中就自动生成了这个Servlet的配置信息:

当然,我们可以在web.xml文件中把这个Servlet继续添加一条对外访问路径,使得这个Servlet可以从不同路径进行访问,现在我们在服务器开启的情况下,为这个Servlet添加一个新的对外访问路径好了:

红框部分是新添加的,这时候服务器在Console窗口会自动提示已经重新部署,是的,只要在web.xml中修改的都无需关闭服务器就可以被服务器重新更新加载部署:

那么我们试试新的访问地址:

可以访问!!
细节二:在web.xml中为Servlet配置对外访问路径的<url-pattern>可以使用“*”作为通配符,但是这种只能有两种格式:
一种格式是整个内容只能有“*.扩展名”,如<url-pattern>*.html<url-pattern>,而如果写成这样<url-pattern>abc/*.html<url-pattern>就是错误的。尤其是<url-pattern>/*.html<url-pattern>也是错误的,不能有“/”,一定要注意。例:

在浏览器可以在通配符位置随便输入:

这样造成了一种伪静态的现象,我们以为是访问一个静态的页面,其实却是一个动态web资源。
另一种格式是以正斜线“/”开头,加自定义路径,以“/*”结尾,如<url-pattern>/abc/*<url-pattern>。这时候连扩展名都任意了。例:

在浏览器的地址栏内可以在通配符位置随便输入,扩展名都不需要:


细节三:由细节二导出的多个Servlet资源的映射路径如果使用了通配符,就可能发生冲突,那么这时候服务器将会以哪个Servlet资源作为响应呢?我们看一下下面的问题,就能明白了:

细节四: 在Servlet的整个生命周期内,Servlet的init()方法只会被调用一次。而对于Servlet的每次访问请求,Servlet都会调用service()方法一次。并对于每次的请求访问,Servlet都会创建一个新的HttpServletRequest请求对象和新的HttpServletResponse响应对象。当然在每次请求访问完成之后,这些请求对象和响应对象会立马被销毁,等待下次请求再重新创建,这样就能给服务器减小压力(非并发情况下)。
细节五:之前谈到的Servlet在服务器部署后,都是只在第一次对该Servlet访问时才由服务器创建Servlet的实例对象,而如果在web.xml中在某个<servlet>标签下配置<load-on-startup>标签,则该Servlet会在服务器启动后就创建实例对象,并执行Servlet的初始化init()方法。<load-on-startup>的内容为一个正整数值。该值越小,代表在服务器启动后优先创建Servlet对象并执行初始化方法。
细节六:如果某个Servlet的映射路径仅仅为一个正斜线“/”,那么这个Servlet就称为当前web应用的默认Servlet。凡是在web.xml文件中找不到匹配的<servlet-mapping>标签的URL,它们的访问请求都是交个默认Servlet来处理,也就是说默认Servlet用于处理所有其他Servlet都不处理的访问请求。
例如我现在创建两个Servlet,其中一个有自定义的对外映射路径,而另一个设置成了默认Servlet:

要想访问SecondServlet就必须按照其对应的路径在浏览器地址栏中键入:

而对于默认Servlet,则是在web应用名后随便输:

(如果不输则会显示的是已有的首页index.jsp,为什么呢,请看下面细节六)
细节六(重要):如果我们在自己开发的Servlet中没有配置默认Servlet,而是直接访问我们web工程下的一个静态web资源的话(如果有),那么我们将能从浏览器中看到这个web资源,记住:请求任何web资源都是以某个Servlet来响应回传数据的,那么既然我们没有配置默认Servlet的话,为什么能访问到这个资源呢?换句话说,是哪个Servlet将我们需要的资源响应给我们看的?答案就是Tomcat服务器的默认Servlet!!!Tomcat服务器的默认Servlet在Tomcat的【conf】目录下的web.xml文件中设置了映射路径:

从Tomcat的web.xml文件中可以看出,其默认Servlet在服务器启动就创建实例对象,并且是最早创建的,对外路径已经设置了默认格式。而这个默认Servlet会管理每个自定义创建的Servlet工程,如果我们没有在自己的web工程中创建默认Servlet,那么要访问自己web工程中的某个资源时,Tomcat的默认Servlet会帮我们将该资源封装成响应对象传回客户端。
例如,我在我的web工程下创建一个1.html页面:

而我去浏览器访问这个页面:
对于这个URL,Tomcat服务器首先去配对我的Servlet是否有对应的映射路径,如果没有,并且如果我没有在自己的web工程中设置默认Servlet,那么Tomcat的默认Servlet就在我的web应用下搜寻HTTP请求的资源,找到并封装成响应对象返回给客户端。如果Tomcat的默认Servlet找不着所需的资源,那它依然会响应客户端,只是客户端看到的是一些提示找不着该资源,如404提示。另外,根据这个过程,我们在开发自己的Servlet时,建议不要将自己的某个Servlet映射成默认Servlet为好。
接下来,讨论一个首页的问题。除了我们访问web应用中某个特定资源(在浏览器地址上最后键入一个文件名),还会是在键入web应用名之后就发送HTTP请求了,这时候我们看到的也是一个页面,通常称为“首页”,而这个首页,也是由默认Servlet来响应的。
例如我使用MyEclipse创建一个web应用时就会默认帮我创建一个“index.jsp”文件:

而我在该web应用中没有创建任何Servlet,或者即使创建Servlet也映射到某个特定的对外URL上,那么我在浏览器输入主机地址+web应用名依然能看到这个index.jsp:

由前面所说,这个页面肯定是由Tomcat服务器的默认Servlet传回给客户端的,那么Tomcat服务器为什么是传回这个资源呢,而不是别的资源呢?答案还是在web.xml文件中,还记得之前《Tomcat详细用法学习(三)》中定义的首页设置吗,对,就是这个方法,这个方法由默认Servlet来管理,我们再来回顾下在Tomcat的web.xml文件中的<welcome-file-list>标签:

如果浏览器的输入地址只输入了web应用名,那么Tomcat的默认Servlet传送这个web应用下的index.html文件,否则传送index.htm文件,再否则传送index.jsp,如果三个都没有那么只能返回404了。
如果我把这段代码注释掉或删掉,再想直接访问web应用名就跟我把index.jsp文件删除一样,Tomcat的默认Servlet找不到资源,返回404提示(在MyEclipse中需要重启服务器):


所以如果我们想为自己的web应用弄出个漂亮首页,只需要在index.jsp中开发就行了,或者另外创建一个index.html文件开发,这个文件会比index.jsp更优先被访问。
细节七:因为我们的开发Servlet都要继承Servlet接口的某个实现类,那么我们在编写doGet方法或者doPost方法的时候很可能调用了某些会抛出异常的方法,那么我们对这些异常只能捕获处理,而不能抛出,这是因为子类在覆盖父类的方法时,不能抛出比父类更多的异常。
Servlet的学习(四)的更多相关文章
- Servlet的学习之Filter过滤器技术(1)
本篇将讲诉Servlet中一项非常重要的技术,Filter过滤器技术.通过过滤器,可以对来自客户端的请求进行拦截,进行预处理或者对最终响应给客户端的数据进行处理后再输出. 要想使用Filter过滤器, ...
- [转]Servlet的学习之Filter过滤器技术
本篇将讲诉Servlet中一项非常重要的技术,Filter过滤器技术.通过过滤器,可以对来自客户端的请求进行拦截,进行预处理或者对最终响应给客户端的数据进行处理后再输出. 要想使用Filter过滤器, ...
- Servlet的学习之ServletContext(2)
本篇接上篇<Servlet的学习(五)>,继续从ServletContext对象中的方法进行学习,在这一篇中,我们重点关注的是ServletContext对象中对于在web工程中的资源文件 ...
- (转)SpringMVC学习(四)——Spring、MyBatis和SpringMVC的整合
http://blog.csdn.net/yerenyuan_pku/article/details/72231763 之前我整合了Spring和MyBatis这两个框架,不会的可以看我的文章MyBa ...
- SpringBoot系列教程web篇Servlet 注册的四种姿势
原文: 191122-SpringBoot系列教程web篇Servlet 注册的四种姿势 前面介绍了 java web 三要素中 filter 的使用指南与常见的易错事项,接下来我们来看一下 Serv ...
- TweenMax动画库学习(四)
目录 TweenMax动画库学习(一) TweenMax动画库学习(二) TweenMax动画库学习(三) Tw ...
- Servlet的学习之Session(3)
在上一篇<Servlet的学习之Session(2)>我们知道了Session能实现一个会话过程中保存数据或者多个会话中实现同一个Session的关键因素就是Cookie,只是Cookie ...
- Servlet的学习之Session(2)
在上一篇中我们学习了Session对象默认在一个会话过程中,由服务器创建,能保存在这个会话过程中用户访问多个web资源时产生的需要保存的数据,并在访问服务器中其他web资源时可以将这些数据从Sessi ...
- Servlet的学习之Session(1)
在学习完了Servlet中的Cookie技术后,我们再来学习另一个能保存会话数据的技术——Session. Session是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其 ...
随机推荐
- cocos2d-x游戏开发系列教程-超级玛丽07-CMGameMap(四)-马里奥平移
上一篇博文提到,程序如何获取键盘输入,也就是D键按下,程序获取到前进指令,那么获取到前进指令之后,马里奥是如何前进的呢,这篇文章我们重点讨论这个问题. 马里奥的移动,依旧是在帧刷新函数中,这个调用过程 ...
- CentOS配置防火墙
昨天帮朋友配置CentOSserver,一開始为了方便測试直接把防火墙关了.之后便须要配置好防火墙,网上找了几个防火墙规则都有错误,后来发现是博主发帖不认真,有太多字符错误,以下是我整理的亲測可用的防 ...
- dreamvc框架(三),dispartcher做了些什么
这一篇我会介绍一些dreamvc的核心类Dispatcher都做了些什么,首先我们先来看一看init方法,这是在DispatcherServlet和DispatcherFilter里面都会调用到的一个 ...
- ceph install
Ceph : performance, reliability and scalability storage solution Contents 1 Introduction 1.1 Testing ...
- [Swust OJ 191]--迷宫逃离(打表搜索)
题目链接:http://acm.swust.edu.cn/problem/191/ Time limit(ms): 1000 Memory limit(kb): 65535 江鸟突然想到了一个 ...
- Python之路Day8
摘要: Socket编程 异常处理 线程.进程 1.socket编程 1.1 socket 三次握手,注意阻塞的应用. 1.2 socketserver(2.x写作:SocketServer) 实现多 ...
- DE1-SOC连接设定
将电源供应器插上电源接口. 使用白色的USB Type B线材将计算机与DE1-SoC上的USB-Blaster II接口连接.此接口主要负责FPGA配置以及HPS Debug使用. 使用Mini-U ...
- Java字符串排序中文+数字
编写日期: 2013年9月15日 另一中解法:点击查看 解决思路: 在Java中,排序需要复写的是 equals 方法 和 Comparable<T> 接口 的public int com ...
- Ubuntu下编译Android JNI最靠谱的方法...
网上资料太杂乱,搞了大半天都还是没搞懂怎么系统的调用NDK.最后干脆放弃了Win改用Ubuntu编译JNI,虽然编译环境简单了,但是资料却少了不少.几乎没有一篇完整的文章.我想或许是能在Ubuntu下 ...
- 使用Jquery+EasyUI 进行框架项目开发案例解说之二---用户管理源代码分享
使用Jquery+EasyUI 进行框架项目开发案例解说之二 用户管理源代码分享 在上一篇文章<使用Jquery+EasyUI进行框架项目开发案例解说之中的一个---员工管理源代码分享> ...