第3章 Servlet基础

目录

3.1 Servlet 概述

3.2 Servlet 开发入门

3.2.1 Servlet 接口及其实现类

3.2.2 实现第一个Servlet程序

3.2.3 Servlet的生命周期

1.初始化阶段

2.运行阶段

3.销毁阶段

自动加载Servlet程序

3.3 Servlet应用——HttpServlet类

HttpServlet中的doGet()和doPost()方法

【任务3-2】实现Servlet虚拟路径的映射

1.Servlet的多重映射

2.Servlet映射路径中使用通配符

3.缺省Servlet

3.4 ServletConfig和ServletContext

3.4.1 ServletConfig接口

3.4.2 ServletContext接口

1.获取Web应用程序的初始化参数

2.实现多个Servlet对象共享数据

3.读取Web应用下的资源文件


常见的动态Web开发技术:ASP、PHP、JSP和Servlet

Sun公司:Servlet、JSP

3.1 Servlet 概述

Servlet是使用Java语言编写的运行在服务器端的程序。狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。Servlet主要用于处理客户端传来的HTTP请求,并返回一个相应,它能够处理的请求有doGet()和doPost()等方法。

Servlet由Servlet容器提供,所谓的Servelt容器是指提供了Servlet功能的服务器(本书中指Tomcat),Servlet容器将Servlet动态地加载到服务器上。与HTTP协议相关的Servlet使用HTTP请求和HTTP响应与客户端进行交互。因此,Servlet容器支持所有HTTP协议的请求和响应。Servlet应用程序的体系结构如下

在图3-1中,Servlet的请求首先会被HTTP服务器(如Apache)接收,HTTP服务器只负责静态HTML页面的解析,对于Servlet的请求转交给Servlet容器,Servlet容器会根据web.xml文件中的映射关系,调用相应的Servlet,Servlet将处理的及结果返回给Servlet容器,并通过HTTP服务器将响应传输给客户端。
        Servlet技术具有如下特点:

  • 方便:Servlet提供了大量的实用工具例程,如处理很难完成的HTML表单数据、读取和设置HTTP头,以及处理Cookie和跟踪会话等。
  • 跨平台:Servlet用Java类编写,可以在不同操作系统平台和不同应用服务器平台下运行。
  • 灵活性和可扩展性:采用Servlet开发的Web应用程序,由于Java类的继承性及构造函数等特点,使得应用灵活,可随意扩展
  • 功能强大、能够在各个程序之间数据共享、安全性强

3.2 Servlet 开发入门

3.2.1 Servlet 接口及其实现类

针对Servlet技术的开发,SUN公司提供了一系列接口和类,其中,最重要的接口是javax.servlet.Servlet。Servlet接口的抽象方法如下

init()、service()、destroy()这3个方法可以表现Servlet的生命周期,它们会在某个特定的时刻被调用。另外,getServletInfo()方法用于返回Servlet的相关信息。getServletConfig()方法用于返回ServletConfig对象,该对象包含Servlet的初始化信息。需要注意的是,表中提及的Servlet容器指的是Web服务器。

针对Servlet的接口,SUN公司提供了两个默认的接口实现类:GenericServlet和HttpServlet。GenericServlet是一个抽象类,该类为Servlet接口提供了部分实现,它并没有实现HTTP请求处理。HttpServlet是GenericServlet的子类,他继承了GenericServlet的所有方法,并为HTTP请求中的POST、GET等类型提供了具体的操作方法

通常情况下,编写的Servlet类都继承自HttpServlet,在开发中使用的具体的Servlet对象就是HttpServlet对象。HttpServlet的常用方法即其说明如下

3.2.2 实现第一个Servlet程序

(1)创建Servlet文件

package cn.itcast.firstapp.servlet;
import java.io.*;
import javax.servlet.*;
public class HelloWorldServlet extends GenericServlet {
    public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
        //得到输出流PrinterWriter对象,Servlet使用输出流来产生响应
        PrintWriter out = response.getWriter();
        //使用输出流对象向客户端发送字符数据
        out.println("Hello World");
    }
}

HelloWorldServlet类继承GenericServlet后,只实现了service()方法。这是因为GenericServlet类除了Servlet接口的service()方法外,其他方法都已经实现。由此可见,继承GenericServlet类比实现Servlet接口更加简便。

(2)引入Servlet的JAR包

(3)编译Servlet

(4)将编译后的.class文件添加到服务器

(5)创建web.xml文件

在上面的配置信息中,元素<servlet>用于注册Servlet,它的两个子元素<servlet-name>和<servlet-class>分别用来指定Servlet名称及其完整类名。元素<servlet-mapping>用于映射Servlet对外访问的虚拟路径,它的子元素<servlet-name>的值必须和<servlet>元素中<servlet-name>相同,子元素<url-pattern>则是用于指定访问该Servlet的虚拟路径,该路径以正斜线(/)开头,代表当前Web应用程序的根目录

(6)运行服务器,查看结果

3.2.3 Servlet的生命周期

1.初始化阶段

当客户端向Servlet容器发出HTTP请求要求访问Servlet时,Servlet容器首先会解析请求,检查内存中是否已经有了该Servlet对象,如果有直接使用该Servlet对象,如果没有就创建Servlet实例对象,然后通过调用init()方法实现Servlet的初始化工作。在Servlet的整个生命周期内,它的init()方法只被调用一次

2.运行阶段

在这个阶段,Servlet容器会为这个请求创建代表HTTP请求的ServletRequest对象和代表HTTP响应的ServletResponse对象,然后将他们作为参数传递给Servlet的service()方法。service()方法从ServletRequest对象中获得客户请求信息并处理该请求,通过ServletResponse对象生成响应结果。在Servlet的整个生命周期内,对于Servlet的每一次访问请求,Servlet容器都会调用一次Servlet的service()方法,并且创建新的ServletRequest和ServletResponse对象,也就是说,service()方法在Servlet的整个生命周期中会被调用多次

3.销毁阶段

当服务器关闭或Web应用被移出容器时,Servlet随着Web应用的销毁而销毁。在销毁Servlet之前,Servlet容器会调用Servlet的destory()方法,以便让Servlet对象释放它所占用的资源。在Servlet的整个生命周期中,destory()方法也只被调用一次。Servlet对象一旦创建就会驻留在内存中等待客户端的访问,直到服务器关闭,或Web应用被移除出容器时,Servlet对象才会被销毁

<load-on-startup>元素是<servlet>元素的一个子元素,它用于指定Servlet被加载的时机和顺序。在<load-on-startup>元素中,设置的值必须是一个整数。如果这个值是一个负数,或者没有设定这个元素,Servlet容器将在客户端首次请求这个Servlet时加载它;如果这个值是正整数或0,Servlet容器将在Web应用启动时加载并初始化Servlet,并且<load-on-startup>的值越小,它对应的Servlet就越先被加载。

自动加载Servlet程序

当启动一个Web项目时,如果首先需要对数据库信息进行初始化。这时,只需要使用web.xml文件中<load-on-startup>元素,将初始化数据库的Servlet配置为随着Web应用启动而启动的Servlet即可。<load-on-startup>元素是<servlet>元素的一个子元素,它用于指定Servlet被加载的时机和顺序。在<load-on-startup>元素中,设置的值必须是一个整数。如果这个值是一个负数,或者没有设定这个元素,Servlet容器将在客户端首次请求这个Servlet时加载它;如果这个值是正整数或者0,Servlet容器将在Web应用启动时加载并初始化Servlet,并且<load-on-startup>的值越小,它对应的Servlet就越先被加载

3.3 Servlet应用——HttpServlet类

由于大多数Web应用都是通过HTTP协议和客户端进行交互,因此,在Servlet接口中,提供了一个抽象类javax.servlet.http.HttpServlet,它是GenericServlet的子类,专门用于创建应用于HTTP协议的Servlet。HttpServlet类的源代码片段如下

通过分析HttpServlet的源代码片段,发现HttpServlet主要有两大功能。第一是根据用户请求方式的不同,定义相应的doXxx()方法处理用户请求。例如,与GET请求方式对应的doGet()方法,与POST方式对应的doPost()方法。第二是通过service()方法将HTTP请求和响应分别强转为HttpServletRequest和HttpServletReponse类型的对象

由于HttpServlet类在重写的service()方法中,为每一种HTTP请求方式都定义了对应的doXxx()方法,因此,当定义的类继承HttpServlet后,只需根据请求方式,重写对应的doXxx()方法即可,而不需要重写service()方法。

HttpServlet中的doGet()和doPost()方法

(1)在目录“D:\cn\itcast\firstapp\servlet”下编写RequestMethodServlet类,并且通过继承HttpServlet类,实现doGet()和doPost()方法的重写,如文件3-3所示。

(2)在Tomcat中chapter03目录的web.xml中配置RequestMethodServlet的映射路径,配置信息如下所示。

(3)编译RequestMethodServlet.java文件,并将编译后生成的RequestMethodServlet.class文件拷贝到Tomcat安装目录下的webapps\chapter03\WEB-INF\classes文件中。

(4)采用GET方式访问RequestMethodServlet。启动Tomcat服务器,在浏览器的地址栏中输入地址“http://localhost:8080/chapter03/RequestMethodServlet”,浏览器显示的结果如图3-13所示。

(5)采用POST方式访问RequestMethodServlet。在目录webapps\chapter03下编写一个名为form.html的文件,并将表单的提交方式设置为POST,如文件3-4所示。

(6)启动Tomcat服务器,在浏览器的地址栏中输入地址“http://localhost:8080/chapter03/form.html”访问form.html文件,浏览器显示的结果如图3-14所示。

单击【提交】按钮,浏览器界面跳转到RequestMethodServlet,显示的结果如图3-15所示。

从图3-15中可以看出,浏览器显示出了“this is doPost method”语句。由此可见,采用POST方式请求Servlet时,会自动调用doPost()方法。

需要注意的是,如果GET和POST请求的处理方式一致,则可以在doPost()方法中直接调用doGet()方法,具体示例如下。

【任务3-2】实现Servlet虚拟路径的映射

【任务目标】

在web.xml文件中,一个<servlet-mapping>元素用于映射一个Servlet的对外访问路径,该路径也称为虚拟路径。例如HelloWorldServlet所映射的虚拟路径为“/HelloWorldServlet”。创建好的Servlet只有映射成虚拟路径,客户端才能对其进行访问。但是,在映射Servlet时,还有一些细节问题需要学习,比如Servlet的多重映射、在映射路径中使用通配符、配置缺省的Servlet等。

【实现步骤】

1.Servlet的多重映射

Servlet的多重映射指的是同一个Servlet可以被映射成多个虚拟路径。也就是说,客户端可以通过多个路径实现对同一个Servlet的访问。Servlet多重映射的实现方式有两种,具体如下。

(1)配置多个<servlet-mapping>元素

在浏览器的地址栏中输入地址“http://localhost:8080/chapter03/TestServlet01”访问TesstServlet01,浏览器的显示结果如下

地址“http://localhost:8080/chapter03/Test01”

(2)在一个<servlet-mapping>元素下配置多个<url-pattern>子元素

在web.xml文件中对TestServlet01虚拟路径的映射进行修改,修改后的代码如下所示

地址“http://localhost:8080/chapter03/TestServlet01”

地址“http://localhost:8080/chapter03/Test02”

2.Servlet映射路径中使用通配符

3.缺省Servlet

3.4 ServletConfig和ServletContext

3.4.1 ServletConfig接口

在Servlet运行期间,经常需要一些辅助信息,例如,文件使用的编码、使用Servlet程序的共享等,这些信息可以在web.xml文件中使用一个或多个<init-param>元素进行配置。当Tomcat初始化一个Servlet时,会将该Servlet的配置信息封装到一个ServletConfig对象中,通过调用init(ServletConfig config)方法将ServletConfig对象穿递给Servlet。ServletConfig定义了一系列获取配置信息的方法,如下

getInitParameter()方法的使用

(1)在chapter03项目的web.xml文件中为Servlet配置一些参数信息,具体的配置代码如下

(2)在cn.itcast.servlet包中编写TestServlet02类,用于读取web.xml文件中的参数信息,代码如下

(3)启动Tomcat服务器,在浏览器的地址栏中输入地址“http://localhost:8080/chapter03/TestServlet02”访问TestServlet02,结果如下

3.4.2 ServletContext接口

当Servlet容器启动时,会为每个Web应用创建一个唯一的ServletContext对象代表当前Web应用,该对象不仅封装了当前Web应用的所有信息,而且实现了多个Servlet之间数据的共享。ServletContext接口的不同作用如下

1.获取Web应用程序的初始化参数

在web.xml文件中,不仅可以配置Servlet的初始化信息,还可以配置整个Web应用的初始化信息。Web应用初始化参数的配置方式具体如下所示。

要想获取这些参数信息,可以使用ServletContext接口,该接口中定义的getInitParameterNames()和getInitParameter(String name)方法分别用来获取参数名和参数值。

接下来,通过一个案例来演示如何使用ServletContext接口获取Web应用程序的初始化参数。

(1)在chapter03项目的web.xml文件中,配置初始化参数信息和Servlet信息,代码如下

(2)在项目的cn.itcast.servlet包中,创建一个名称为TestServlet03的类,该类中使用ServletContext接口来获取web.xml中的配置信息,如下

(3)在Eclipse中启动Tomcat服务器,在浏览器的地址栏中输入地址“http://localhost:8080/chapter03/TestServlet03”访问TestServlet03,结果如下

2.实现多个Servlet对象共享数据

由于一个Web应用中的所有Servlet共享同一个ServletContext对象,因此,ServletContext对象的域属性可以被该Web应用中的所有Servlet访问。在ServletContext接口中定义了分别用于增加、删除、设置ServletContext域属性的4个方法,如下

在chapter03项目的cn.itcast.servlet包中创建两个Servlet类TestServlet04和TestServlet05,这两个Servlet类中分别使用了ServletContext接口中的方法设置和获取属性值,代码如下

首先在浏览器输入地址“http://localhost:8080/chapter03/TestServlet04”访问TestServlet04,将数据存入ServletContext对象,然后在浏览器的地址栏中输入地址“http://localhost:8080/chapter03/TestServlet05”访问TestServlet05,浏览器的显示结果如下

3.读取Web应用下的资源文件

在实际开发中,有时候可能会需要读取Web应用中的一些资源文件,比如配置文件、图片等。为此,在ServletContext接口中定义了一些读取Web资源的方法,这些方法是依靠Servlet容器来实现的。Servlet容器根据资源文件相对于Web应用的路径,返回关联资源的IO流、资源文件在文件系统的绝对路径等。ServletContext接口中用于获取资源路径的相关方法如下

(1)创建一个资源文件。

将创建的资源文件命名为itcast.properties,并且选择存放的目录为src目录。在创建好的itcast.properties文件中,输入如下所示的配置信息

(2)编写读取itcast.properties资源文件的Servlet。在cn.itcast.servlet包中创建一个名称为TestServlet06的Servlet类,该类的实现代码如下

使用ServletContext的getResourceAsStream(String path)方法获得了关联itcast.properties资源文件的输入流对象,其中path参数必须以正斜线“/”开始,表示itcast.properties文件相对于Web应用的相对路径。

(3)启动Tomcat服务器,在浏览器的地址栏中输入地址“http://localhost:8080/chapter03/TestServlet06”访问TestServlet06,结果如下

(4)有的时候,开发者需要获取的是资源的绝对路径。对文件TestServlet06.java进行修改,通过使用getRealPath(String path)方法获取资源文件的绝对路径,修改后的代码文件如下

(5)启动Tomcat服务器,在浏览器的地址栏中再次输入地址“http://localhost:8080/chapter03/TestServlet06”访问TestServlet06,同样可以看到图中显示的内容。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JSP初学者用书 很不错的一本书 第1 servlet和jsp技术概述 1.1 servlet的功用 1.2 要动态构建网页的原因 1.3 servlet代码初探 1.4 servlet相对于“传统”cgi的优点 1.5 jsp的作用 第1部分 servlet技术 第2 服务器的安装和配置 2.1 下载和安装java软件开发工具包 2.2 为桌面计算机下载服务器 2.3 服务器的配置 2.4 配置apachetomcat 2.5 配置macromediajrun 2.6 配置cauchoresin 2.7 建立开发环境 2.8 测试系统的设置 2.9 实现简化的部署方法 2.10 默认web应用的部署目录:汇总 2.11 web应用:预览 第3 servlet基础 .3.1 servlet的基本结构 3.2 生成纯文本的servlet 3.3 生成html的servlet 3.4 servlet的打包 3.5 简单的html构建工具 3.6 servlet的生命周期 3.7 singlethreadmodel接口 3.8 servlet的调试 第4 客户请求的处理:表单数据 4.1 表单数据的作用 4.2 在servlet中读取表单数据 4.3 示例:读取3个参数 4.4 示例:读取所有参数 4.5 参数缺失或异常时默认值的应用 4.6 过滤字符串中的html特殊字符 4.7 根据请求参数自动填充java对象:表单bean 4.8 当参数缺失或异常时重新显示输入表单 第5 客户请求的处理:http请求报头 5.1 请求报头的读取 5.2 制作所有请求报头的表格 5.3 了解http1.1请求报头 5. 4 发送压缩web页面 5.5 区分不同的浏览器类型 5.6 依据客户的到达方式定制页面 5.7 标准cgi变量的访问 第6 服务器响应的生成:http状态代码 6.1 状态代码的指定 6.2 http1.1状态代码 6.3 将用户重定向到浏览器相关页面的servlet 6.4 各种搜索引擎的一个前端 第7 服务器响应的生成:htip响应报头 7.1 在servlet中设置响应报头 7.2 理解http1.1响应报头 7.3 构建excel电子表格 7.4 servlet状态的持续以及页面的自动重载 7.5 使用servlet生成jpeg图像 第8 cookie管理 8.1 cookie的优点 8.2 cookie存在的一些问题 8.3 cookie的删除 8.4 cookie的发送和接收 8.5 使用cookie检测初访者 8.6 使用cookie属性 8.7 区分会话cookie与持续性cookie 8.8 基本的cookie实用程序 8.9 实际使用cookie实用程序 8.10 修改cookie的值:记录用户的访问计数 8.11 使用cookie记录用户的偏好 第9 会话跟踪 9.1 会话跟踪的需求 9.2 会话跟踪基础 9.3 会话跟踪api 9.4 浏览器会话与服务器会话 9.5 对发往客户的url进行编码 9.6 显示客户访问计数的servlet 9.7 累计用户数据的列表 9.8 拥有购物车和会话跟踪功能的在线商店 第ii部分 jsp技术 第10 jsp技术概述 10.1 对jsp的需求 10.2 jsp的好处 10.3 jsp相对于竞争技术的优势 10.4 对jsp的误解 10.5 jsp页面的安装 10.6 基本语法 第11 用jsp脚本元素调用java代码 11.1 模板文本的创建 11.2 在jsp中调用java代码 11.3 限制jsp页面中java代码的量 11.4 jsp表达式的应用 11.5 示例:jsp表达式 11.6 servlet和jsp页面的对比 11.7 编写scriptlet 11.8 scriptlet示例 11.9 使用scriptlet将jsp页面的某些部分条件化 11.10 使用声明 11.11 声明的例子 11.12 使用预定义变量 11.13 jsp表达式、scriptlet和声明的比较 第12 控制所生成的servlet的结构:jsppage指令 12.1 import属性 12.2 contenttype和pageencoding属性 12.3 条件性地生成excel电子表格 12.4 session属性 12.5 iselignored属性 12.6 buffer和autoflush属性 12.7 info属性 12.8 errorpage和iserrorpage属性 12.9 isthreadsafe属性 12.10 extends属性 12.11 language属性 12.12 指令的xml语法 第13 在jsp页面中包含文件和applet 13.1 在请求期间包含页面:jsp:include动作 13.2 在页面转换期间包含文件:include指令 13.3 使用jsp:forward转发请求 13.4 包含使用java插件的applet 第14 javabean组件在jsp文档中的应用 14.1 使用bean的原因 14.2 bean是什么 14.3 bean的应用:基本任务 14.4 示例:stringbean 14.5 设置bean的属性:高级技术 14.6 共享bean 14.7 共享bean的4种方式:示例 第15 servlet和jsp的集成:模型—视图—控制器构架 15.1 mvc的需求 15.2 用request dispatcher实现mvc 15.3 mvc代码汇总 15.4 目的页面中相对url的解释 15.5 mvc的应用:银行账户余额 15.6 3种数据共享方式的对比 15.7 从jsp页面转发请求 15.8 包含页面 第16 简化对java代码的访问:jsp 2.0表达式语言 16.1 应用el的驱动力 16.2 表达式语言的调用 16.3 阻止表达式语言的求值 16.4 阻止标准脚本元素的使用 16.5 访问作用域变量 16.6 访问bean的属性 16.7 访问集合 16.8 引用隐式对象 16.9 表达式语言中运算符的应用 16.10 表达式的条件求值 16.11 表达式语言其他功能概览 第ⅲ部分 支持技术 第17 数据库访问:jdbc 17.1 jdbc应用概述 17.2 基本jdbc示例 17.3 用jdbc实用工具简化数据库访问 17.4 使用预备语句 17.5 创建可调用语句 17.6 使用数据库事务 17.7 使用orm框架将数据映射到对象 第18 配置msaccess,mysql和oracle9i 18.1 配置microsoftaccess与jdbc的使用 18.2 mysql的安装和配置 18.3 oracle9i数据库的安装和配置 18.4 通过jdbc连接来测试数据库 18.5 建立music表 第19 html表单的创建和处理 19.1 html表单如何传输数据 19.2 form元素 19.3 文本控件 19.4 按钮 19.5 复选框和单选按钮 19.6 组合框和列表框 19.7 文件上载控件 19.8 服务器端图像映射 19.9 隐藏域 19.10 控件组 19.11 制表次序 19.12 用于调试的web服务器 附录 服务器的组织与结构

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值