Servlet第一章:Java Servlet介绍

Servlet第一章:Java Servlet介绍

一、Servlet概念

当我们使用账号密码登录网站时,网站使用服务器端程序接受并验证登录信息。这些服务器端程序是用不同的服务器端 技术编写的,如公共网关接口(CGI)、Active Server Pages (ASP) 及 servlet。

CGI 脚本是用 C、C++、或 Perl 等编程语言编写的。在应用服务器使用 CGI 脚本处理客户机请求 的情况下,服务器创建单独的 CGI 脚本实例来处理请求。因此,多个请求并发时会影响服务器的效 率。

ASP 是一种允许开发人员在同一个页面中结合使用 HTML 和脚本语言的服务器端技术。ASP 对象 是多线程对象,因而能同时服务多个请求。其限制在于不能与所有商业 Web 服务器兼容。

servlet 是用 Java 编写的服务器端程序。与 CGI 脚本不同,servlet 初始化代码只执行一次。此 外,每个客户机请求由服务器中单独的线程处理。这样就避免了创建不必要的进程,从而增强了服 务器的性能。另外,servlet 还继承了 Java 编程语言的所有功能。例如,与所有标准 Java 类一 样,servlet 独立于平台,可跨不同的操作系统使用。同样,servlet 还可以利用 Java 的大量功 能,如网络连接、多线程、Java 数据库连接 (JDBC)、国际化、远程方法调用 (RMI) 等。

1.Java Servlet技术

servlet 可用于扩展应用服务器的功能,以便在应用程序中生成动态内容。除继承 Java 的所有功能 外,servlet 还有以下功能:

  • 安全性:由 Web 容器提供运行时环境来执行 servlet。servlet 继承了 Web 容器提供的安 全功能。这样开发人员可以集中关注 servlet 的功能,而把安全问题留给 Web 容器处理
  • 会话管理:该机制可跨多个请求跟踪用户的状态。会话可跨多个请求维护用户的身份和状 态。
  • 实例持久性:servlet 有助于避免频繁地访问磁盘,从而增强了服务器的性能。例如,如果登录到某网上银行网站上,客户可以进行查询余额或申请贷款等操作。每个阶段都要通过数据 库验证客户的账户号码。servlet 并不每次都根据数据库验证账户号码,而是将账户号码保留在内存中,直到用户退出网站

要访问 servlet,首先需要编译 servlet,然后将 servlet 的类文件部署到已启用 Java 的应用服务器中,如Tomcat服务器、 Sun Java System Application Server。Sun Java System Application Server 提供一个用于管理 HTML 页面和 servlet 等各种 Web 应用程序组件的 Web 容器。Web 容器为 servlet 的运行提供了运行环境。Web 容器可提供 Web 应用程序所要求的各种服务,例如:

  • 管理 servlet 生命周期中的各个阶段,如初始化 servlet 实例、处理客户机请求及从服务中 删除 servlet 实例。
  • 定义安全限制,限定只有授权用户才能访问所部署的 servlet。
  • 在 servlet 需要从 SQL Server 2000 等数据库中读取和写入数据时管理数据库事务。
  • 在实例池中创建和删除 servlet 实例,以便服务多个请求

2.Servlet的工作原理

客户机为了某特定 servlet 向 Tomcat服务器 发送请求时,Tomcat服务器将请求传送给 Web 容器。Web 容器检查是否存在所请求的 servlet 的实例。

  • 如果存在 servlet 实例,Web 容器把请求委托给 servlet,由该 servlet 处理该客户机请 求并返回响应。
  • 如果不存在 servlet 实例,Web 容器查找并加载 servlet 类,然后创建并初始化该 servlet 的实例。初始化完成后,servlet 实例开始处理请求。Web 容器将 servlet 生成的响应传送给客户机。

下图显示了Tomcat服务器与Web容器间的交互

image-20221026224601457

下图显示了首次收到客户机请求时 Web 容器执行的任务。

image-20221026224657943

二、Servlet类层次结构和生命周期方法

Web 容器通过调用各种生命周期方法管理 servlet。这些方法在 Servlet API 中定义。Servlet API 是一个可用于开发 servlet 的类和接口的集合。这些类和接口在 javax.servlet 和 javax.servlet.http 包中封装。

1、Servlet 类的层次结构

Servlet 接口是 servlet 类层次结构的根接口。所有 servlet 都需要直接或间接地实现 Servlet 接口。Servlet API 的 GenericServlet 类实现 Servlet 接口。除 Servlet 接口 外,GenericServlet 类还实现 Servlet API 的 ServletConfig 接口和标准 java.io 包的 Serializable 接口(序列化)。Web 容器用 ServletConfig 接口的对象在配置信息初始化时将配置信息传送给 servlet。

要开发使用 HTTP 通信的 servlet,需要在 servlet 中扩展 HttpServlet 类。HttpServlet 类 扩展了 GenericServlet 类,并提供内置 HTTP 功能。例如,HttpServlet 类提供了使 servlet 能够处理通过特定 HTTP 方法收到的客户机请求的方法。

下图显示了 javax.servlet 和 javax.servlet.http 包中接口和类层次结构的高层设计。

image-20221026224720727

1.1javax.servlet.Servlet 接口

javax.servlet 包的 Servlet 接口定义了 Web 容器管理 Servlet 生命周期需要调用的方法。 下表列出了 javax.servlet.Servlet 接口的各种方法。

方法描述
public void destroy()Web 容器在将 servlet 实例从服务中删除之前,调用 destroy() 方法 。
public ServletConfig getServletConfig()此方法返回包含初始化参数等配置信息 的 ServletConfig 对象,以便初始化 servlet。
public String getServletInfo()此方法返回包含作者、版本、版权等 servlet 相关信息的字符串。
public void init(ServletConfig config) throws ServletExceptionWeb 容器创建 servlet 实例后调用此方法。
1.2javax.servlet.ServletConfig 接口

servlet 初始化期间,通过 Web 容器实现 javax.servlet.ServletConfig 接口,以便将配置信息传送给 servlet。Web 容器通过将 ServletConfig 类的对象传送至 servlet 的 init() 方法来初始化该 servlet。ServletConfig 对象包含初始化信息并提供对 ServletConfig 对象的访问。

初始化参数都是名称 - 值对,用于向 servlet 传送信息。例如,可以指定一个 JDBC URL 作为 servlet 的初始化参数。servlet 初始化时,可利用该 URL 值获取数据库连接。ServletContext 接口的对象使 servlet 能够与托管该 servlet 的 Web 容器通信

下表列出了 javax.servlet.ServletConfig 接口的一些方法。

方法描述
public String getInitParameter(String param)返回包含初始化参数值的 String 对象,或者如果参数不存在,则返回 null。
public Enumeration getInitParameterNames()以String 对象枚举的形式返回所有初始化参数 的名称。如果未定义任何初始化参数,则返回空枚举。
public ServletContext getServletContext()返回 servlet 的 ServletContext 对象,以便 与 Web 容器交互。

2.Servlet的生命周期方法

javax.servlet.Servlet 接口定义了 servlet 的生命周期方法,如 init()、service() 及 destroy()。Web 容器在 servlet 的生命周期中调用其 init()、service() 及 destroy() 方法。Web 容器按以下顺序调用 servlet 的生命周期方法:

  1. Web 容器载入 Servlet 类并创建一个或多个该 Servlet 类的实例。

  2. Web 容器在 servlet 初始化期间调用 Servlet 实例的 init() 方法。Servlet 生命周期 中只调用一次 init() 方法。

  3. Web 容器调用 service() 方法,以便 servlet 处理客户机请求。

  4. service() 方法处理请求并向 Web 容器返回响应。

  5. 随后 servlet 等待接收并处理后续请求,如步骤 3 和 4 所述。

  6. Web 容器在将 Servlet 实例从服务中删除前调用 destroy() 方法。Servlet 生命周期中 只调用一次 destroy() 方法。

2.1init() 方法

在 Servlet 生命周期的初始化阶段调用 init() 方法。Web 容器首先将所请求的统一资源定位符 (URL)映射到 Web 容器中可用的对应 servlet 上,再将 servlet 实例化;然后创建 ServletConfig 接口的对象,所述对象包含 servlet 的初始化参数等启动配置信息;最后调用 servlet 的 init() 方法并将 ServletConfig 对象传送给该 servlet。

如果 Web 容器无法初始化 servlet 资源, init() 方法将引发 ServletException 异常。 servlet 初始化将在接受任何客户机请求前完成。以下代码段显示了 init() 方法:

public void init (ServletConfig config) throws ServletException 

以下代码段显示了用于初始化 servlet 的 Java Servlet init() 方法

public class ServletLifeCycle extends HttpServlet 
{ 
 static int count; 
public void init (ServletConfig config) throws ServletException 
{ 
 count=0; 
} 
} 
2.2service() 方法

service() 方法处理客户机请求。Web 容器每次收到客户机请求时都调用 service() 方法。只有 servlet 初始化完成后才能调用 service() 方法。Web 容器在调用 service() 方法时传送 ServletRequest 接口的对象和 ServletResponse 接口的对象。ServletRequest 对象包含 客户机创建的业务请求的相关信息。ServletResponse 对象包含 servlet 返回给客户机的信息。 以下代码段显示了 service() 方法:

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

在发生干扰 servlet 正常运行的异常时,service() 方法引发 ServletException 异常。发生 输入或输出异常时,service() 方法引发 IOException 异常。

service() 方法将客户机请求分发给 HttpServlet 接口的其中一个请求处理程序方法,如 doGet()、doPost()、doHead()、或 doPut()。所述请求处理程序方法接受 service() 方法作为参数发送的 HttpServletRequest 和 HttpServletResponse 接口的对象。

Web 容器自动调用 service() 方法时不会在 HttpServlet 中重写 service() 方法。HTTP Servlet 的 servlet 功能在 doGet() 或 doPost() 方法中编写。

2.3doGet()方法

doGet() 方法处理客户机通过 HTTP GET 方法发送的客户机请求。GET 是一种通常用于检索静态 资源的 HTTP 请求方法。当 在浏览器的地址栏中输入 URL 查看静态网页时,浏览器就使用 GET 方法发送请求。同样,在网页上单击超链接访问某资源时,请求也是用 GET 方法发送的。 还可以 用 GET 方法发送数据。例如,可以用 GET 方法发送用户在 HTML 表单中输入的数据。用 GET 方法发送的数据作为查询字符串附加到 URL 上。 可以用 form 标记的 METHOD 属性指定 HTML 表单中 HTTP 方法的类型。

要处理通过 GET 方法接收到的客户机请求,需要在 Servlet 类中重写 doGet() 方法。在 doGet() 方法中,可以检索 HttpServletRequest 对象的客户机信息。可以用 HttpServletResponse 对象将响应发送回客户机。以下代码段显示了 doGet() 方法:

protected void doGet(HttpServletRequest req, HttpServletResponse res) 
throws ServletException, IOException 
2.4doPost()方法

doPost() 方法处理 servlet 中客户机通过 HTTP POST 方法发送的请求。例如,如果客户机在 HTML 表单中输入了注册数据,则可用 POST 方法发送上述数据。**与 GET 方法不同,POST 请求 将数据作为 HTTP 请求主体的一部分发送出去。**因此,所发送的数据不会作为 URL 的一部分出 现。

要处理 servlet 中通过 POST 方法发送的请求,需要重写 doPost() 方法。在 doPost() 方法 中,可以处理请求并将响应发送回客户机。

以下代码段显示了 doPost() 方法:

protected void doPost(HttpServletRequest req, HttpServletResponse res) 
throws ServletException, IOException 
2.5doHead()方法

doHead() 方法处理通过 HTTP HEAD 方法发送的请求。与 GET 方法类似,HEAD 方法也将请求 发送给服务器。GET 和 HEAD 方法之间唯一的区别在于 HEAD 方法返回的是包含 ContentType、Content-Length 及 Last-Modified 等条目的响应标头。HEAD 方法用于查找所请求的资 源是否存在,也可用于获取关于该资源的信息,如资源类型等。所述信息要求在请求资源内容之前 获取。此外,还可以用 HEAD 方法查找资源最后一次修改的时间,从而有助于确定使用缓存中的资 源还是需要更新缓存。

要处理通过 HEAD 方法发送的请求,需要在 servlet 中重写 doHead() 方法。以下代码段显示了 doHead() 方法的代码:

protected void doHead(HttpServletRequest req, HttpServletResponse res) 
throws ServletException, IOException 
2.6doPut()方法

doPut() 方法处理通过 HTTP PUT 方法发送的请求。PUT 方法允许客户机在服务器上存储信息。 例如,可以利用 PUT 方法将图像文件发送到服务器上。以下代码段显示了 doPut() 方法的代码:

protected void doPut(HttpServletRequest req, HttpServletResponse res) 
throws ServletException, IOException 
2.7destroy() 方法

destroy() 方法标志 servlet 生命周期的结束。Web 容器在将 Servlet 实例从服务中删除前调用 destroy() 方法。Web 容器调用 destroy() 方法的时机为:

  • 为 servlet 指定的时限终结。servlet 的时限指 Web 容器使 servlet 保持活动状态以便服务 客户机请求的期限。
  • Web 容器需要释放 Servlet 实例以节约内存。
  • Web 容器将要关闭。

可以在 destroy() 方法中编写代码,以便释放 servlet 占用的资源。例如,如果 servlet 打开 了一个数据库连接,可以在 servlet 的 destroy() 方法中关闭该数据库连接。destroy() 还用于在将 Servlet 实例从服务中删除之前保存任何持久信息。以下代码段显示了 destroy() 方法 的代码:

public void destroy(); 

三、创建Servlet

要创建 servlet,需要执行以下任务:

  1. 编写 servlet。
  2. 编译并封装 servlet。
  3. 将 servlet 部署为 Java EE 应用程序。
  4. 通过浏览器访问 servlet。

1、编写Servlet

要编写 servlet,需要扩展 HttpServlet 接口的类。编写 servlet 时,需要合并读取客户机请求 和返回响应的功能。

1.1读取和处理客户端请求

声明并初始化各种 servlet 变量后,需要定义 servlet 的功能。为此,需要重写 HttpServlet 类 的 doGet() 和 doPost() 方法。doGet() 和 doPost() 方法使用 HttpServletRequest 接口读取 HTTP 请求。HttpServletRequest 对象包含客户机通过 HTTP 请求发送的请求信息。 可以通过调用 HttpServletRequest 接口的 getParameter() 方法检索请求参数的值。 HttpServletRequest 接口的 getParameter() 方法接受请求参数的名称作为字符串值,并返回包含相应参数值的字符串。以下代码段显示了 getParameter() 方法:

String getParameter(String arg); 

以下代码段显示了如何检索用户发送的用户名:

String user=req.getParameter(“UserName”);
1.2向客户机发送响应

HTTP Servlet 利用 HttpServletResponse 接口的对象向客户机发送响应。要向客户机发送字符数据,需要获取 java.io.PrintWriter 对象。 可以使用 HttpServletResponse 接口的 getWriter() 方法来获取 PrintWriter 对象。以下代码段显示了使用 getWriter() 方法获取 PrintWriter 对象的代码:

PrintWriter out = response.getWriter()/*其中response是HttpServletResponse的对象。*/

可以使用 HttpServletResponse 接口的 setContentType() 方法指定响应的内容类型。 可以使用以下代码段设置 servlet 响应的内容类型:

res.setContentType(“text/html”); 

上面代码将响应内容类型设置为html。 可以使用 PrintWriter 类的 println() 方法向客户机发送数据。以下代码段显示了如何向客 户机发送消息字符串:

out.print(”输出内容“);//out为PrintWriter对象 
1.3编译并封装Servlet

servlet 代码编写完成后需要进行编译才能生成 Servlet 类文件。编译完 servlet 后,还需要封装 该 servlet。要封装 servlet,首先要创建部署描述符。部署描述符是一个可扩展标记语言 (XML) 文件,名称为 web.xml。该文件包含将要驻留的 Web 应用程序的配置信息。部署描述符文件 web.xml 可以控制 servlet 注册、URL 映射、欢迎文件、多用途 Internet 邮件扩展(MIME) 类型、页面级安全限制、以及 servlet 在分布式环境中的行为。部署描述符文件独立于服务器,且 简化了部署过程。

可以使用 XML 编辑器创建部署描述符。以下代码显示了示例性部署描述符的元素:

image-20220908195031132

上述代码中,部署描述符的第一行是 prolog。prolog 指定 XML 的版本及用于数据编码的字符集。 上述 prolog 中使用的字符集是 UTF-8。

web.xml文件中指定各种属性为:

  • version:此属性指定模式的版本。XML模式用于验证XML文档。
  • xmlns:此属性指定部署描述符模式的名称空间。所有部署描述符模式共享名称空间 http://java.sun.com/xml/ns/javaee。名称空间用于唯一地标识一个模式或模式集。
  • xsi:schemaLocation:此属性指定模式的位置。指定了模式信息后,需要指定将要部署的 servlet 的信息。

< web-app> 标记中的< displayname> 标记指定需要部署的 Web 模块的名称。 标记 包含 servlet 的信息,包含以下标记:

  • < display-name>:显示 servlet 的名称
  • < servlet-name>:Servlet 的名称,可通过该名称访问 servlet
  • < servlet-class>:Servlet 的名称

部署描述符创建完成后,可以封装 servlet。Java EE 定义了将 servlet 封装成 Java EE 应用程序 的标准封装结构,以便可以跨不同的应用服务器移植该 servlet。这样便于应用服务器通过标准目录 结构查找并载入应用程序文件。要创建 Web 应用程序的封装结构,需要创建以下目录:

  • 根目录:根目录包含 HTML 文件、JSP 文件及图像文件等静态资源。例如, 可以将一个 HTML 文件 LoginPage.html 放在根目录中。
  • 放在根目录中的 WEB-INF 目录:WEB-INF 目录包含应用程序部署描述符文件 web.xml,该文件保存了 Web 应用程序的各种配置。
  • classes 目录:classes 目录位于 WEB-INF 目录内,包含应用程序的类文件。例如, 可以将 SampleServlet servlet 的 SampleServlet.class 文件放在 classes 目录中。
  • lib 目录:lib 目录位于 WEB-INF 目录内,包含应用程序组件所要求的库的 Java Archive (JAR) 文件。

image-20221026203359182

下图显示了 Java Web 应用程序的标准封装结构。

image-20221026224801633

标准封装结构保存在 Web 应用程序部署过程中创建的 Enterprise Archive (EAR) 文件中。将特 定于应用程序的文件放入标准目录结构中后,需要将应用程序封装成 Web Archive (WAR) 文件。 WAR 文件是 Java EE Web 应用程序的归档形式。要创建 WAR 文件,在命令行提示符后输入以下 命令: jar cvf < war filename>

该命令用于创建可以在应用服务器上部署的 .war 文件。 大多数应用服务器都提供了自动生成部署描述符并执行封装的实用程序。例如,Java EE 应用服务 器提供了 deploytool 实用程序,以便生成部署描述符并执行封装。

1.4将 servlet 部署为 Java EE 应用程序

部署tomcat服务器,不细说,可自己查相关教程。

1.5通过浏览器访问 servlet

运行服务器后,访问URL即可,这里以idea举例,可以看到具体URL,后还可接具体Servlet文件名。

image-20221026224831036
文件。 大多数应用服务器都提供了自动生成部署描述符并执行封装的实用程序。例如,Java EE 应用服务 器提供了 deploytool 实用程序,以便生成部署描述符并执行封装。

1.4将 servlet 部署为 Java EE 应用程序

部署tomcat服务器,不细说,可自己查相关教程。

1.5通过浏览器访问 servlet

运行服务器后,访问URL即可,这里以idea举例,可以看到具体URL,后还可接具体Servlet文件名。

[外链图片转存中…(img-xN2ozhDj-1666795832163)]

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值