在本篇的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的学习(四)的更多相关文章

  1. Servlet的学习之Filter过滤器技术(1)

    本篇将讲诉Servlet中一项非常重要的技术,Filter过滤器技术.通过过滤器,可以对来自客户端的请求进行拦截,进行预处理或者对最终响应给客户端的数据进行处理后再输出. 要想使用Filter过滤器, ...

  2. [转]Servlet的学习之Filter过滤器技术

    本篇将讲诉Servlet中一项非常重要的技术,Filter过滤器技术.通过过滤器,可以对来自客户端的请求进行拦截,进行预处理或者对最终响应给客户端的数据进行处理后再输出. 要想使用Filter过滤器, ...

  3. Servlet的学习之ServletContext(2)

    本篇接上篇<Servlet的学习(五)>,继续从ServletContext对象中的方法进行学习,在这一篇中,我们重点关注的是ServletContext对象中对于在web工程中的资源文件 ...

  4. (转)SpringMVC学习(四)——Spring、MyBatis和SpringMVC的整合

    http://blog.csdn.net/yerenyuan_pku/article/details/72231763 之前我整合了Spring和MyBatis这两个框架,不会的可以看我的文章MyBa ...

  5. SpringBoot系列教程web篇Servlet 注册的四种姿势

    原文: 191122-SpringBoot系列教程web篇Servlet 注册的四种姿势 前面介绍了 java web 三要素中 filter 的使用指南与常见的易错事项,接下来我们来看一下 Serv ...

  6. TweenMax动画库学习(四)

    目录            TweenMax动画库学习(一)            TweenMax动画库学习(二)            TweenMax动画库学习(三)            Tw ...

  7. Servlet的学习之Session(3)

    在上一篇<Servlet的学习之Session(2)>我们知道了Session能实现一个会话过程中保存数据或者多个会话中实现同一个Session的关键因素就是Cookie,只是Cookie ...

  8. Servlet的学习之Session(2)

    在上一篇中我们学习了Session对象默认在一个会话过程中,由服务器创建,能保存在这个会话过程中用户访问多个web资源时产生的需要保存的数据,并在访问服务器中其他web资源时可以将这些数据从Sessi ...

  9. Servlet的学习之Session(1)

    在学习完了Servlet中的Cookie技术后,我们再来学习另一个能保存会话数据的技术——Session. Session是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其 ...

随机推荐

  1. 学校作业-Dp练习

    题目 ★Stringsobits01 串  考虑排好序的 N(N<=31)位二进制数.  你会发现,这很有趣.因为他们是排列好的,而且包含所有可能的长度为 N 且含有 1 的个数小于等于 L(L ...

  2. java:转换时间格式为String

    SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss"); Date curDate = new ...

  3. PyconChina2015丁来强Pydata Ecosystem

    pydata ecosystem基于python的数据分析生态系统 0. Agenda Data Science ecosystem Data Wrangling Data Analysis Data ...

  4. Google Code Jam Round 1A 2015 Problem B. Haircut 二分

    Problem You are waiting in a long line to get a haircut at a trendy barber shop. The shop has B barb ...

  5. django-extensions

    命令行: admin后台管理扩展 后面会出现个放大镜实现搜索补齐功能. 交互式的 Python Shells(shell_plus) 实现自动导入 如果遇到apps中包含的的models名字出现冲突, ...

  6. django 新闻编辑笔记

    url(r'^news_manage/edit/$',views.news_edit,name='edit') url配置 <a href="/management/news_mana ...

  7. Qt 操作 pdf 文件

    写了好久的东西,不小心按了下返回键就没了.CSDN居然没自动保存,坑爹啊 原本还有很多信息的,现在直入正题吧. QT没有内置PDF操作的功能(其实有一个,QPrinter,不过只能写不能读,基本是半残 ...

  8. php __autoload使用

    官方介绍: void __autoload ( string $class ) 你可以通过定义这个函数来启用类的自动加载. 转载一篇文章: PHP autoload机制详解 (1) autoload机 ...

  9. HTTP 301 跳转和302跳转的区别

    常用的重定向方式有: 301 redirect, 302 redirect 与 meta fresh: 301 redirect::301代表永久性转移(Permanently Moved),301重 ...

  10. PHP通过Thrift操作Hbase

    PHP通过Thrift操作Hbase     HBase是一个开源的NoSQL产品,它是实现了Google BigTable论文的一个开源产品,和Hadoop和HDFS一起,可用来存储和处理海量col ...