系列文章汇总

写作缘由

原来学习过多次 servlet,但是平时工作中一直使用 spring mvc 等框架。使用的时候写几个注解,实际原理并不知晓。
此系列文章,意在知其然,知其所以然。
学习之路,就是保持一颗好奇之心。

Servlet

概念

servlet是用于扩展和增强Web服务器的Java平台技术。

servlet提供了一种基于组件的、独立于平台的方法来构建基于web的应用程序,而不受CGI程序的性能限制。

与专有的服务器扩展机制(如Netscape服务器API或Apache模块)不同,servlet是独立于服务器和平台的。这使您可以自由地为您的服务器、平台和工具选择“最佳品种”策略。

servlet可以访问所有Java API,包括访问企业数据库的JDBC API。servlet还可以访问特定于http的调用库,并获得成熟Java语言的所有好处,包括可移植性、性能、可重用性和崩溃保护。

如今,servlet是构建交互式Web应用程序的流行选择。

容器

第三方servlet容器可用于Apache Web服务器、Microsoft IIS等。

Servlet容器通常是Web和应用服务器的组件,如BEA WebLogic应用服务器、IBM WebSphere、Sun Java系统Web服务器、Sun Java系统应用服务器等。

JSP

您可能想了解有关JavaServer Pages (JSP)技术的最新信息。

JSP技术是servlet技术的扩展,该技术的创建是为了支持编辑HTML和XML页面。

它使固定或静态模板数据与动态内容相结合变得更加容易。

即使您很喜欢编写servlet,也有几个令人信服的理由来研究JSP技术作为现有工作的补充。

vs CGI

Java Servlet 通常情况下与使用 CGI(Common Gateway Interface,公共网关接口)实现的程序可以达到异曲同工的效果。但是相比于 CGI,Servlet 有以下几点优势:

  • 性能明显更好。

  • Servlet 在 Web 服务器的地址空间内执行。这样它就没有必要再创建一个单独的进程来处理每个客户端请求。

  • Servlet 是独立于平台的,因为它们是用 Java 编写的。

  • 服务器上的 Java 安全管理器执行了一系列限制,以保护服务器计算机上的资源。因此,Servlet 是可信的。

  • Java 类库的全部功能对 Servlet 来说都是可用的。它可以通过 sockets 和 RMI 机制与 applets、数据库或其他软件进行交互。

与 J2EE 的关系

Servlet是J2EE 规范中的一种,主要是为了扩展java作为web服务的功能。

他的作用就是为java程序提供一个统一的web应用的规范,方便程序员统一的使用这种规范来编写程序,应用容器可以使用提供的规范来实现自己的特性。

与 Tomcat 的关系

Tomcat 是Web应用服务器,是一个Servlet/JSP容器。

Tomcat 作为Servlet容器,负责处理客户请求,把请求传送给Servlet,并将Servlet的响应传送回给客户。

而Servlet是一种运行在支持Java语言的服务器上的组件。 Servlet最常见的用途是扩展Java Web服务器功能,提供非常安全的,可移植的,易于使用的CGI替代品。

从http协议中的请求和响应可以得知,浏览器发出的请求是一个请求文本,而浏览器接收到的也应该是一个响应文本。

但是在上面这个图中,并不知道是如何转变的,只知道浏览器发送过来的请求也就是request,我们响应回去的就用response。忽略了其中的细节,现在就来探究一下。

①:Tomcat将http请求文本接收并解析,然后封装成HttpServletRequest类型的request对象,所有的HTTP头数据读可以通过request对象调用对应的方法查询到。

②:Tomcat同时会要响应的信息封装为HttpServletResponse类型的response对象,通过设置response属性就可以控制要输出到浏览器的内容,然后将response交给tomcat,tomcat就会将其变成响应文本的格式发送给浏览器

Java Servlet API 是Servlet容器(tomcat)和servlet之间的接口,它定义了serlvet的各种方法,还定义了Servlet容器传送给Servlet的对象类,其中最重要的就是ServletRequest和ServletResponse。所以说我们在编写servlet时,需要实现Servlet接口,按照其规范进行操作。

个人感想

平时的工作中,使用 spring mvc 注解用来用去,其实一直没有深究过其本质是什么。

  • Web

我们每一个 web 服务,就是客户端和服务端文件信息的交换。

底层全部依赖于 HTTP 协议

  • Servlet

Servlet 是一套标准,甚至可以简单的理解为接口。

这些接口是无法单独运行的,就需要依赖于容器(Container)。

比如常见的 TomcatJetty

为什么需要容器来处理 servlet 请求呢?

这样肯定带来了额外的开销,但是为什么这么做呢?

除却开发的成本较高,维护统一这些不谈。

我们先看看容器有哪些功能。

通信支持

Servlet 与 Web 之间的通信,容器都会帮我们处理。

我们只需要专心关注于业务。

生命周期

Servlet 的生命周期与资源分配,容器都会帮我们处理好。

多线程支持

Servlet 不是线程安全的,这点我们在使用的时候要谨慎。

但是 Tomcat 在处理的时候,每一个请求都会新建一个线程去处理,声明周期结束后,会自动销毁。

线程方面,已经方便处理很多。

声明方式实现安全

利用容器配置,我们改下 *.xml 配置即可进行相关设置。

而不用重新修改 Java 代码,相对安全便捷。

JSP 支持

JSP 功能以前是多么强大,正是容器将其翻译成为 java 的。

当然,建议使用 Freemarker 或者 Velocity

Spring MVC

基于 java 注解对 Servlet 进行一系列的封装,大大简化我们的开发难度。

后面我们会手写一个简化版的 spring mvc。

原文地址

Java Servlet 教程-01-概览

参考资料

Java Servlet Technology Documentation

《Java Servlet 3.1 规范》

Head First Servlet & JSP 书籍地址

servlet 系列教程

  • servlet 如何工作

tomcat-servlet

servlet的本质是什么,它是如何工作的?

  • Servlet 线程安全

Servlet是线程安全的吗?

10-06 16:04