Servlet 概念
Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为 来自 Web 浏览器或其他 HTTP 客户端的请求 和 HTTP 服务器上的数据库或应用程序 之间的中间层。(处理请求和响应)
Java Servlet 通常情况下与使用 CGI(Common Gateway Interface,公共网关接口)实现的程序可以达到异曲同工的效果。但是相比于 CGI,Servlet 有以下几点优势:
- 性能明显更好。
Servlet 在 Web 服务器的地址空间内执行。这样它就没有必要再创建一个单独的进程来处理每个客户端请求。 - Servlet 是独立于平台的,因为它们是用 Java 编写的。
服务器上的 Java 安全管理器执行了一系列限制,以保护服务器计算机上的资源。因此,Servlet 是可信的。 - Java 类库的全部功能对 Servlet 来说都是可用的。它可以通过 sockets 和 RMI 机制与 applets、数据库或其他软件进行交互。
Servlet 架构
下图显示了 Servlet 在 Web 应用程序中的位置。
Servlet 任务
Servlet 执行以下主要任务:
- 读取客户端(浏览器)发送的显式的数据。这包括网页上的 HTML 表单,或者也可以是来自 applet 或自定义的 HTTP 客户端程序的表单。
- 读取客户端(浏览器)发送的隐式的 HTTP 请求数据。这包括 cookies、媒体类型和浏览器能理解的压缩格式等等。
- 处理数据并生成结果。这个过程可能需要访问数据库,执行 RMI 或 CORBA 调用,调用 Web 服务,或者直接计算得出对应的响应。
- 发送显式的数据(即文档)到客户端(浏览器)。该文档的格式可以是多种多样的,包括文本文件(HTML 或 XML)、二进制文件(GIF 图像)、Excel 等。
- 发送隐式的 HTTP 响应到客户端(浏览器)。这包括告诉浏览器或其他客户端被返回的文档类型(例如 HTML),设置 cookies 和缓存参数,以及其他类似的任务。
Servlet 包
Java Servlet 是运行在带有支持 Java Servlet 规范的解释器的 web 服务器上的 Java 类。
Servlet 可以使用 javax.servlet 和 javax.servlet.http 包创建,它是 Java 企业版的标准组成部分,Java 企业版是支持大型开发项目的 Java 类库的扩展版本
这些类实现 Java Servlet 和 JSP 规范。
Java Servlet 就像任何其他的 Java 类一样已经被创建和编译。在您安装 Servlet 包并把它们添加到您的计算机上的 Classpath 类路径中之后,您就可以通过 JDK 的 Java 编译器或任何其他编译器来编译 Servlet。
Servlet 生命周期
Servlet 生命周期可被定义为从创建直到毁灭的整个过程。以下是 Servlet 遵循的过程:
- Servlet 通过调用 init () 方法进行初始化。
init 方法被设计成只调用一次。它在第一次创建 Servlet 时被调用,在后续每次用户请求时不再调用。可以在方法简单地创建或加载一些数据,这些数据将被用于 Servlet 的整个生命周期。 - Servlet 调用 service() 方法来处理客户端的请求。
service() 方法是执行我们业务逻辑的主要方法。每次有请求到达 Servlet 时,执行该方法 。 - Servlet 通过调用 destroy() 方法终止(结束)。
destroy() 方法只会被调用一次,在 Servlet 容器关闭时执行 ,此时 Servlet 生命周期结束。 - 最后,Servlet 是由 JVM 的垃圾回收器进行垃圾回收的。
Filter 和 Listener
Filter
实现了 javax.servlet.Filter 接口,因此一定要实现 javax.servlet 包的 Filter 接口的三个方法 init()、doFilter()、destroy(),空实现也行。Filter 不像 Servlet,它不能产生一个请求或者响应,它只是修改对某一资源的请求,或者修改对某一资源的响应。在启动服务器时会加载过滤器的实例,并调用 init()方法来初始化实例;当每一次请求时都只调用方法 doFilter()进行处理;停止服务器时调用 destroy()方法,销毁实例。
Listener
Servlet,Filter 都是针对 url 之类的,而 Listener 是针对对象的操作的,如 session 的创建,session.setAttribute 的发生,在这样的事件发生时做一些事情。
Tomcat 和 Servlet 容器
Servlet 容器主要是 JavaWeb 应用提供运行时环境,所以也可以称之为 JavaWeb 应用容器,或者 Servlet/JSP 容器。Servlet 容器主要负责管理 Servlet、JSP 的生命周期以及它们的共享数据。
JSP 和 Servlet 区别
JSP:
- JSP 是 Servlet 的扩展,本质上还是 Servlet
- 每个 JSP 页面就是一个 Servlet 实例
- JSP 页面会被 Web 容器编译成 Servlet,Servlet 再负责响应用户请求
区别:
- Servlet 在 Java 代码中可以通过 HttpServletResponse 对象动态输出 HTML 内容。
- JSP 是在静态 HTML 内容中嵌入 Java 代码,然后 Java 代码在被动态执行后生成 HTML 内容。
- JSP 就是在 html 里面写 java 代码,servlet 就是在 java 里面写 html 代码
- JSP 更注重前端显示,servlet 更注重模型和业务逻辑。