自JavaEE诞生伊始,Servlet容器和Servlet技术,就构成了JavaEE应用的核心,配合其它组件,它们完善了Java企业级开发的全套解决方案。小到一个静态博客网站,大到分布式的集群应用,都离不开Servlet底层的支持。大约从Java 5开始,Java企业级开发就分为了两个不一样的方向,一个是基于EJB、JSF、JPA等为主的传统Java企业级系统开发方案,另外一套则是基于Struts、Hibernate、Spring、Spring MVC、MyBatis等为主JavaWeb开发模式。时至今日,移动互联网的蓬勃发展下,产生了一大批的电商、新零售、在线游戏、社交网站等各式应用。JavaWeb在时代洪流中反而获得愈来愈大的发展:分布式、集群、中间件、大数据……给Java带来了蓬勃生机。web
而这些互联网应用的基础,都有Servlet的影子。那么Servlet究竟是什么???数据库
在StackOverflow上就有这么个问题,题主搞了好久都搞不明白Servlet究竟是什么,但愿有人能用浅显直白的语言一语中的地回答他。排名第一的高票答案是这么说的:浏览器
A servlet is simply a class which responds to a particular type of network request - most commonly an HTTP request. Basically servlets are usually used to implement web applications - but there are also various frameworks which operate on top of servlets (e.g. Struts) to give a higher-level abstraction than the "here's an HTTP request, write to this HTTP response" level which servlets provide.安全
Servlets run in a servlet container which handles the networking side (e.g. parsing an HTTP request, connection handling etc). One of the best-known open source servlet containers is Tomcat.服务器
粗鲁翻译一下就是:Servlet说白了就是一个处理网络请求(不少时候是Http请求)的类,用于实现Web应用的。另外也有不少的框架好比Struts是以它为底子,搭建了一个更高抽象(的解决方案),而不是让你挽起袖子直接干“HTTP请求来了,快给回复”这种层级的粗活。Servlet是运行在处理网络请求的Servlet容器中的,好比最知名的Tomcat。网络
Web应用概述session
JavaWeb规范架构
JavaWeb应用由于是容器式开发,所以会有一个模板规范,一个基本Web应用的架势是:app
<WebDemo> //这是Web应用的名称框架
|---WEB-INF //此文件夹对外不可见
| |---web.xml //web应用配置文件(Servlet3.0可不要,但建议保留)
| |---classes //保存*.class文件
| |---lib //保存jar包
|---<a. jsp> 保存jsp文件等
web.xml
1. 配置和管理Servlet、Listener、Filter、JSP、JSP属性、标签库
2. Web应用首页、资源引用、JAAS受权引用、metadata-complete(选true表示不加载注解资源)
Servlet
Servlet开发
Servlet,说白了就是个Java的类。曾几什么时候,Servlet甚至被用来写Web界面,全部的HTML标签,都采用相似out.write("<head>\r\n")这种形式,繁琐可想而知。自MVC架构规范之后,Servlet就专一于作控制层了。
Servlet的做用就是处理网络请求。开发Servlet需继承HttpServlet,并经过如下方法处理请求:
doGet:响应Get请求
doPOST:响应POST请求
doPut:响应Put请求
doDelete:响应delete请求
init:建立Servlet实例时,初始化Servlet资源(通常不使用,须要初始化的时候,第一行调用super.init())
destory:销毁Servlet实例时,自动回收资源(通常不使用,除非须要手动回收资源如数据库链接)
开发步骤
1. 编写Servlet类
2. 配置
2.1 Servlet3.0新增的@WebServlet配置
2.2 web.xml文件配置
Servlet/JSP生命周期
1. 建立:单例模式,只建立并初始化一个Servlet实例
2. 初始化:Web容器调用Servlet的init方法初始化
3. 响应请求:初始化后,将一直在容器中,响应客户请求
4. 销毁:Web容器决定销毁Servlet,会调用destroy方法。一般是关闭Web应用时销毁
注意:Servlet容器中对同一个Servlet类,只会建立和初始化其实例一次,为单例。容器会维护一个线程池,对每个请求提供一个工做线程去处理。若是请求过多达到线程池峰值,则请求会被放入一个队列,等待可用线程。
Servlet自己是线程不安全的,所以不建议设置成员变量或类变量,而使用局部变量避免线程问题。
Servlet参数配置
能够用在好比配置数据库链接参数的场景,实现多个Servlet之间的可重用。
1. 配置
2. 访问
经过ServletConfig对象的getInitParameter(String name)访问。
注意区分ServletContext,二者方法相同,但ServletConfig是当前Servlet的配置参数;ServletContext是获取当前Web应用的配置参数。
ServletContext和HTTPSession因为是多个Servlet中共享信息,所以也是线程不安全的。
MVC中Servlet做为Controller的角色
JSP-Servlet-JavaBean的第一代MVC架构
在遥远的古代,曾经使用Servlet做为页面视图解决方案,开发难度可想而知。所以,在第一代的MVC方案里,使用JSP作V,JavaBean作M和Servlet做为Controller的方案应运而生。
一个充斥于各类学生管理系统的典型使用场景是:
JSP
JSP的本质就是Servlet,处理用户请时会被翻译为Servlet被Web容器执行。Servlet与JSP区别是:
1. 没有内置对象,JSP中的内置对象须要显示建立、
2. 对于静态页面标签,都要使用页面输出流逐行输出。
JSP由静态HTML页面内容和动态JSP脚本两部分组成
四种基本语法
3个编译指令
JSP编译指令是通知JSP的消息,不直接输出。包括
7个动做指令
编译指令是通知Servlet引擎的消息,在JSP编译成Servlet时起做用;动做指令则可替换成JSP脚本,是JSP脚本的标准化写法
9个内置对象
这9个内置对象其实都是Servlet接口的实例,在JSP的使用中被默认初始化,能够直接使用。
JSP2的自定义标签
1. 开发自定义标签类
2. 创建TLD文件
3. 使用标签库
<% taglib uri="tagliburi" prefix="tagPrefix" %>
Filter
Filter是Servlet的增强版,用于对用户请求进行预处理或后处理。一个典型的应用场景是:Filter对用户请求进行预处理,接着交给Servlet进行处理并响应,最后Filter再进行后处理。
预处理:拦截和检查HttpServletRequest,能够修改请求头和数据
后处理:拦截和检查HttpServletResponse,能够修改响应头和数据
Filter经常使用于检查用户请求、过滤非法请求、日志记录、请求解码、处理XML等
Filter也被用于实现网站的伪静态,以优化SEO。
开发过滤器
1. 建立Filter类:实现Filter接口,重写init、destory和doFilter(ServletRequest request, ServeletResponse response, FilterChain chain)方法
2. 配置
Listener
使用监听器
1. 定义Listener实现类
2. 配置