JavaWeb开发之Servlet

时间:2022-08-26 19:45:29

1. Servlet有关概念和前置知识

1.1 什么是动态网页

  如果浏览器在不同时刻或不同条件下访问web服务器上的某个页面,浏览器所获得的页面内容可以发生变化,那么这个页面就称之为动态页面.

  动态网页与静态网页最明显的区别就是针对页面的访问请求,web服务器在不同的条件下返回给客户端的网页总是不同的.

1.1.1 区分动态网页与动态HTML的概念

  要注意区分web服务器端创建的动态网页与使用客户端脚本实现的具有动态视觉效果的网页及Flash动画网页的区别. 虽然后者在浏览器中也可以实现视觉上的动态效果,并能与用户交互,但这种动态效果是浏览器执行的结果,它并不是网页内容的源文件改变内容后的结果.

1.2 动态网页程序与引擎

  web服务器的作用用于实时接受浏览器的请求,并将响应结果回送给浏览器. 对于静态HTML页面内容的访问请求,web服务器可以直接从文件系统中读取文件内容后返回给浏览器. 但对于要根据某些条件去动态创建内容的访问请求,web服务器本身不具备处理这种请求的能力,而是需要专门的web服务器程序模块来处理. 因此,动态网页内容的创建过程包含两个步骤: 首先使用某种编程语言编写出相应的动态网页程序; 然后由一个专门的web服务器程序模块来解释执行该动态网页程序.

  动态网页程序可以完成各种程序的逻辑控制,获取客户端传递的数据,对数据库进行操作,创建输出的内容等功能,web程序开发就是指使用某种编程语言来编写完成上述功能的动态网页程序. 动态网页程序需要有一个专门的web服务器程序模块来解释执行,专门解释和执行某种动态网页程序的web服务器程序模块被习惯上称为引擎,比如:ASP引擎,Servlet引擎,JSP引擎,PHP引擎等.

  只有引擎才会与浏览器直接进行交互,动态网页程序不直接与浏览器进行信息的交互,动态网页程序只与引擎进行数据交互,由引擎将浏览器的信息传递给动态 网页程序,并将动态网页程序执行后生成的结果回送给浏览器. (理解这一点很重要) 浏览器,引擎和动态网页程序的工作关系图

  JavaWeb开发之Servlet

  客户端向web服务器请求的URL资源路径,不仅可以指向服务端的一个静态HTML文件,还可以指向服务端的某种可被解释执行的程序文件. 如果客户端请求的URL后缀名为.htm

或者.html,通常由web服务器直接在本地文件系统中查找该URL对应的静态页面并读取出内容原封不动的传递给客户端,这样产生的文档总是相同的.

  如果客户端请求的URL的后缀不是.htm或.html,而是符合某种引擎所处理的资源名的特征,web服务器将把请求转交给相应的引擎去处理,然后由引擎去调用某个程序文件,并将程序动态产生的内容返回给客户端.(此动态网页程序可以是Servlet,此Servlet 不仅可以创建出用于返回给浏览器的动态变化的内容,还可以实现对数据库的增上改查等)

  目前有很多公司都提供了动态网页的解决方案,称之为服务端的web编程技术. 常见的技术有 ASP,ASP.NET,Servlet/JSP,PHP等等,这些技术分别使用不同的编程语言,本文讲解Java语言的Servlet/JSP技术

1.3 Servlet技术简介

  Servlet技术是Sun公司提供的一种实现动态网页的解决方案,它是基于Java编程语言的Web服务端编程技术,它主要用于在web服务器端获取客户端的访问请求信息和动态生成对客户端的响应信息. Servlet技术也是JSP技术的基础.  一个Servlet程序就是一个实现了特殊接口的java类,它由支持Servlet的web服务器(Servlet引擎)调用和启动运行. 一个Servlet程序负责处理它所对应的一个或多个URL地址的访问请求,并用于接受客户端发出的访问请求信息和产生的响应内容.

  Servlet与普通java程序相比,只是输入信息的来源和输出结果的目标不一样,所以,普通java 程序所能完成的大多数任务,Servlet程序都可以完成. Servlet程序具有如下一些基本功能:

  • 获取客户端通过HTML和FORM表单提交的数据和URL后面的参数信息.
  • 创建对客户端的响应消息的内容.
  • 访问服务器端的文件系统
  • 连接数据库,操作数据库
  • 调用其他java类

2. Servlet开发入门

2.1 Servlet API 介绍

  sun公司定义了一套专门用于开发Servlet程序的java类和接口,这些类和接口提供Servlet程序开发中所涉及的各种功能,他们被统称为Servlet API.(Servlet Application Programming Interface). Servlet引擎与Servlet程序之间采用Servlet API进行通信,因此, Servlet引擎与Servlet程序都需要用到Sevlet API, 事实上,一个Servlet程序就是一个在 Web服务器端调用了Servlet ApI的Java类.

2.2 编写第一个Servlet程序

  一个Servlet程序就是一个在web服务器端运行的特殊Java类,这个特殊的Java类必须实现javax.servlet.Servlet接口,Servlet接口定义了Servlet引擎与Servlet程序之间通讯的协议约定. 为了简化Servlet程序的编写,Servlet API也提供了一个实现Sevlet接口的最简单的Java类,其完整名名称为 javax.servlet.GenericServlet,这个类实现了 Servlet程序的最基本特征和功能.

  Servlet API还提供了一个专用于HTTP协议的Servlet类,其名称是javax.servlet.http.HttpServlet,它是GenericServlet的子类,在GenericServlet类的基础上进行了一些针对HTTP特点的扩充. 显然,一个java类只要继承GenericServlet类或者 HttpServlet类,它就是一个Servlet. 反过来说,要编写一个Servlet类 ,这个类只要继承GenericServlet类或者HttpServlet类就可以了. 为了充分利用HTTP协议的功能,在一般情况下,都应让自己编写的Servlet类继承HttpServlet类,而不是继承GenericServlet类.

  查看HttpServlet的帮助文档,可以看到其中有一个名为service的方法,当客户端每次访问这个servlet程序时,servlet引擎都将调用这个方法来进行处理,我们自己编写的Servlet程序通常只需要在HttpServlet类的基础上覆盖这个方法. service方法接受两个参数: 一个用于封装hTTP请求消息的对象,其类型为HttpServletRequest; 另一个是封装了响应消息的对象,其类型为HttpServletResponse. 调用HttpServletResponse对象的getWriter()方法可以获得一个文本传输对象,向这个了流对象中写入数据将作为HTTP响应消息的实体内容部分转发给客户端.

  1. 编写一个继承了HttpServlet的ServletA类,它对HttpServlet类中的service方法进行了覆盖,如图所示:

  JavaWeb开发之Servlet

2.2.1 Servlet的注册与运行

  HTML文件可以直接用浏览器打开并查看结果,但是,Servlet程序必须通过web服务器和Servlet引擎来启动运行.所以会有一些特别要求,Servlet程序必须在web应用程序的web.xml文件中进行注册和映射其访问路径,才可以被servlet引擎加载和被外界访问.

  2. 注册Servlet  

    在web.xml文件中,一个<servlet>元素用于注册一个Servlet,<servlet>元素中包含有两个主要的子元素:<servlet-name>和<servlet-class>,它们分别用于设置Servlet的注册名称和指定Servlet的完整类名

  JavaWeb开发之Servlet

  3. 映射Servlet

    在web.xml中,一个<servlet-mapping>元素用于映射一个已注册的Servle的一个对外访问路径,客户端将使用Servlet所映射的对外访问路径来访问此Servlet,而不是使用Servlet名称来访问Servlet. <servlet-mapping>元素中包含两个子元素:<servlet-name>和<url-pattern>,它们分别用于指定servlet的注册名称和设置Servlet对外访问路径.

  JavaWeb开发之Servlet

  其中,<servlet-name>子元素的设置值是在前面某个<servlet>元素的<servlet-name>子元素中设置的某个Servlet的注册名称,<url-pattrn>子元素中的访问路径必须以正斜杠(/)开头,这个正斜杠(/)表示当前web应用程序的根目录,而不是整个web站点的根目录. 路径名可以是多级的形式.

  同一个Servlet可以被映射到多个URL上,即多个<servlet-mapping>元素的<servlet-name>子元素的设置值可以是同一个servlet注册名.  在serlvet映射到URL上也可以使用通配符(*), 但是只能有两种固定的格式:一种是 "*.扩展名" ,在*前面不能有目录分隔符"/",例如."*.do"表示匹配以".do"结尾的所有URL; 另一种格式是以正斜杠 / 开头并以 /*结尾,例如,"/*" 表示匹配当前应用程序下所有的URL,"/action/*" 表示匹配当前应用程序下action子目录下的所有的URL.

  当Servlet引擎接受到一个请求时,它将采用最具体匹配原则来查找请求URL的映射,其中"*.扩展名"的匹配优先级最低.

  4.启动服务访问 http://localhost:8080/Demo1/servletA

  JavaWeb开发之Servlet

2.3 缺省Servlet

  如果某个Servlet的映射路径仅仅为一个斜杠(/),那么这个Servlet就称为当前web应用程序的缺省Servlet. 凡是在web.xml文件中找不到匹配的<servlet-mapping>元素的URL,他们的访问请求都将叫给缺省的servlet处理,也就是说,缺省的servlet用于处理所有其他servlet都不处理的访问请求. 在tomcat默认的web.xml中,注册了一个名为org.apache.catalina.servlets.DefaultServlet的Servlet,并将这个Servlet设置为了缺省Servlet.由于tomcat默认的web.xml对服务器上所有的web应用都有效,所以此服务器上所有的应用的缺省Servlet都是这个.

  当访问Tomcat服务器中的某个静态HTML文件和图片时,实际上是在访问这个缺省的Servlet,而这个缺省的Servlet的处理方式通常是把静态资源中的内容按字节原封不动的读出来,然后再按字节流原封不动的传递给客户端,并且生成一些响应消息头字段.例如,根据静态资源的扩展名获得MIME类型生成Content-Type头字段,根据静态资源的大小生成Content-Length头字段.

JavaWeb开发之Servlet

3. Servlet的特点及运行过程

  有了第一个Servlet的编写,配置和运行的经历后,理解Servlet的特点和运行过程就要容易的多了.

3.1 Servlet的特点

  Servlet是一个供其他Java程序(Servlet引擎)调用的java类,它不能单独运行. Servlet的运行完全由Servlet引擎来控制和调度. Servlet引擎是一种容器程序,他负责管理和维护所有Servlet对象的生命周期,因此也被称为Servlet容器或web容器. Servlet的加载,执行流程,以及如何接受客户端发送的数据和如何将数据传输到客户端等具体的底层事物,都是由Servlet引擎来实现的. Servlet引擎负责将客户端的请求消息转交给Servlet和将Servlet生成的响应消息返回给客户端. Servlet属于一种插件,它是一个提供了一定约定方法供容器调用的类,它只负责在自身的方法中接受并处理容器传递进来的数据,以及生成并返回给 容器去使用的数据和状态信息.

  Servlet最常见应用在于读取web浏览器传递给web服务器的参数和生成web服务器返回给web浏览器的动态网页文档内容; Servlet也能获取web浏览器发送的http请求消息中的各个请求头,和请求行信息,以及用于生成web服务器发送的http响应消息中的状态行和响应头; Servlet还能获取web服务器和Servlet引擎自身的一些环境和状态信息. Servlet程序的运行过程就是它与web引擎交互的过程,servlet程序从Servlet引擎那里获得访问请求信息,和一些运行环境信息,并生成响应消息给servlet引擎. Servlet程序只与web引擎打交道,它并不与web服务器和客户端进行任何直接的交互.

3.2 Servlet的运行过程

  Servlet引擎按照下面的过程来执行一个Servlet程序全过程:

     1. 接受到某个Servlet的HTTP请求之后,Servlet引擎首先检查是否已经装载并创建了该Servlet的实例对象. 如果已经装载并创建了Servlet的实例对象,Servlet引擎则直接执行第四步,否则执行第二步.

     2. 装载并创建Servlet的一个实例对象.

     3. 调用Servlet实例对象的init方法,以便执行Servlet的一些初始化工作.

     4. 创建用于封装HTTP请求消息 HttpServletRequest对象和代表一个HTTP响应消息的HttpServletResponse对象,然后调用Servlet的service方法将请求和响应对象作为参数传递进去.

     5.Servlet对象的service方法从请求对象中读取请求信息,处理完毕后,并向响应对象中写入响应头和响应体信息.

     6. service方法执行完毕后web容器从响应消息中读取信息.回送给客户端浏览器展示. 一次响应结束后,request和response变成垃圾等待被垃圾回收器回收.

    7. 在一个web应用程序被停止或重新启动之前,Servlet引擎将其卸载其中运行的Servlet. 再卸载Servlet之前,Servlet引擎将调用Servlet的destory方法,以便在这个方法中执行Servlet的一些清尾工作,例如释放资源等.Servlet引擎卸载某个Servlet之后,该Servlet实例对象变成垃圾,等待java虚拟机的垃圾回收器将其彻底从内存中清除.

  从以上步骤来看,web容器负责创建这些对象并 传递给Servlet程序,Servlet程序则使用这些对象,并调用他们的方法与web容器进行通信. Servlet程序要使用这些对象,必须知道这些对象所提供的方法约定,按照面向对象的松耦合模块化设计思想,只要将创建这些对象的类实现某一接口,Servlet程序就不需要知道该 类的具体名称,而只需要创建这些对象的类所实现的接口,即可知道这些对象所具有的方法并能对这些方法进行调用.

  Servlet API的主要作用就是定义了这些接口类,Servlet,Servlet容器与Servlet API三者之间的关系如下图

  JavaWeb开发之Servlet

  Servlet API中没有定义用于创建request和response对象的具体类,它里面只定义了创建这些对象的类所需要实现的接口,例如:HttpServletRequest和HttpServletResponse实际上都是接口类型,他们的实现则由各个web容器厂商去实现. 不管每个web容器厂商设计的用与创建request和response对象的类叫什么名称,Servlet程序并不需要知道它们的具体名称,而是把他们当做HttpServletRequest和HttpServletResponse这两个名称来对待,这样,Servlet程序就可以采用完全一样的方式来与各个厂家实现的web容器进行交互,一个web程序可以放在任何厂家实现的web容器中运行. 注意:虽然Servlet源程序用中引用的是Servlet API,但Servlet运行时真正调用的对象是Servlet容器中的实现类创建的! 

4. ServletConfig接口

  Servlet引擎将代表Servlet容器的对象和Servlet的配置信息参数信息一并封装到一个称谓ServletConfig的对象中,并在初始化Servlet实例对象时传递给该Servlet. ServletConfig接口则用于定义ServletConfig对象需要对外提供的方法,以便在Servlet程序中可以调用这些方法来获取有关信息.

  Servlet引擎装载并创建一个Servlet实例对象后,接着调用该实例对象的init(ServletConfig config)方法将ServletConfig对象传递给该Servelt.

4.1 ServletConfig接口主要方法

  1.getInitParamterNames方法

    在web.xml文件中可以为每个Servlet设置若干个初始化参数,getInitParamterNames方法用于返回一个Enumeration集合对象,该集合对象中包含web.xml中为当前Servlet设置的所有初始化参数的名称.

  2. getInitParmater方法

    getIniyParmater方法用于返回web.xml文件中为Servlet所设置的某个名称的初始化参数的值,如果指定名称的初始化参数不存在,则返回Null.

  3. getServletName方法

    此方法用于返回该Servlet在web.xml文件中配置的注册名称.

  4. getServletContext方法

    在servlet程序中,每个web程序都用一个各自的ServletContext对象来表示,ServletConfig对象中包含了ServletContext对象的引用,getServletContext方法用于返回ServletConfig对象中所包含的ServletContext对象

5. GenericServlet类与HttpServlet类

  GenericServlet是一个实现了Servlet的基本特征和功能的基类,其完整名称为:javax.servlet.GenericServlet. HttpServlet是GenericServlet的子类,其完整名称为:javax.servlet.http.HttpServlet,它提供了处理Http协议的基本架构. 如果一个Servlet要充分利用Http协议的功能,它就应该继承HttpServlet. HttpServlet类继承了GenericServlet类,而GenericServlet类又实现了Servlet和ServletConfig接口,所以在HttpServlet类及其子类中除了可以调用HttpServlet类的方法外,还可以调用包括Servlet,ServletConfig接口和GenericServlet类中定义的方法

5.1 init方法

  init方法在Servlet的生命期中仅执行一次,Servlet引擎创建Servlet实例对象后立即调用该方法,Servlet开发人员可以在这个方法中完成与构造方法类似的初始化功能. 构造方法是由java系统自动调用的,总是伴随着java对象的创建而发生,这是java语言的一个特性; init方法是在Servlet对象被创建后,再由Servlet引擎调用的方法,init方法的调用位于构造方法之后. Servlet引擎在调用init方法时,会传递一个包含Servlet的配置和运行环境的ServletConfig对象,Servlet接口中定义的init方法的语法格式为:

public void init(ServletConfig config) throws ServletException 

  可见,如果初始化代码中要使用ServletConfig对象,那么,这些初始化代码就只能在Servlet的init方法中编写,而不能在构造方法中编写. 如果init方法抛了异常,Servet引擎将卸载Servlet.

  在GenericServlet中还定义一个无参数的init方法,如下所示:

 public void init() throws ServletException

  GenericServlet中的这个无参数的init方法的方法体内没有编写任何代码,是一个空函数.GenericServlet实现的init(SevletCofnig config)方法中调用了这个无参数的init方法,所以,对于继承GenericServlet类的Servlet程序,也可以覆盖这个无参数的init方法来编写初始化代码,这样做的好处是省去了覆盖init(ServletConfig config)方法时总是要编写super.init(config)语句的麻烦.

  GenericServlet类进行这样的设计后,如果GenericServlet的子孙类要增加一些额外的初始化功能,它只需要覆盖无参数的init方法,而不必覆盖有参数的init(ServletConfig config)方法. 这样,Servlet容器在初始化由GenericServlet类派生的子类Servlet程序时,调用的仍然是GenericServlet的有参数的init(ServletConfig config)方法,但由于该方法最后调用了无参数的init方法,根据面向对象的多态性,这里调用的无参数的init()方法不再是GenericServlet自身的无参数init方法,而实际是子类中的init()方法. 因为子类的无参数init()方法执行前,Servlet容器已经调用了GenericServlet有参数的init(ServletConfig config)方法,所以在子类中覆盖无参数的init方法不需要调用super.init(config);语句来完成父类原来初始化功能,子类从GenericServlet类中继承的其他方法的功能仍然会保持完好无损.例如,getServletConfig()方法仍然可以返回ServletConfig对象.

5.2 service方法

  service方法是Servlet的核心方法,每当针对某个servlet的访问请求到达时,Servlet引擎就会调用该Servlet实例对象的servie方法来进行处理请求.  Servlet接口中定义的servicce方法的 语法格式为:

 public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException

  GenericServlet类没有对这个方法进行重写,HttpServlet类实现了这个方法. 由于Servlet接口中定义的servicce方法接受的参数类型分别为ServletRequest和ServletResponse,对于采用HTTP协议的访问请求,如果要在这个service方法内部调用HTTP消息的特有功能,也就是要调用 HttpServletRequest和HttpServletResponse类中定义的方法时,还需要将请求和响应对象的类型分别转换为HttpServletRequest和HttpServletResponse,如下所示

 @Override
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException { HttpServletRequest request;
HttpServletResponse response; try {
request = (HttpServletRequest) req;
response = (HttpServletResponse) res;
} catch (ClassCastException e) {
throw new ServletException("non-HTTP request or response");
}
service(request, response);
}

  为了简化这一转换的过程,HttpServlet类实现的service方法内部调用了另一个重载形式的service,重载的service定义格式为:

protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException

  在HttpServlet所实现的Servlet接口中定义的service方法内部,将请求和响应对象的类型转换为HttpServletRequest和HttpServletResponse类型后,再将它们作为参数传递给这个重载的service方法,如上所示

  如果在子类中覆盖这个重载的service方法,其接收的参数类型即为HttpServletRequest和HttpServletResponse,那么,在子类覆盖的service方法中就不再需要对这两个参数类型转换,如下

@Override
protected void service(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException {
  req.HttpServletRequest中定义的方法();
  resp.HttpServletResponse中定义的方法();
}

  由于servlet引擎与Servlet程序是按Servlet接口中约定的方法进行通信的,对于Servlet程序中的多个重载形式的service方法,Servlet引擎只会去调用Servlet接口中定义的那个service方法,而其他形式的service方法则则相当于Servlet引擎程序内部定义的普通方法,Servlet引擎根本不知道它们的存在.

5.3 destroy方法

  destroy方法在web容器卸装Servlet之前被调用,显然,该方法在Servlet的声明周期中也仅执行一次. 可以通过覆盖destroy方法来完成与init方法相反的功能,释放被该Servlet打开的资源.例如,关闭数据库连接和IO流.

5.4 getServletConfig方法

  getServletConfig方法用于返回Servlet引擎通过init方法传递进来的那个ServletConfig对象的引用.

5.5 getServletInfo方法

  getServletInfo方法用于返回Servlet的描述信息,Servlet引擎要获取某个Servlet的描述信息将调用这个方法. 如果有必要,可以对这个方法进行覆盖,以便返回Servlet的作者,版本号,版权等信息.

5.6 doXXX方法

  客户端可以用HTTP协议中规定的各种请求方式来访问Servlet,对于不同的请求方式,Servlet程序可能需要采用不同的方式进行处理. 不管客户端以哪种请求方式访问Servlet,Servlet引擎都将调用Servlet的service方法,service方法是处理所有请求方式的总入口.

  显然,如果要在service方法中对不同的请求方式进行不同的处理,那么首先必须判断的客户端的请求方式,然后通过选择语句对每种方式分别进行处理.HttpServlet类为每一种请求方式都定义了一个对应 doXxx方法,例如,与GET请求对应的doGet方法,与Post请求对应的doPost方法. HttpServlet中重载的service方法根据客户端的请求方式,分别调用与之对应的doXxx方法来完成具体的处理和响应细节,并将它接受的两个参数传递给该 doXxx方法. 下面是HttpServlet中定义的doXxx方法:

  • doGet        用于处理GET请求
  • doPost       用于处理POST请求
  • doHead      用于处理HEAD请求
  • doPut     用于处理PUT请求
  • doDelete     用于处理DELETE请求
  • doTrace   用于处理TRACE请求
  • doOptions   用于处理OPTIONS请求

  HttpServlet中的doXxx方法分别用于对客户端的相应请求方式进行处理,一个doXxx方法是专用于处理某种请求方式的分叉入口, 如果Servlet只想对某种或某几种请求方式进行处理,只需要覆盖这些方式各自对应的doXxx方法,而不用覆盖HttpServlet的servicec方法. 在一般情况下,Servlet只处理GET和POST这两种请求,也就是只需要doGet和doPost这两个方法.

6. ServletContext接口

  每个web程序都是一个独立的web容器,每个web程序分别用一个ServletContext对象来表示,ServletContext接口中定义了ServletContext对象需要对外提供的方法,Servlet程序通过这些方法与Servlet容器进行通信. Servlet引擎为每个web应用程序都创建了一个对应的ServletContext对象,ServletContext对象被包含在ServletConfig对象中,调用ServletConfig.getServletContext方法可以返回ServletContext对象的引用. 在Servlet容器初始化Servlet对象时,ServeltContext对象随着ServletConfig对象提供给Servlet. 与ServletAPI中的其他接口一样,ServletContext接口的实现类也是由Servlet引擎提供的.

6.1 获取web应用程序的初始化参数

  在web.xml文件中可以配置若干个此应用程序的初始化参数,ServletContext接口中定义了获得这些初始化参数信息的一些方法.

  为应用程序配置初始化参数的好处在于不需要修改Servlet源代码,就可以改变整个应用程序规范内的一些参数信息.

  getInitParameterNames()方法用于返回一个包含web应用程序的所有初始化参数的名称的Enumeration集合对象.

  getInitParameter(String param)方法用于返回 某个指定名称的初始化参数值,如果不存在此参数,则返回null;

  在web.xml中做如下配置:

  
<web-app>
.....
  <context-param>
<param-name>name</param-name>
<param-value>huage</param-value>
</context-param>
....
</web-app>

  在Servlet中获取配置的初始化参数

String name = getServletContext().getInitParameter("name");

6.2 application的域范围

  由于一个web应用程序中所有Servlet都共享同一个ServletContext对象,所以,ServletContext对象被称之为application对象(web应用程序对象). application对象(ServletContext对象)内部有一个哈希表集合对象,存储进application对象内哈希表集合对象中的每对关键字/值被称为application对象的属性. 由于一个web应用程序中的所有Servlet程序都共享同一个application对象,所以application对象的属性可以被该web应用程序内的所有Servlet程序访问,存储在application对象中的属性也被称为application域范围的属性,application域范围的属性可以被当做该web应用程序范围内的全局变量使用.

  ServletContext接口中定义了4个分别用于增加,删除,访问application域范围的属性的方法.

  •  getAttribute(String name)方法用于返回某个属性的值
  • removeAttribute(String name)方法用于删除某个属性
  • setAttribute(String name,String value) 用于增加一个属性. 如果设置的属性名已经存在,则用新的设置值换原来的设置值; 如果属性值设为null,则等效于使用removeAttribute方法

6.3 ServletContext接口的常用方法

  •  getResourcePaths(String path)  返回一个Set集合,该Set集合中包含某个资源目录中的所有子目录和文件的路径名称
  • getResource(String path)  返回映射到某个资源上的URL对象,传递给getResponse方法的参数必须是一个以"/"开头的资源路径名,"/"表示应用程序根目录
  • getResourceAsStream(String path) 返回连接到某个资源的InputStream对象.
  • getMajorVersion();  返回Servlet容器主版本号
  • getMinorVersion    返回Servlet容器次版本号
  • getMimeType()     返回某个文件对应的MIME类型

7. 总结

  传统的javaweb开发,Servlet占得比重还是相当大的,虽然现在已经有各种各样的框架进行了封装,但底层依然是使用Servlet技术实现的,在以后的 JSP学习中,Servlet知识也很重要,可以说Servlet是JSP的基础,精通Servlet原理是每一个想要深入javaweb开发的程序员所必需学习的,希望本文可以帮助到一些朋友.