JAVA WEB开发技术随堂笔记 Servlet技术

250 阅读10分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

🌴 2022.5.12 早八

前言

🎬本文章是 【JAVA WEB开发技术】 专栏的文章,主要是上课的随堂笔记与练习
🔗JAVA WEB开发技术专栏 传送门
💻提示:目录顺序以当堂内容(教材)为准,所以并非“1、2、3”

6.1 Servlet技术

6.1.1 Servlet与Servlet容器

  • Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层
  • 使用 Servlet,可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页
  • Servlet容器也就是指Web容器,如Tomcat、Jboss、Resin、WebLogic等,它们对Servlet进行控制

在这里插入图片描述

Servlet的生存周期:

  • 加载,Web容器启动或第一次请求Servlet时,容器加载Servlet类并将其放入到Servlet实例池中
  • 初始化,Servlet实例化时,调用init()方法初始化Servlet对象,无论多少个客户访问,一个Servlet仅执行一次init()方法
  • 服务, Servlet 容器(即 Web 服务器)调用 service() 方法来处理来自客户端(浏览器)的请求,并把格式化的响应写回给客户端。每次服务器接收到一个 Servlet 请求时,服务器会产生一个新的线程并调用服务
  • 销毁, 在服务器端停止且卸载Servlet时执行destroy()方法(仅执行一次)。当Servlet对象退出生命周期时,负责释放占用的资源

6.1.2 Servlet技术特点

Java Servlet 是运行在带有支持 Java Servlet 规范的解释器的 web 服务器上的 Java 类。它是 Java 企业版的标准组成部分,Java 企业版是支持大型开发项目的 Java 类库扩展版本

  • 方便、实用的API方法
  • 高效的处理方式
  • 跨平台
  • 更加灵活、扩展
  • 安全性

6.1.3 Servlet技术功能

Servlet的技术功能主要有以下几点:

  • Servlet可以读取客户端发送的HTTP请求
  • Servlet可以在处理业务逻辑后,将动态的内容发送到客户端,与用户请求进行交互
  • Servlet提供强大的过滤功能,可针对请求类型进行过滤设置,为Web开发提供灵活性与扩展性
  • Servlet可与其他服务器资源进行通信

6.1.4 Servlet与JSP的区别

  • Servlet承担客户请求与业务处理的中间角色,需要调用固定的方法,将动态内容混合到静态之中产生HTML;而在JSP页面中,可直接使用HTML标签进行输出,要比Servlet更具显示层的意义
  • Servlet中需要调用Servlet API接口处理HTTP请求,而在JSP页面中,则直接提供了内置对象进行处理
  • Servlet的使用需要进行一定的配置,而JSP文件通过“.jsp”扩展名部署在容器之中,容器对其自动识别,直接编译成Servlet进行处理

6.1.5 Servlet代码结构

Servlet中常用方法:

void init()
void doGet(HttpServletRequest req, HttpServletResponse resp)
void doPost(HttpServletRequest req, HttpServletResponse resp)
void doPut(HttpServletRequest req, HttpServletResponse resp)
void doDelete(HttpServletRequest req, HttpServletResponse resp)
void destroy()

可以在新建Servlet的时候让它初始化生成一下

在这里插入图片描述

6.1.6 简单的Servlet程序

在编写Servlet时,不必重写所有的方法,只需要重写所使用的方法

例输出This is a Servlet.

public class SimpleServlet extends HttpServlet {

private static final long serialVersionUID = -6160587558635034166L;
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("This is a Servlet.");
}
}

6.2 Servlet开发

6.2.1 Servlet的创建

创建Servlet可以通过:

  • Eclipse提供的Servlet向导创建
  • 创建Java类使其继承HttpServlet

使用Eclipse向导创建的一般步骤:

  • 设定类文件(类名、包、父类等)
  • 设置Servlet(名称、描述、参数、URI等)
  • 选择修饰符、实现接口及生成方法

6.2.2 Servlet配置

要使Servlet对象正常运行,需要对其进行适当的配置,说明Servlet名称、对应类、初始参数、对应URI等,配置方式有两种:web.xml文件中配置,使用注解配置(Servlet 3.0以上)

🚀 web.xml文件中配置

1.声明Servlet对象

在web.xml中通过<servlet>标签进行 主要的子元素有:<servlet-name>,<servlet-class>,<init-param>,<description>

//例子
<servlet>
    <servlet-name>SimpleServlet</servlet-name>
    <servlet-class>com.zs.servlet.SimpleServlet</servlet-class>
</servlet>

2.设置Servlet映射

在web.xml中通过<servlet-mapping>标签进行,子元素有:<servlet-name><url-pattern>

//url-pattern大致分为以下几种方式:
<url-pattern>/servlet/MyServlet.do</url-pattern>	//完全匹配
<url-pattern>/servlet/*</url-pattern>		//目录匹配
<url-pattern>*.do</url-pattern>		//扩展名匹配

【例】

<servlet-mapping>
    <servlet-name>SimpleServlet</servlet-name>
    <url-pattern>/SimpleServlet</url-pattern>
 </servlet-mapping>

🚀 使用注解配置

使用@WebServlet将一个继承于javax.servlet.http.HttpServlet的类定义为Servlet组件 @WebServlet的属性:

  • asyncSupported:声明Servlet是否支持异步操作模式
  • description:Servlet的描述
  • displayName:Servlet的显示名称
  • initParams:Servlet的init参数
  • name:Servlet的名称
  • urlPatterns:Servlet的访问URL

【例】

@WebServlet(name="Test",urlPatterns="/servlet/Test")

6.3 Servlet API编程常用的接口和类

6.3.1 Servlet接口

所有Servlet/JSP应用必须直接或者间接实现Servlet接口, Servlet/JSP容器会将实现了Servlet接口的类加载至容器,以供访问

public void init(ServletConfig config)Servlet实例化后,Servlet容器调用此方法来完成初始化工作
public void service(ServletRequest request , ServletResponse response)此方法用于处理客户端的请求
public void destroy()当Servlet对象应该从Servlet容器中移除时,容器调用此方法,以便释放资源
public ServletConfig getServletConfig()此方法用于获取Servlet对象的配置信息,返回ServletConfig对象
public String getServletInfo()此方法返回有关Servlet的信息,它是纯文本格式的字符串,如作者、版本等

6.3.2 ServletConfig接口

ServletConfig接口封装了Servlet的配置信息,在Servlet初始化期间被传递。每一个Servlet都有且只有一个ServletConfig对象

public String getInitParameter(String name)此方法返回String类型名称为name的初始化参数值
public Enumeration getInitParameterNames()获取所有初始化参数名的枚举集合
public ServletContext getServletContext()用于获取Servlet上下文对象
public String getServletName()返回Servlet对象的实例名

6.3.3 HttpServletRequest接口

HttpServletRequest接口继承了ServletRequest接口,并针对HTTP协议增加了一些方法,在Servlet开发中经常使用

public String getContextPath()返回请求的上下文路径,此路径以“/”开头
public Cookie[] getCookies()返回请求中发送的所有cookie对象,返回值为cookie数组
public String getMethod()返回请求所使用的HTTP类型,如get、post等
public String getQueryString()返回请求中参数的字符串形式,如请求MyServlet?username=mr,则返回username=mr
public String getRequestURI()返回主机名到请求参数之间部分的字符串形式
public StringBuffer getRequestURL()返回请求的URL,此URL中不包含请求的参数。注意此方法返回的数据类型为StringBuffer
public String getServletPath()返回请求URI中的Servlet路径的字符串,不包含请求中的参数信息
public HttpSession getSession()返回与请求关联的HttpSession对象

6.3.4 HttpServletResponse接口

HttpServletResponse接口继承了ServletResponse接口,并针对HTTP协议增加了一些方法,在Servlet开发中经常使用

public void addCookie(Cookie cookie)向客户端写入cookie信息
public void sendError(int sc)发送一个错误状态码为sc的错误响应到客户端
public void sendError(int sc, String msg)发送一个包含错误状态码及错误信息的响应到客户端,参数sc为错误状态码,参数msg为错误信息
public void sendRedirect(String location)使用客户端重定向到新的URL,参数location为新的地址

6.3.5 GenericServlet类

为了简化Servlet的编写,在javax.servlet包中提供了一个抽象类GenericServlet,它给出了除service()方法以外的简单实现 GenericServlet定义了一个通用的,不依赖具体协议的Servlet,它实现了Servlet接口和ServletConfig接口

6.3.6 HttpServlet类

HttpServlet主要是应用于HTTP协议的请求和响应,为了快速开发HTTP协议的serlvet,提供了一个继承自GenericServlet的抽象类HttpServlet,用于创建适合Web站点的HttpServlet

它实现Servlet接口的service方法,是将ServletResponse对象和ServletRequest对象转化成httpServletResponse对象和HttpservletRequest对象

它根据request获取Http method(get、post等)的名称,根据http method调用不同的方法执行操作,如doGet 、doPost、doPut、doDelete等

6.4 Servlet过滤器

6.4.1 过滤器概述

Servlet过滤器主要用来完成一些通用的操作,如编码的过滤、判断用户的登录状态

Servlet过滤器是是一种可以插入的Web组件,它能够对Servlet 容器的接收到的客户端请求和向客户端发出的响应对象进行截获

Servlet过滤器本身不产生请求和响应,它只提供过滤作用,Servlet过滤器能够在Servlet程序( JSP页面)被调用之前检查 request对象,修改请求头和请求内容,在Servlet程序( JSP页面)被调用之后,检查response对象,修改响应头和响应内容

Servlet过滤器的特点

  1. 可以检查和修改request和response对象
  2. 可以被指定与特定的URL关联,只有当客户请求访问该特定的URL时,才会触发过滤器
  3. 可以被串联成串,形成过滤链,协同修改请求和响应

Servlet过滤器的作用

  1. 查询请求并作出相应的行动
  2. 阻塞请求--响应对,使其不能进一步传递
  3. 修改请求头和内容,用户可以提供自定义的请求
  4. 修改响应头和内容,用户可通过提供定制的响应版本实现
  5. 与外部资源进行交互

6.4.2 Filter API

Filter接口位于javax.servlet包中,与Servlet接口相似,当定义一个过滤器对象时需要实现该接口

public void init(FilterConfig filterConfig)过滤器的初始化方法,容器调用此方法完成过滤的初始化。对于每一个Filter实例,此方法只被调用一次
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)此方法与Servlet的service()方法相类似,当请求及响应交给过滤器时,过滤器调用此方法进行过滤处理
public void destroy()在过滤器生命周期结束时调用此方法,用于释放过滤器所占用的资源

FilterChain接口 FilterChain接口位于javax.servlet包中,由容器(Web服务器)实现 包含的方法:

void doFilter(ServletRequest request, ServletResponse response)              
throws  IOException , ServletException

主要用于将过滤器处理的请求或响应传递给下一个过滤器对象。在多个过滤器的Web应用中,可以通过此方法进行传递。Filter接口doFilter方法中的参数chain为实现该接口的对象。

FilterConfig接口 FilterConfig接口位于javax.servlet包中,由容器(Web服务器)实现,用于获取过滤器初始化期间的参数信息 Filter接口init方法中参数filterConfig为实现该接口的对象

public String getFilterName()返回过滤器的名称
public String getInitParameter(String name)返回初始化名称为name的参数值
public Enumeration getInitParameterNames()返回所有初始化参数名的枚举
public ServletContext getServletContext()返回Servlet的上下文对象

6.4.3 过滤器的配置

要使Filter对象正常运行,需要像Servlet一样对其进行适当的配置,说明过滤器名称、对应类、初始参数、对应URL等,配置方式同Servlet类似也有以下两种:

  1. web.xml文件中配置
  2. 使用注解配置(Servlet 3.0以上)

🚀 web.xml文件中配置

1.声明过滤器对象 在web.xml中通过<filter>标签进行 主要的子元素有:<filter-name>,<filter-class>,<init-param>,<description>

 <filter>
    <filter-name>SimpleFilter</filter-name>
    <filter-class>com.zs.filter.SimpleFilter</filter-class>
 </filter>

2.设置Filter映射 在web.xml中通过<filter-mapping>标签进行 子元素有:<filter-name>,<url-pattern>,<dispatcher> <dispatcher>元素作用:用于指定过滤器对应的请求方式,可选值:

可选值说明
REQUEST直接请求时,通过过滤器进行处理
INCLUDE通过RequestDispatcher对象的include()方法请求时,通过过滤器进行处理
FORWARD通过RequestDispatcher对象的forward()方法请求时,通过过滤器进行处理
ERROR当声明式异常产生时,通过过滤器进行处理

🚀 使用注解配置

使用@WebFilter将一个实现了javax.servlet.Filter接口的类定义为过滤器组件 @WebFilter的属性: asyncSupported:声明Filter是否支持异步操作模式 description:Filter的描述 displayName:Filter的显示名称 initParams:Filter的init参数 name:Filter的名称 urlPatterns:Filter的访问URL servletNames:指定过滤器将应用于哪些 Servlet

@WebFilter(filterName=“TestFilter", urlPatterns="/*")