Servlet01-Servlet API

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

方法:

  1. destroy() 销毁 Servlet 实例时,自动调用该方法的回收资源;由servlet容器调用,以向servlet指示servlet正在停止服务
  2. getServletConfig() 返回一个 ServletConfig 对象,包含这个 servlet 的初始化和启动参数
  3. getServletInfo() 返回关于这个 servlet 的信息,像 作者,版本,版权
  4. init(ServletConfig config) 由servlet容器调用,以向servlet指示servlet正在投入使用
  5. 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

ServletContex

你可以把它想象成一个公用的空间,可以被所有的客户访问,也就是说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)

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值