Web技术的发展
静态页面阶段
用户访问页面过程:
- 用户用浏览器通过HTTP协议请求服务器上的Web页面
- 服务器上的Web服务器软件接收到请求后,读取URI所标识的资源
- 在读取的资源上加上消息报头发送给客户端的浏览器。
- 浏览器解析响应中的HTML数据,想用户呈现内容。
CGI(Common Gateway Interface)动态页面阶段
用户访问页面过程:
- 用户通过点击链接或者直接输入URL访问CGI程序。
- Web服务器接收到请求后,于是启动并运行CGI程序,由这个程序来处理用户的请求。
- CGI程序解析请求中的CGI数据,处理数据,产生一个响应(通常是HTML页面)。
- 响应返回给Web服务器。
- Web服务器包装这个响应,以HTTP响应的形式发送给浏览器。
Servlet 动态页面阶段
用户访问页面过程:
- 用户通过点击链接或者直接输入URL访问Servlet。
- Web服务器接收到请求后,交给Servlet容器。
- Servlet容器实例化Servlet。
- 调用Servlet特定方法对请求进行处理,并且产生一个响应。
- 响应由Servlet容器返回给Web容器。
- Web容器包装这个响应,以HTTP响应的形式发送给浏览器。
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实例。
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从零开始学》刘鑫