1、第5章 Servlet编程,Servlet是Java Web程序的核心。JSP和几乎所有的Java Web框架(如Struts、Webwork)在底层的实现都会看到Servlet的影子。因此,充分了解Servlet的原理和使用方法,对于以后学习Struts等Web框架将起到非常大的帮助。本章我们将为大家介绍Servlet的基础知识,并通过具体的示例介绍Servlet的强大功能。,5.1 Servlet基础,Servlet在本质上就是Java类。编写Servlet需要遵循Java的基本语法,但是与一般Java类所不同的是。Servlet是只能运行在服务器端的Java类,而且必需遵循特殊的规范,在
2、运行的过程中有自己的生命周期。,5.1.1 什么是Servlet,Servlet是运行于服务器端的、按照其自身规范编写的Java应用程序。我们可以用图5.1来解释这个概念。Servlet的主要功能是用来接受、处理客户端请求,并把处理结果返回到客户端显示。其作用过程如图5.2所示。,5.1.2 Servlet的生命周期,Servlet需要在特定的容器中才能运行,在这里所说的容器即Servlet运行的时候所需的运行环境。一般情况下,市面上常见的Java Web Server都可以支持Servlet,例如Tomcat、Resin、Weblogic、WebSphere等,在本书中采用Tomcat作为S
3、ervlet的容器,由Tomcat为Servlet提供基本的运行环境。 Servlet的生命周期指的是Servlet从被Web服务器加载到它被销毁的整个生命过程。这个过程如图5.3所示。,5.1.2 Servlet的生命周期,从图5.3中我们呢可以看出,Servlet生命周期的执行大致分为4个步骤,如图5.4所示。在以上几个阶段中,Servlet对外提供服务阶段是最重要的。service()方法是编程人员真正要关心的方法。因为它才是Servlet真正开始响应客户端请求,并且处理业务逻辑的方法。service()接收到客户端请求后,再调用该Servlet的相应的方法去处理请求。所以程序员在编写自
4、己的Servlet时,一般只需要重写方法。在该方法中去处理客户端请求,并把处理结果返回。,5.2 简单Servlet开发配置示例,在这一节中我们主要应用Servlet编写一个HelloWorld程序,实现向客户端浏览器中输出“HelloWorld”信息。 在系统中创建的第一个Servlet程序系统会为我们自动生成web.xml配置文件,但是以后的Servlet程序就需要我们自己来配置了。即一般情况下都需要在当前应用项目的web.xml配置文件中对各个Servlet进行配置,其中web.xml文件的位置在当前项目应用的WEB-INF文件夹下。我们就结合图5.8的示例来讲解如何对Servlet进行
5、配置,如图5.9所示。,5.2 简单Servlet开发配置示例,总之,编写一个Servlet要经过以下三个步骤: (1)编写Servlet的功能代码,即实现功能的代码类。 (2)把编译成功的Servlet功能代码类文件拷贝到当前应用项目的WEB-INF/classes目录下。 (3)在当前应用项目的web.xml文件中对Servlet进行配置,即在web.xml中添加配置信息。 经过这样三个步骤我们就可以通过浏览器访问这个Servlet了。,5.3 使用HttpServlet处理客户端请求,HttpServlet是使用HTTP协议的Web服务器的Servlet类,这个类已经被系统定义好。该类的
6、一些方法,如doGet()方法、doPost()方法等,提供了处理客户端请求的接口。在实际编程中,程序员需要继承这个类,并重写上述方法,去编写自己的Servlet。使用重写后的方法,就可以完成对客户端请求进行处理。,5.3.1 处理Get请求doGet,doGet()方法是HttpServlet类中用来处理Get请求的方法。用户通过继承HttpServlet,重写doGet()方法,实现对客户端的Get请求进行处理。要调用doGet()方法,必须在客户端的表单里指定请求的类型为Get。doGet()方法的语法格式如图5.10所示。,5.3.2 处理Post请求doPost,doPost()是H
7、ttpServlet中用于处理Post请求的方法。如果要调用doPost()方法,必须在表单中指定Post请求。doPost()方法与doGet()方法的用法一般来说没什么区别,doGet()方法用于处理http get请求,doPost()方法用于外理http post请求。至于它们的不同,简单的说,get是通过http header来传输数据,有字数限制,而post则是通过http body来传输数据,没有字数的限制。doPost()方法的语法格式如图5.14所示。,5.3.2 处理Post请求doPost,下面我们来为大家介绍一下javax.servlet.http提供的HTTP Ser
8、vlet应用编程接口。创建Servlet,需要扩展HttpServlet类,HttpServlet类包含init()、destroy()、service()等方法,其中init()和destroy()方法是继承的。具体的方法及方法描述如表5.1所示。当服务器调用sevlet的Service()、doGet()和doPost()这三个方法时,均需要“请求”和“响应”对象作为参数。“请求”对象提供有关请求的信息,而“响应”对象提供了一个将响应信息返回给浏览器的一个路径。,5.4 JSP页面调用Servlet,在上面HelloWorld的示例程序中,我们直接在浏览器中输入具体的地址进行访问。在实际的
9、应用中,不可能让用户在浏览器中直接输入Servlet的地址进行访问。一般情况下,可以通过调用Servlet进行访问,在这里介绍通过提交表单和超链接两种方式调用Servlet。,5.4.1 通过表单提交调用Servlet,在通过提交表单调用Servlet的时候,只需要把表单的action指向对应的Servlet即可。,5.4.2 通过超链接调用Servlet,当用户有输入的内容需要提交给服务器时,我们可以用表单来调用Servlet。如果在没有输入的数据内容需要提交的情况下,我们可以直接通过超链接的方式来调用Servlet,并对其传递参数。,5.5 Servlet文件操作,在JSP的开发过程中,我
10、们常常把相关内容存储为文件。在Servlet中我们可以使用输入输出流实现对文件的读写。同时,使用Servlet还可以很方便的实现文件的下载操作。这一节我们就来学习如何实现Servlet的文件操作。,5.5.1 Servlet读取文件,我们举一个实例FileRead.java来读取一个文本文件content.txt的内容,并且在页面上打印文件的内容。,5.5.2 Servlet写文件,Servlet写文件的处理方法和读取文件的处理方法非常类似,即把文件输入流换成文件输出流。我们也可以来看一个写文件示例。,5.5.3 Servlet下载文件,利用Servlet可以很方便地实现文件的下载,我们只需要
11、对服务器的响应对象response进行简单的设置即可。,5.6 Servlet的应用,Servlet是与HTTP协议紧密结合的,使用Servlet几乎可以处理HTTP协议各个方面的内容,在本节的几个示例程序中,将集中展示Servlet在HTTP方面的具体应用。,5.6.1 获取请求信息头部内容,当用户访问一个页面的时候,会提交一个HTTP请求给服务器的Servlet引擎,在这个请求中包含了HTTP文件的详细属性信息。我们可以应用request.getHeaderNames()方法来获取请求信息头部内容。,5.6.2 获取请求信息,在上面的Servlet示例中,我们取出了HTTP文件头信息,在S
12、ervlet中还可以很方便取出用户发出请求对象自身的信息。这些信息是和用户的请求密切相关的,例如用户提交请求所使用的协议,客户提交表单的方法是POST还是GET等。,5.6.3 获取参数信息,有关用户请求的参数信息,也可以通过Servlet来获取。这种参数既包括以POST方法或者是GET方法提交的表单,也包括直接使用超链接传递的参数。Servlet都可以使用request.getParameter()方法取得这些参数信息并且加以处理。,5.6.4 Cookie操作,Cookie是一种在客户端保存信息的技术。读者在浏览网页时可能会注意到这样的现象,如在打开某个登录网页时,在第一次打开时,用户名文
13、本框是空的,当输入一个用户名,并成功登录后。在第二次打开这个登录网页时,在第一次输入的用户名会被自动填入这个用户名文本框,就算重启计算机后,仍然如此。其实这就是Cookie所起的作用。,5.6.4 Cookie操作,在Servlet中,使用java.servlet.http.Cookie类来封装一个Cookie消息,在HttpServletResponse接口中定义了一个addCookie方法来向浏览器发送Cookie消息(也就是Cookie对象),在HttpServletRequest接口中定义了一个getCookies方法来读取浏览器发送的Web服务器的所有Cookie消息。Cookie类
14、中定义了生成和提取Cookie消息的各个属性的方法。Cookie类只有一个构造方法,它的语法结构如图5.47所示。,5.6.4 Cookie操作,Cookie类中的其他常用方法如表5.3所示。,5.7 Session技术,session对象用来保存每个用户的用户信息和会话状态。session对象由服务器端自动创建,可以跟踪每个用户的操作状态。用户首次登录系统时服务器会自动给用户分配唯一标识的session id,可以用来区分开其他用户。相对于Cookie,session是存储在服务器端的会话,相对安全,而且其存储长度限制也大大的扩大了。,5.7.1 HttpSession接口方法,在Servl
15、et中使用HttpSession对象来描述Session。一个HttpSession对象就是一个Session。使用HttpServletRequest接口的getSession方法来获得一个HttpSession对象。 HttpSession接口中的主要方法如表5.4所示。,5.7.1 HttpSession接口方法,getSession是HttpServletRequest接口的方法,这个方法用于返回与当前请求相关的HttpSession对象,该方法有两种重载形式,它们的定义语法如图5.52所示。,5.7.2 通过Cookie跟踪Session,客户端必须通过一个SessionID才能找到
16、以前在服务端创建的某一个HttpSession对象。通过SessionID找HttpSession对象的过程也叫做Session跟踪。一般客户端的SessionID通过HTTP请求消息头的Cookie字段发送给服务端,然后服务端通过getSession方法读取Cookie字段的值,以确定是否需要新建一个HttpSession对象,还是获得一个已经存在的HttpSession对象,或是什么都不做,直接返回null。 当HttpSession对象是第一次创建时,向这个对象中写一个字符串值。如果HttpSession对象不是第一次创建,那么就将保存在HttpSession对象中的字符串值输出到客户端
17、。,5.7.3 通过重写URL跟踪Session,如果客户端浏览器不支持Cookie或是将Cookie功能关闭,那么就无法使用Cookie来传递SessionID。为了在这种情况下仍然可以使用Session,Servlet规范提供了一种补充会话管理机制。这种管理机制允许在Cookie无法工作的情况下使用URL参数来传递SessionID。 要想通过URL来发送SessionID,必须要重写URL。HttpServletResponse提供了两个方法用于重写URL,如图5.56所示。,5.8 Servlet过滤器,过滤器是小型的Web组件,它负责拦截请求和响应,以便查看、提取或以某种方式操作正在
18、客户机和服务器之间交换的数据。Servlet过滤器应用非常广泛,有拦截的地方一般都可以用到过滤器。当前Web应用中过滤器已经是不可或缺的部分之一。,5.8.1 过滤器的方法和配置,与过滤器相关的Servlet共包含3个简单的接口,分别是Filter、FilterChain及FilterConfig。要实现过滤器功能,必须先实现Filter接口。Filter接口定义了3个方法,如图5.61所示。Servlets过滤器是一个Web应用组件,和Servlet类似,也需要在Web应用配置文件(即web.xml)中进行配置部署。,5.8.1 过滤器的方法和配置,对于过滤器的映射配置,可以将过滤器映射到一
19、个或多个Servlet和JSP文件中。以Servlet为例,我们来看其映射配置,如图5.63所示。注意:在web.xml中配置Servlet和Servlet过滤器,应该先声明过滤器元素,再声明Servlet元素。,5.8.2 过滤器应用实例禁止未授权的IP访问站点,在实际的应用中,可能会遇到这样的情况,需要对某些IP进行访问限制,不让非法的IP访问应用系统,这个时候就需要用到过滤器进行限制,当一个用户发出访问请求的时候,首先通过过滤器进行判断,如果用户的IP地址被限制,就禁止访问,只有合法的IP才可以继续访问。,5.8.3 过滤器应用实例版权过滤器,现在的网页都会在尾部加上版权标志,对于这一操
20、作,我们可以运用过滤器很方便地实现它。,5.9 Servlet监听器,Servlet监听器是当今Web应用开发的一个重要组成部分。Servlet监听器主要用来对Web应用进行监听和控制,极大地增强了Web应用的事件处理能力。一般来说,Servlet监听就是指一些特殊的Servlet类,这些类可以监听Web应用的上下文信息、Servlet会话信息、Servlet请求信息。在实际操作中,程序员需要继承或实现一些已定义好的类或接口,从而编写出自己用于监听的类。这些类对特定的信息进行监听。一旦被监听的事件发生,这些类会自动调用相应的方法去执行指定的操作。,5.9.1 监听Servlet上下文信息,Se
21、rvlet上下文信息主要是指关于ServletContext接口的一些信息,比如ServletContext的创建和删除,Servlet属性的增加、删除和修改等。这样就可以实现对Servlet上下文信息的跟踪和记录。为了实现这样的功能,程序员需要实现ServletContextListener和ServletContextAttributeListener接口,从而编写出自己的Servlet类。ServletContext接口的主要方法如表5.4所示。,5.9.1 监听Servlet上下文信息,在使用这个监听器之前还需要对Web模块中的web.xml配置文件进行配置,配置代码如图5.75所示。
22、然后我们就可以编写一个JSP程序testListener.jsp来操作ServletContext的属性,看监听器程序做出什么反应。,5.9.2 监听HTTP会话信息,HTTP会话信息指的是Session对象的创建和销毁、会话中属性的设置请求、会话的状态和会话的绑定信息等。通过对HTTP会话信息的监听,可以进行一些很有用的操作,比如,统计当前会话的数目、设置某个对话的属性、了解某个对话的状态等。与ServletContext监听的实现方法类似,对HTTP会话的监听也是通过实现特定的接口来完成的。监听HTTP会话信息需要使用到三个接口类:HttpSessionListener、HttpSessi
23、onActivationListener和HttpSessionAttributeListener接口。,5.9.2 监听HTTP会话信息,这些接口的主要方法如表5.5所示。,5.9.3 对客户端请求进行监听,客户端请求信息是指请求对象的创建、销毁以及其属性的添加、更改和删除。一旦可以对客户端发向服务器的请求进行监听,就可以对它们进行识别,然后统一处理。对客户端请求信息的监听的实现方法与上面两种类似,通过实现ServletRequestListener和ServletRequestAttributeListener接口来完成。这些接口的主要方法如表5.6所示。,5.10 小结,本章首先介绍了Servlet编程方面的基础知识,然后在此基础上介绍了Servlet的配置和处理方法,接着我们为大家讲解了如何利用JSP页面调用Servlet和有关Servlet的文件操作,最后我们通过实例讲解了Servlet的具体应用和过滤器、监听器的知识。本章的重点是Servlet的文件操作以及Servlet应用方面的知识,难点是难点是Session技术以及Servlet过滤器、监听器知识的理解和应用。熟练掌握Servlet是学好Java Web技术的基本要求,所以读者要多加练习,以打好基础。,