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)。
为什么需要容器来处理 servlet 请求呢?
这样肯定带来了额外的开销,但是为什么这么做呢?
除却开发的成本较高,维护统一这些不谈。
我们先看看容器有哪些功能。
通信支持
Servlet 与 Web 之间的通信,容器都会帮我们处理。
我们只需要专心关注于业务。
生命周期
Servlet 的生命周期与资源分配,容器都会帮我们处理好。
多线程支持
Servlet 不是线程安全的,这点我们在使用的时候要谨慎。
但是 Tomcat 在处理的时候,每一个请求都会新建一个线程去处理,声明周期结束后,会自动销毁。
线程方面,已经方便处理很多。
声明方式实现安全
利用容器配置,我们改下 *.xml
配置即可进行相关设置。
而不用重新修改 Java 代码,相对安全便捷。
JSP 支持
JSP 功能以前是多么强大,正是容器将其翻译成为 java 的。
当然,建议使用 Freemarker 或者 Velocity
Spring MVC
基于 java 注解对 Servlet 进行一系列的封装,大大简化我们的开发难度。
后面我们会手写一个简化版的 spring mvc。
参考资料
Java Servlet Technology Documentation
- servlet 如何工作
- Servlet 线程安全