前言
JavaWeb的核心就是Servlet,各种web框架出现只是为了封装Servlet,简化开发,如果你要研究web框架,从头看源码,最后也还是会回到Servlet上来。
Web框架是开发者在使用某种语言编写Web应用服务端是关于架构的最佳实践。很多Web框架是从实际的Web项目抽取出来的,仅和Web的请求和响应处理有关,形成一个基础,在开发别的应用项目的时候则可以从这个剥离出来的基础做起,让开发者更关注具体的业务问题,而不是Web的请求和响应的控制。
框架很多,但套路基本类似,帮你隐藏很多关于HTTP协议细节内容,专注功能开发。
但对于一个初学者来说,过早的接触框架往往事倍功半!同样一个问题,换一种框架你可能需要从头开始研究。
所以,作为Java Web技术的核心基础,Servlet的工作原理是必须掌握的,也是成为一名合格的Java Web技术开发人员的基本要求。
简介
Servlet本质上也是Java类,但要遵循Servlet规范进行编写,没有main()方法,它的创建、使用、销毁都由Servlet容器进行管理(如Tomcat)。
Servlet是和HTTP协议是紧密联系的,其可以处理HTTP协议相关的所有内容。这也是Servlet应用广泛的原因之一。
提供了Servlet功能的服务器,叫做Servlet容器,其常见容器有很多,如Tomcat, Jetty, resin, Oracle Application server, WebLogic Server, Glassfish, Websphere, JBoss等。
工作原理
一个HTTP请求的执行过程:
- 客户端发出请求
http://localhost:8080/xxx
- 根据Web.xml文件的配置,找到
<url-pattern>
对应的<servlet-mapping>
- 读取
<servlet-mapping>
中<servlet-name>
的值 - 找到
<servlet-name>
对应的<servlet-class>
- 找到该class并加载执行该class
Servlet的执行过程::
- Servlet程序有Web服务器调用,当收到请求后,
- 检查是否已装载并创建了该Servlet对象,如果没有则加载创建
- 调用Servlet的
init()
方法初始化实例 - 调用
service()
方法,处理请求并返回响应结果 - 在服务器被停止或重启之前,调用
destroy()
方法释放资源
Servlet接口实现类
SUN公司定义了两个实现类,GenerricServlet
和HttpServlet
,其中后者是前者的子类,它在原有基础上添加了一些HTTP协议处理方法,它比GenerricServlet
功能更强大,所以我们一般将自己的类继承自HttpServlet,并重写doGet
方法和doPost
方法,不需要重写Service方法
。
Servlet的一些细节
如果某个Servlet的映射路径只有一个(/
),那么这个Servlet就成为当前Web应用程序的缺省Servlet。凡是在web.xml文件中找不到匹配的<servlet-mapping>
元素的URL,它们的请求访问都将交给缺省Servlet处理,也就是说,缺省Servlet用于处理所有其他Servlet都不处理的访问请求。在tomcat的安装目录 /conf/web.xml 中,注册了一个名称org.apache.catalina.servlets.DefaultServlet
的Servlet,并将这个Servlet设置为缺省Servlet。当访问Tomcat服务器中的某个静态HTML文件或图片等资源时,实际上是在访问这个缺省Servlet。
如果在<servlet>
元素中配置了一个<load-on-startup>
元素,那么WEB应用程序在启动时,就会装载并创建实例对象、以及调用Servlet实例对象的init()方法。可以在启动的时候为整个WEB应用创建一些必要的的资源或连接。但如果所有的Servlet都启动加载,则会大大增加服务器负担,而且有些Servlet永远也不会被客户访问到,白白浪费资源,所以从性能角度,应合理利用该特性。