Servlet 技术简介

Web技术的发展

静态页面阶段

用户访问页面过程:

  1. 用户用浏览器通过HTTP协议请求服务器上的Web页面
  2. 服务器上的Web服务器软件接收到请求后,读取URI所标识的资源
  3. 在读取的资源上加上消息报头发送给客户端的浏览器。
  4. 浏览器解析响应中的HTML数据,想用户呈现内容。

    Servlet 技术简介_第1张图片

CGI(Common Gateway Interface)动态页面阶段

用户访问页面过程:

  1. 用户通过点击链接或者直接输入URL访问CGI程序。
  2. Web服务器接收到请求后,于是启动并运行CGI程序,由这个程序来处理用户的请求。
  3. CGI程序解析请求中的CGI数据,处理数据,产生一个响应(通常是HTML页面)。
  4. 响应返回给Web服务器。
  5. Web服务器包装这个响应,以HTTP响应的形式发送给浏览器。

    Servlet 技术简介_第2张图片

Servlet 动态页面阶段

用户访问页面过程:

  1. 用户通过点击链接或者直接输入URL访问Servlet。
  2. Web服务器接收到请求后,交给Servlet容器。
  3. Servlet容器实例化Servlet。
  4. 调用Servlet特定方法对请求进行处理,并且产生一个响应。
  5. 响应由Servlet容器返回给Web容器。
  6. Web容器包装这个响应,以HTTP响应的形式发送给浏览器。

    Servlet 技术简介_第3张图片

Servlet是什么

Servlet是一种独立于平台和协议的服务器端的Java技术,可以用来生成动态的Web页面。

Servlet是使用Java Servlet应用程序设计接口(API)及相关类和方法的Java程序。

Servlet主要用户处理客户端传来的HTTP请求,并返回一个响应。通常Servlet是指HttpServlet,用于处理HTTP请求。

能够处理的请求有:doGet() doPost() service()等。

在开发Servlet时,可以直接继承javax.servlet.http.HttpServlet。


Servlet与Servlet容器

Java Servlet(Java服务器小程序)是一个基于Java技术的Web组件,运行在服务器端,由Servlet容器所管理,用于生成动态的内容。Servlet是平台独立的Java类,编写一个Servlet,实际上就是按照Servlet规范编写一个Java类。Servlet被编译为平台独立的字节码,可以被动态地加载到支持Java技术的Web服务器中运行。

Servlet容器(Servlet引擎)是Web服务器或应用程序服务器的一部分,用于在发送的请求和响应之上提供网络服务,解码基于MIME的请求,格式化机遇MIME的响应。

Servlet不能独立于运行,必须被部署到Servlet容器中,由容器来实例化和调用Servlet的方法,Servlet容器在Servlet的生命周期内包容和管理Servlet。


Servlet技术特点

高效,方便,跨平台,功能强大,灵活性和可扩展性,共享数据,安全。

1. 高效
在服务器上仅有一个Java虚拟机在运行,它的优势在于当多个来自客户端的请求进行访问时,Servlet为每个请求分配一个线程而不是进程。

2. 方便
Servlet提供了大量的实用工具例程,如处理很难完成的HTML表单数据,读取和设置HTTP头,处理Cookie和跟踪会话等。

3. 跨平台
Servlet是用Java类编写的,可以在不同的操作系统平台和应用服务器平台下运行。

4. 功能强大
在Servlet中,许多实用传统CGI程序很难完成的任务都可以利用Servlet技术轻松完成。例如,Servlet能够直接和Web服务器交互,而普通的CGI程序不能。Servlet还能够在各个程序之间共享数据,使得数据库连接池之类的功能很容易实现。

5. 灵活性和可扩展性
采用Servlet开发的Web应用程序,由于Java类的继承性,构造函数等特点,使得其应用灵活,可随意扩展。

6. 共享数据
Servlet之间通过共享数据可以很容易地实现数据库连接池。它能方便地实现管理用户请求,简化Session和获取前一页面信息的操作,而在CGI之间通信则很差。由于每个CGI程序的调用都开始一个新的进程,调用间通信通常要通过文件进行,因而相当缓慢。同一台服务器上的不同CGI程序之间的通信也相当麻烦。

7. 安全
有些CGI版本有明显的安全弱点。即使是实用最新标准,系统也没有基本安全框架。而Java定义有完整的安全机制,包括SSL\CA认证、安全政策等规范。


Servlet生命周期

加载和实例化–>初始化–>请求处理–>销毁

1. 加载和实例化(创建Servlet对象)
第一种情况:
当请求到达容器时,容器查找该servlet对象是否存在,如果不存在,才会创建实例。
第二种情况:
容器在启动时,或者新部署了某个应用时,会检查web.xml当中,servlet是否有 load-on-starup配置。如果有,则会创建该servlet实例。
load-on-starup参数值越小,优先级越高(最小值为0,优先级最高)。

2. 初始化init()
在Servlet实例化后,容器调用init()方法初始化这个对象,为了让Servlet对象在处理客户端请求之前完成一些初始化工作,例如简历数据库的连接,获取配置信息等。

3. 请求处理 service()
Servlet容器调用service()方法对请求进行处理。
HttpServlet的service()方法,会依据请求方式来调用doGet()或者doPost()方法进行请求处理,并且通过调用ServletResponse对象的方法设置响应信息。

4. 销毁 destroy()
当容器检测到Servlet实例应该从服务器中被移除的时候,当需要释放内存或容器关闭时候,容器或调用Servlet实例等destroy()方法。
当destroy()方法调用之后,容器会释放这个Servlet实例,随后会被Java等垃圾收集器所回收,如果在此需要这个Servlet处理请求,Servlet容器会创建一个新的
Servlet实例。

Servlet 技术简介_第4张图片

init()destroy()方法只被调用一次
service()可以被调用多次


Servlet代码结构

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MyServlet extends HttpServlet{
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 可编写使用req读取和请求有关的信息和表单数据代码
        // 可编写使用resp置顶HTTP应答状态代码和应答头的代码
        // 可编写使用out对象向页面中输出信息的代码
        PrintWriter out = resp.getWriter();
    }
}

总结

首先通过Web技术的发展引出了Servlet技术。接着简单介绍了Servlet是什么Servlet和Servlet容器Servlet技术特点Servlet生命周期Servlet代码结构


参考:

  • 《Servlet/JSP深入详解—基于Tomcat的Web开发》 孙鑫
  • 《JSP程序设计教程》(第2版)郭珍 王国辉 张敏 张永
  • 《JSP从零开始学》刘鑫

你可能感兴趣的:(Servlet,Web前端)