本文已参与「新人创作礼」活动,一起开启掘金创作之路。
🌴 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过滤器的特点
- 可以检查和修改request和response对象
- 可以被指定与特定的URL关联,只有当客户请求访问该特定的URL时,才会触发过滤器
- 可以被串联成串,形成过滤链,协同修改请求和响应
Servlet过滤器的作用
- 查询请求并作出相应的行动
- 阻塞请求--响应对,使其不能进一步传递
- 修改请求头和内容,用户可以提供自定义的请求
- 修改响应头和内容,用户可通过提供定制的响应版本实现
- 与外部资源进行交互
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类似也有以下两种:
- web.xml文件中配置
- 使用注解配置(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="/*")