servlet 是一个 Java 程序,通常被称为 服务器端小程序,是运行在服务器端的程序,用于处理及响应客户端的请求。只需重写 service() 方法即可响应客户端的所有请求。
一个 servlet 应用程序经常包含一个或者多个 servlet,JSP 页面要被翻译成 servlet,并进行编译。servlet 应用程序是 在 servlet 容器中运行的,他不能自动运行。servlet 容器将用户的请求传给 servlet 应用程序,并将 servlet 应用程序的响应回传给用户。大多数 servlet 应用程序至少都包含几个 JSP 页面。
Servlet/JSP 容器(例如 tomcat)是一种特殊的 web 服务器,它可以处理 servlet,并提供静态内容
JSP 的本质就是 Servlet ,开发者把编写好的 JSP 页面部署在 Web 容器(例如 tomcat)中之后,Web 容器会将 JSP 编译成对应的 Servlet。
Servlet 作为表现层 的坏处:
- Servlet 的开发效率非常低,特别是当使用 Servlet 生成表现层页面时,页面中的所有 HTML 标签,都需采用 Servlet 的输出流来输出,
- Servlet 类时标准的 Java 类,必须由程序员开发、修改。美工人员无法参与 servlet 的开发
- 程序可维护性差,即使修改一个按钮的标题,都必须重新编辑 Java 代码,并重新编译
自 MVC 规范出现后,Servlet 仅作为控制器(Controller)使用,作用类似于调度员:所有用户请求发送给 Servlet,Servlet 调用 Model 来处理用户请求,并调用 JSP 来呈现处理结果;或者 servlet 直接调用 JSP 将应用的状态数据呈现给用户。
Model 通常由 JavaBean 来充当,所有业务逻辑、数据访问逻辑都在 model 中实现。实际上隐藏在 model 下还有很多丰富的组件,例如 DAO 组件、领域对象等。
JSP 仅作为 表现层(View)技术,作用:
- 负责收集用户请求参数
- 将应用的处理结果、状态数据呈现给用户
官网文档
Servlet API Documentation
packages:
- javax.servlet
The javax.servlet package contains a number of classes and interfaces that describe and define the contracts between a servlet class and the runtime environment provided for an instance of such a class by a conforming servlet container.
包含定义 servlet 与 servlet 容器之间契约的类和接口
- javax.servlet.http
The javax.servlet.http package contains a number of classes and interfaces that describe and define the contracts between a servlet class running under the HTTP protocol and the runtime environment provided for an instance of such a class by a conforming servlet container.
包含 在 HTTP协议下运行的 servlet 类 与 servlet 容器之间契约的类和接口
javax.servlet 中的主要类型
-
Servlet 接口
定义所有 servlet 必须 实现的接口。Servlet 是一个运行在 web 服务器上的小程序。Servlet 接收和回复来自web 客户端的请求,通常经过 HTTP,超文本传输协议,实现这个接口,你可以写一个一般的 servlet ,继承 javax.servlet.GenericServlet 或者 HTTP servlet 继承 javax.servlet.http.HttpServlet
方法:
- destroy() 销毁 Servlet 实例时,自动调用该方法的回收资源;由servlet容器调用,以向servlet指示servlet正在停止服务
- getServletConfig() 返回一个 ServletConfig 对象,包含这个 servlet 的初始化和启动参数
- getServletInfo() 返回关于这个 servlet 的信息,像 作者,版本,版权
- init(ServletConfig config) 由servlet容器调用,以向servlet指示servlet正在投入使用
- service(ServletRequest req, ServletResponse res) 由servlet容器调用 告知 servlet 回复 请求
-
ServletRequest
定义一个对象 以向 servlet 提供客户端请求信息。servlet 容器创建一个 ServletRequest 对象,并将其作为一个参数传递给 servlet 的服务方法
一个 ServletRequest 对象提供包含参数名字和值,属性和输入流的数据。扩展 ServletRequest 的接口可以提供其他 特定协议 数据(例如,HttpServletRequest 提供的 HTTP 数据。
对于每一个 HTTP 请求,Servlet 容器都会创建一个 ServletRequest 实例,并将它传给 Servlet 的 service 方法。ServletRequest 封装有关请求的的信息
方法:
getContentLength() 返回请求主体中的字节数,如果不知道字节的长度,返回-1
getContentType() 返回请求主体 的 MIME 类型,如果不知道类型,返回 null
getParameter(java.lang.String.name) 返回指定请求参数的值
getProtocol() 返回这个HTTP请求的协议名称和版本号
-
ServletResponse
定义一个对象 帮助 servlet 向客户端发送响应。servlet容器包含一个 ServletResponse 对象,并将其作为参数传递给 servlet 的服务方法
(在调用一个 servlet 的 service 方法之前,Servlet 容器会先创建一个 ServletResponse,并将它作为第二个参数传给 service 方法)
在MIME(多用途Internet邮件扩展)正文响应中发送二进制数据,使用 getOutputStream() 返回的 ServletOutputStream;
发送字符数据,使用 getWriter() 返回的 PrintWriter 对象。
例如,要混合二进制和文本数据以创建多部分响应,使用 ServletOutputStream 并手动管理字符部分
可以使用 setCharacterEncoding(java.lang.String) 和 setContentType(java.lang.String) 方法显式指定 MIME 正文响应的 charset,或者使用 setLocale(java.util.Locale)方法隐式指定。显式规范优先于隐式规范。如果未指定 charset,则将使用 ISO-8859-1。必须在 getwriter 之前和提交要使用的字符编码的响应之前调用 setCharacterEncoding,setContentType 或 setLocale 方法
常用方法:
getCharacterEncoding() 返回用于此响应中发送的正文的字符编码(MIME字符集)的名称
setCharacterEncoding() 设置发送到客户端的响应的字符编码(MIME字符集),例如设置为 UTF-8
getContentType() 返回用于此响应中发送的 MIME 正文的内容类型
setContentType() 如果还没有提交响应,则设置发送到客户端的响应的内容类型
getLocale() 使用 setLocale(java.util.Locale) 方法返回为此响应指定的语言环境
setLocale() 如果还没有提交相应,则设置响应的区域设置
getOutputStream() 返回适应在响应中写入二进制数据的 ServletOutputStream
getWriter() 返回一个能向客户端发送字符文本的 PrintWriter 对象
ServletResponse 中定义的其中一个方法是 getWriter 方法,它返回可以将文本传给客户端的 java.io.PrintWriter。在默认情况下,PrintWriter 对象采用 ISO-8859-1 编码。在将响应发送给客户端时,通常将它作为 HTML 发送。另一个方法是 getOutputStream 传输二进制数据,因此大多数时候使用 getWriter。在发送任何 HTML 标签之前,应该先通过调用 serContentType 方法来设置响应的内容类型,比如,将 text/html 作为参数传递,这是在告诉浏览器内容类型为 HTML
-
ServletContext
定义一组 servlet 用来和它的 servlet 容器通信的方法,例如,获取文件的 MIME 类型,分派请求,或者写入日志文件
每个 Java 虚拟机 每个 web应用程序 有一个上下文。( “web应用程序” 是安装在服务器 URL 命名空间的特定子集下的 servlet 和内容的集合,例如 /catalog,可能通过 .war 文件安装)
对于在其部署描述符中标记为“分布式”的web应用程序,每个虚拟机将有一个上下文实例。在这种情况下,上下文不能用作共享全局信息的位置(因为信息不是真正的全局信息)。使用外部资源,如数据库。
ServletContext 对象包含在 ServletConfig 对象中,web服务器在初始化 servlet 时提供 servlet
你可以把它想象成一个公用的空间,可以被所有的客户访问,也就是说A客户端可以访问D,B客户端可以访问D,C客户端也可以访问D。
- WEB容器在启动时,它会为每个Web应用程序都创建一个对应的ServletContext,它代表当前Web应用。并且它被所有客户端共享。
- ServletContext对象可以通过ServletConfig.getServletContext()方法获得对ServletContext对象的引用,也可以通过this.getServletContext()方法获得其对象的引用。
- 由于一个WEB应用中的所有Servlet共享同一个ServletContext对象,因此Servlet对象之间可以通过ServletContext对象来实现通讯。ServletContext对象通常也被称之为context域对象。公共聊天室就会用到它。
- 当web应用关闭、Tomcat关闭或者Web应用reload的时候,ServletContext对象会被销毁
-
ServletConfig
servlet 容器用于在初始化期间 将信息传递给 servlet 的 servlet配置对象,包含了 servlet 的初始化参数信息。 ServletConfig 对象与 ServletContext 对象关联。Servlet容器在调用 servlet对象的 init(ServletConfig) config 方法时,会把ServletConfig类型的对象当作参数传递给 servlet 对象。 init(ServletConfig config) 方法会使得当前 servlet 对象 与 ServletConfig 类型的对象建立关联关系。
在 Servlet容器初始化 Servlet 时,Servlet容器将 ServletConfig 传给 Servlet 的 init() 方法,ServletConfig 封装可以通过 @WebServlet 或者部署描述符传给一个 Servlet 的配置信息。以这种方式传递的每一条信息都称作初始参数,有两个部分:键和值
getInitParameter() 从 servlet 中获取某个初始参数的值
getInitParameterNames() 返回所有初始参数名称的一个 Enumeration
-
ServletDispatcher
调度,本身主要用于控制流程
-
Filter
过滤器是对资源请求(servlet 或 静态内容)或资源响应(或两者)执行过滤任务的对象
过滤器在 doFilter 方法中执行过滤。每个 Filter 都可以访问 FilterConfig 对象,从该对象可以获取其初始化参数,例如,可以使用 ServletContext 的引用,以加载过滤任务所需的资源,
过滤器在 Web 应用程序的部署描述符中配置(即 web.xml)
方法:
destroy()
doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
init(FilterConfig filterConfig)