本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:Java Web教学PPT包含多个章节,从Web基础到Java Web技术的深入应用。章节包括HTTP、HTML、CSS、JavaScript、Servlet生命周期、HTTP请求与响应、会话技术、JSP技术、EL表达式和JSTL、Servlet高级特性,以及“传智书城”项目的前后端设计。这套教程是学习和巩固Java Web开发技能的宝贵资源,能够帮助开发者从理论到实践全方位掌握Web应用开发的技能。
Java Web教学PPT.rar

1. 网页开发基础

1.1 HTML和CSS的入门

网页开发是构建互联网应用的基石。本章节将介绍网页开发中最基础的技术——HTML和CSS。HTML(HyperText Markup Language)定义了网页的结构,包括标题、段落、图片、链接等各种元素。通过学习标签的使用,开发者能够为网页添加内容。

<!DOCTYPE html>
<html>
<head>
    <title>我的网页</title>
</head>
<body>
    <h1>欢迎来到我的网页</h1>
    <p>这是一个段落。</p>
    <img src="image.jpg" alt="描述图片内容">
</body>
</html>

CSS(Cascading Style Sheets)则负责网页的样式和布局。在上面的例子中,如果要改变 <h1> 标签内的文字颜色为蓝色,可以使用以下CSS代码:

h1 {
    color: blue;
}

通过组合使用HTML和CSS,开发者能够创建出既美观又功能强大的网页。本章节会通过实例详细讲解这两种技术,帮助初学者打好网页开发的基础。

2. Servlet基础与应用

2.1 Servlet的生命周期和工作原理

2.1.1 Servlet生命周期详解

Servlet是Java EE(Java Platform, Enterprise Edition)中用于处理客户端请求和服务器响应的Java类。它作为一种服务器端组件,是Web应用的核心。了解Servlet的生命周期对于开发高性能的Web应用至关重要。

一个Servlet从初始化到销毁,要经历三个阶段:加载和实例化、初始化、请求处理、销毁。

  1. 加载和实例化 :当Web应用部署在服务器上,并且接收到第一个请求时,Servlet容器会负责加载Servlet类。加载后,容器通过反射机制创建Servlet类的实例。

  2. 初始化 :一旦Servlet对象被创建,容器将调用其 init() 方法进行初始化。这个方法只会在Servlet生命周期内被调用一次。 init() 方法可以接收一个 ServletConfig 对象,从中获取初始化参数,这些参数在 web.xml 文件中定义。

  3. 请求处理 :当Web应用接收到请求时,Servlet容器会调用Servlet的 service() 方法来处理请求。 service() 方法根据请求类型调用 doGet() , doPost() , doPut() , doDelete() 等方法之一。开发者通常只需要覆盖这些方法来处理各种请求。

  4. 销毁 :当Web应用被卸载或服务器关闭时,Servlet容器会调用 destroy() 方法来执行清理工作。开发者可以在 destroy() 方法中释放资源,如关闭文件句柄等。

2.1.2 Servlet工作原理分析

Servlet的工作原理涉及到客户端和服务器的交互流程。了解这个流程有助于深入理解Web应用的执行机制。

  1. 请求处理流程 :当客户端发送请求到Web服务器时,服务器根据URL确定请求的目标Servlet。服务器创建 HttpServletRequest HttpServletResponse 对象,分别封装请求和响应信息。

  2. 调用Servlet :服务器调用Servlet容器,Servlet容器负责调用对应Servlet的 service() 方法。在 service() 方法中,会根据HTTP请求类型(GET、POST等)调用相应的处理方法( doGet() , doPost() 等)。

  3. 响应生成 :Servlet处理完请求后,会生成响应,通过 HttpServletResponse 对象发送回客户端。响应内容可以是HTML、JSON、XML等格式的数据。

  4. 会话跟踪 :Web应用可以使用HTTP会话跟踪机制,Servlet可以通过 HttpSession 对象来管理用户的会话状态。

  5. 异步处理 :Servlet 3.0及以上版本支持异步处理,允许Servlet将请求处理任务提交到一个单独的线程,并立即返回响应,从而提高Web应用的性能。

2.2.1 Servlet的创建和部署

创建Servlet的第一步是编写Servlet类,这个类必须继承自 javax.servlet.http.HttpServlet 。然后,我们需要在 web.xml 中进行配置,或者使用注解进行配置。

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;

public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        out.println("<h1>Hello, World!</h1>");
    }

    @Override
    public void init() throws ServletException {
        // 可以在这里执行初始化代码
    }
}

对于部署,如果使用 web.xml ,则配置如下:

<servlet>
    <servlet-name>HelloServlet</servlet-name>
    <servlet-class>com.example.HelloServlet</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>HelloServlet</servlet-name>
    <url-pattern>/hello</url-pattern>
</servlet-mapping>

如果使用注解,则需要在Servlet类上添加 @WebServlet 注解:

@WebServlet(name = "HelloServlet", urlPatterns = { "/hello" })

2.2.2 Servlet的配置方法

Servlet的配置方法主要有两种:通过 web.xml 文件和通过注解。

  1. 通过web.xml配置
    • web.xml 中定义Servlet及其URL映射。
    • 可以设置初始化参数,通过 <init-param> 元素配置。
<servlet>
    <servlet-name>MyServlet</servlet-name>
    <servlet-class>com.example.MyServlet</servlet-class>
    <init-param>
        <param-name>configParam</param-name>
        <param-value>value</param-value>
    </init-param>
</servlet>

<servlet-mapping>
    <servlet-name>MyServlet</servlet-name>
    <url-pattern>/myapp</url-pattern>
</servlet-mapping>
  1. 通过注解配置
    • 使用 @WebServlet 注解,可以直接在Servlet类上定义URL映射和初始化参数。
    • 注解方式简单直接,配置更灵活。
@WebServlet(name = "MyServlet", urlPatterns = { "/myapp" }, initParams = {
    @WebInitParam(name = "configParam", value = "value")
})

Servlet配置方法的选择依赖于项目的具体需求和个人偏好。通过注解配置更为简洁,但 web.xml 配置提供了更好的可视化管理和集中式配置。

3. HTTP请求与响应机制

3.1 HTTP协议基本概念和结构

3.1.1 HTTP协议概述

超文本传输协议(HTTP)是一个无状态的请求/响应协议,它允许计算机网络在应用程序之间传递超文本(如网页)。HTTP 是互联网上应用最为广泛的一种网络协议。它定义了客户端如何发送请求到服务器、服务器如何响应请求以及数据如何传输的规范。

随着互联网技术的发展,HTTP 协议也在不断进化,目前已经发展到了HTTP/2和HTTP/3版本。HTTP/1.1版本作为中间标准,对HTTP/1.0进行了大量改进,如持久连接、分块传输编码和虚拟主机支持等。持久连接(Persistent Connections)允许复用TCP连接,减少了连接次数,提升效率。分块传输编码(Chunked Transfer Encoding)可以按块传输数据,有利于大数据的传输。虚拟主机支持则允许在同一服务器上运行多个网站。

3.1.2 HTTP请求和响应消息格式

HTTP请求由请求行、请求头、空行和请求体四个部分组成。请求行包含请求方法(GET、POST、PUT、DELETE等)、请求的URI以及HTTP版本;请求头则包含客户端请求服务器所需的各种附加信息,例如:用户代理、接受的内容类型等;空行用来分隔请求头和请求体;请求体则包含主体内容,比如表单提交的数据。

HTTP响应同样由四个部分组成:状态行、响应头、空行和响应体。状态行包含了HTTP版本、状态码和状态码解释;响应头包含了服务器返回给客户端的信息,例如:服务器类型、日期和内容类型等;空行用来分隔响应头和响应体;响应体包含服务器返回给客户端的实际数据。

3.2 HTTP协议的高级应用

3.2.1 HTTP状态码的使用和理解

HTTP状态码用于描述响应服务器发送给客户端的状态。状态码由三位数字组成,分为五大类:

  • 1xx(信息性状态码):接收的请求正在处理。
  • 2xx(成功状态码):请求正常处理完毕。
  • 3xx(重定向状态码):需要进行附加操作以完成请求。
  • 4xx(客户端错误状态码):服务器无法处理请求。
  • 5xx(服务器错误状态码):服务器处理请求出错。

常见的状态码有200 OK(请求成功)、404 Not Found(未找到请求的页面)和500 Internal Server Error(服务器内部错误)等。

3.2.2 HTTP协议中的Session和Cookie

Session(会话)和Cookie都是Web开发中用于维持用户状态的技术。

  • Cookie是一种由服务器发送给用户浏览器并保存在本地的一小块数据,它会在随后的请求中被浏览器自动发送到服务器。常见的应用包括:用户登录凭证、购物车状态等。Cookie的安全性可以通过设置HttpOnly和Secure属性来增强。

  • Session是服务器端的技术,服务器为每个用户创建一个唯一的Session ID,并将此ID通过Cookie返回给浏览器,以便后续请求中识别用户。Session技术的关键在于能够在服务器端存储用户状态,例如用户登录状态、用户购物车信息等。Session比Cookie更安全,因为Session数据保存在服务器端,而不是在用户的浏览器上。

flowchart LR
    浏览器 -->|发送请求| 服务器
    服务器 -->|响应请求| 浏览器
    浏览器 -.->|存储Cookie| Cookie存储
    浏览器 -->|请求中携带Session ID| 服务器
    服务器 -->|检索Session| Session存储

在实际应用中,Session和Cookie经常配合使用,以提供安全的用户状态管理解决方案。

// 一个简单的Java Servlet示例代码,演示了如何设置和获取Session属性
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;

public class SessionExampleServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        HttpSession session = request.getSession(); // 获取Session
        session.setAttribute("username", "JohnDoe"); // 设置Session属性
        PrintWriter out = response.getWriter();
        out.println("Welcome " + session.getAttribute("username") + "<br>");
    }
}

在上述代码中,当用户访问此Servlet时,会创建一个新的Session(如果还没有的话),然后将”username”属性存储在Session中。下一次用户发出请求时,Servlet将能够通过Session获取之前设置的”username”属性。

通过本章的介绍,读者应能充分理解HTTP请求和响应机制,并对如何在实际开发中应用状态维持技术有更深入的认识。接下来的章节将继续探讨会话状态维持技术的细节与实践。

4. 会话状态维持技术

4.1 Cookie技术的工作原理

4.1.1 Cookie的基本使用

Cookie是一种在客户端存储数据的技术,用于在用户与网站交互时保持状态信息。Web服务器可以发送一个或多个Cookie到客户端,然后由客户端浏览器存储这些Cookie,并在随后的请求中发送回服务器。在Java Web开发中,Servlet API提供了操作Cookie的简单方法。

例如,要创建一个简单的Cookie并发送给客户端,可以使用以下代码:

Cookie myCookie = new Cookie("user", "JohnDoe");
response.addCookie(myCookie);

这个例子中,我们创建了一个名为”user”,值为”JohnDoe”的Cookie对象,并通过响应对象发送给客户端。客户端浏览器会将这个Cookie存储起来,并在未来的对该网站的每次请求中自动附带。

4.1.2 Cookie的安全性考虑

虽然Cookie提供了一种方便的方式来存储客户端状态信息,但它也引入了一些安全问题。为了应对这些安全问题,开发者应该采取一些措施来保护Cookie数据。

  • 设置HttpOnly属性 :当Cookie设置了HttpOnly属性后,JavaScript将无法访问该Cookie。这有助于防止跨站脚本攻击(XSS)。
Cookie myCookie = new Cookie("user", "JohnDoe");
myCookie.setHttpOnly(true);
response.addCookie(myCookie);
  • 使用Secure属性 :Secure属性指示浏览器仅通过安全的HTTPS连接发送Cookie。这样可以降低中间人攻击的风险。
Cookie myCookie = new Cookie("user", "JohnDoe");
myCookie.setSecure(true);
response.addCookie(myCookie);
  • 设置过期时间 :如果不为Cookie设置过期时间,那么它默认在浏览器会话结束时失效。对于持久化存储,可以手动设置一个过期时间。
Cookie myCookie = new Cookie("user", "JohnDoe");
myCookie.setMaxAge(60*60*24); // 有效期为一天
response.addCookie(myCookie);

4.2 Session技术的实现和应用

4.2.1 Session的原理和配置

Session与Cookie的不同之处在于,Session数据是在服务器端存储的,而不是客户端。当客户端第一次访问应用时,服务器会创建一个新的Session对象,并分配一个唯一的Session ID,然后将这个ID作为Cookie发送给客户端。客户端浏览器在随后的请求中将携带这个Session ID,服务器通过ID识别会话。

在Java Web应用中,可以通过调用 request.getSession() 方法来获取当前用户的Session对象:

HttpSession session = request.getSession(true);
session.setAttribute("user", "JohnDoe");

如果调用 getSession() 时不传参数,如果当前请求已经有一个Session存在,那么会返回这个已存在的Session对象;如果没有,则会创建一个新的Session对象。传入 true 参数时,无论是否存在Session,都会创建一个新的。

4.2.2 Session在实际开发中的应用案例

在实际开发中,Session可以用于存储用户登录信息、购物车内容、用户偏好设置等。例如,对于一个在线购物应用,可以将用户选中的商品存储在Session中,以便在用户结账时使用。

// 用户选择商品后
HttpSession session = request.getSession(true);
List<String> cartItems = (List<String>) session.getAttribute("cartItems");
if (cartItems == null) {
    cartItems = new ArrayList<>();
}
cartItems.add(productName);
session.setAttribute("cartItems", cartItems);

在这个例子中,用户每选择一个商品,就将其名称添加到 cartItems 列表中,并通过Session存储。这样用户在浏览网站时,即使刷新页面,商品信息也不会丢失,而是会保存在服务器端的Session中。

会话状态维持技术的表格对比

特性 Cookie Session
存储位置 客户端 服务器端
容量限制 受浏览器安全设置限制 取决于服务器配置
数据类型 文本 任何类型
传输方式 在HTTP请求中传输 通过Session ID在HTTP请求中传输
安全性 可以被用户查看和修改(不安全) 存储在服务器上(更安全)
过期控制 客户端或浏览器控制 服务器端控制

通过上表,我们可以看到Cookie和Session各自的特点,以及在选择使用它们来维持会话状态时需要考虑的因素。

5. JSP技术与页面开发

5.1 JSP的基本语法和内置对象

5.1.1 JSP语法概览

JSP(JavaServer Pages)是一种实现动态网页内容的技术,允许开发者将Java代码嵌入到HTML页面中。当Web服务器接收到对JSP页面的请求时,它将执行这些代码,并将生成的HTML发送给客户端浏览器。

JSP页面通常以 .jsp 扩展名结尾,它包含了静态数据和JSP元素,如脚本元素、指令、动作等。基本的JSP语法包括以下几种:

  • 脚本元素 :允许开发者在JSP页面中嵌入Java代码。
  • 指令 :用于设置与整个JSP页面相关的属性,如页面指令、包含指令和标签库指令。
  • 动作 :用于生成HTML输出,如 <jsp:include> <jsp:forward> 等。
  • 注释 :在JSP页面中添加注释,这些注释不会被发送到客户端。

下面是一个简单的JSP页面示例:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Hello, JSP!</title>
</head>
<body>
<%-- 这是一个JSP注释 --%>
<% 
    String name = request.getParameter("name");
    out.println("Hello, " + name + "!");
%>
</body>
</html>

在这个示例中,我们首先设置了页面的内容类型和语言,然后在HTML页面中嵌入了JSP脚本代码来输出一条欢迎信息。

5.1.2 JSP内置对象详解

JSP提供了九个内置对象,这些对象无需显式声明即可在JSP页面中使用。它们是:

  • request :封装了客户端的请求。
  • response :封装了对客户端的响应。
  • session :代表了用户会话。
  • application :代表了整个Web应用环境。
  • out :用于在响应中输出数据。
  • config :提供了Servlet配置信息。
  • pageContext :提供了对JSP页面所有对象及命名空间的访问。
  • page :代表当前的JSP页面实例,通常与this相同。
  • exception :在错误页面中使用,表示异常信息。

这些内置对象为JSP页面提供了与Servlet相同的强大功能,同时简化了代码的编写。例如,我们可以在JSP页面中使用 request.getParameter() 方法来获取客户端请求中的参数,或者使用 session.setAttribute() 来存储会话范围内的属性。

5.2 JSP的高级特性应用

5.2.1 JSP标签库的使用

JSP标签库允许开发者通过XML标签的方式使用各种自定义的标签功能,这些标签可以用来替代传统的JSP脚本元素,提高代码的可读性和可维护性。JSTL(JavaServer Pages Standard Tag Library)是JSP技术中广泛使用的一个标准标签库。

以下是一个使用JSTL核心标签库的简单示例:

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<head>
    <title>Using JSTL Tags</title>
</head>
<body>
    <c:forEach var="number" begin="1" end="10">
        <p>Number: ${number}</p>
    </c:forEach>
</body>
</html>

在这个例子中, <c:forEach> 标签被用来迭代输出1到10的数字。JSTL标签库的使用让页面结构更加清晰,代码更加易于管理和维护。

5.2.2 JSP页面的国际化处理

随着应用的国际化需求增加,JSP也提供了支持多语言和区域设置的能力。通过使用资源包(Resource Bundle)来管理和存储不同语言的消息,JSP页面可以根据客户端的语言偏好来显示相应的内容。

下面是一个简单的国际化处理示例:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page pageEncoding="UTF-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<head>
    <title>Internationalization Example</title>
</head>
<body>
    <c:set var="msg" value="${bundle['welcome.message']}" />
    <h1>${msg}</h1>
</body>
</html>

在这个例子中, <c:set> 标签用于设置一个消息变量,该消息来自于一个名为 bundle 的资源包。这个资源包可能包含多种语言版本的消息,JSP会根据用户的语言偏好自动选择合适的消息内容。

通过这些高级特性的应用,JSP页面开发变得更加灵活和强大。开发者可以通过JSP标签库简化页面设计,同时实现页面的国际化,以适应全球用户的需求。

6. EL表达式和JSTL标签库

6.1 EL表达式的语法和功能

6.1.1 EL表达式的定义和使用场景

EL(Expression Language)表达式语言是JSP规范中定义的一种用于简化JSP页面中Java代码片段的语言。它提供了一种标准的方法来访问Java对象的属性以及Java集合、数组和其他类型的数据。EL表达式使得数据处理更加容易,同时保持了JSP页面的清晰和简洁。

EL表达式的使用场景非常广泛,特别是在需要展示数据的JSP页面中。它可以用来动态生成页面内容,如列表、表格或者文本。例如,在一个电商网站的商品列表页面上,EL表达式可以用来生成每个商品的名称、价格和描述。此外,EL还能够在不写Java代码的情况下,实现对请求、会话和应用范围对象的数据访问。

6.1.2 EL表达式与JSP页面的结合

EL表达式在JSP页面中以 ${expression} 的形式出现。它可以直接嵌入到HTML标记中,与其他内容一起构成输出。与JSP脚本片段(如 <% %> )相比,EL表达式使得页面的结构更加清晰,便于美工和前端开发人员阅读。

例如,在一个JSP页面中,显示用户的名字可以使用如下EL表达式:

<h2>Welcome, ${user.name}!</h2>

如果 user 是存放在session作用域的一个对象,并且 name 是该对象的一个属性,那么上述EL表达式将直接渲染出用户的名字。

EL表达式还支持一些运算操作,如算术运算、逻辑运算和比较运算。这使得它不仅能够从对象中检索数据,还能够进行一些基本的数据处理。

<p>The total price is: ${item.price * item.quantity}</p>

在上述例子中,假设 item 是一个对象,拥有 price quantity 属性,EL表达式将计算总价并展示在页面上。

在使用EL表达式时,需要注意一些隐式对象(如 pageContext request session application )也可以直接在EL中被访问。这为数据访问提供了极大的方便,但在某些情况下也可能带来安全风险,特别是当没有正确配置访问权限时。

6.2 JSTL标签库的介绍和实例应用

6.2.1 JSTL标签库概览

JSTL(JavaServer Pages Standard Tag Library)是一个实现JSP页面中常见任务的自定义标签库。它提供了条件判断、循环、URL操作、国际化支持以及数据处理等功能。JSTL标签库极大地简化了JSP页面的编写,并提供了更好的可读性和可维护性。

JSTL标签库分为四类,分别对应不同的功能:

  • Core标签:处理条件、循环、变量定义等基本任务。
  • Formatting标签:提供数据格式化功能,包括日期、数字、消息格式化等。
  • XML标签:处理XML文档的解析和转换。
  • SQL标签:操作数据库,执行SQL命令,通常与JDBC标签库结合使用。

在JSP页面中使用JSTL标签,需要引入相应的标签库。例如,使用Core标签需要在页面顶部添加如下指令:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

6.2.2 JSTL标签在页面中的应用实例

以Core标签库为例,下面是一个使用 <c:forEach> 标签进行列表迭代的简单例子。假设我们有一个用户列表,需要在JSP页面中展示每一个用户的名字和年龄:

<c:forEach items="${users}" var="user">
    <p>User Name: ${user.name}, Age: ${user.age}</p>
</c:forEach>

在这个例子中, ${users} 是一个范围变量,表示一个用户对象的集合。 <c:forEach> 标签会遍历集合中的每一个用户对象,并将其赋值给变量 user 。然后 ${user.name} ${user.age} 分别输出用户的名字和年龄。

另一个常见的例子是使用 <c:if> 标签进行条件判断:

<c:if test="${not empty user}">
    <p>Hello, ${user.name}!</p>
</c:if>

在这个例子中, <c:if> 标签根据 ${not empty user} 的判断结果来决定是否显示欢迎信息。如果 user 对象非空,那么用户将看到欢迎信息。

除了上述例子,JSTL标签库还包含很多其他的标签,例如用于国际化处理的 <fmt:formatDate> 、用于URL重定向的 <c:redirect> 等。通过合理使用JSTL标签,可以有效地组织JSP页面的代码,使得页面结构更清晰,维护和更新变得更加容易。

7. Servlet高级特性

7.1 过滤器(Filter)的应用和实现

过滤器(Filter)是Java Servlet技术中用于对Web服务器的请求和响应进行拦截处理的一种技术,它主要用于在请求到达Servlet之前或响应发送回客户端之前进行预处理或后处理。在进行请求和响应处理时,过滤器能为Web应用提供额外的功能,例如安全验证、日志记录、字符编码转换等。

7.1.1 过滤器的基本概念和作用

过滤器主要由三个主要组件构成:

  • Filter 接口:定义了过滤器的核心方法,包括 init , doFilter , 和 destroy
  • FilterConfig 接口:提供对过滤器的初始化参数的访问。
  • web.xml 配置文件:用于配置过滤器以及它所拦截的资源。

过滤器在Web应用中的主要作用包括:

  • 对请求和响应进行预处理或后处理,例如修改请求头或响应头。
  • 对特定类型的资源进行拦截,只有满足条件的请求才能通过过滤器。
  • 实现跨多个Servlet和JSP页面的全局操作。

7.1.2 过滤器在Web应用中的应用实例

例如,我们想实现一个简单的字符编码转换过滤器,确保所有的请求都采用UTF-8编码,可以按照以下步骤实现:

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;

public class CharacterEncodingFilter implements Filter {
    private String encoding = "UTF-8";

    @Override
    public void init(FilterConfig filterConfig) {
        // 从web.xml中获取初始化参数
        String encodingParam = filterConfig.getInitParameter("encoding");
        if (encodingParam != null) {
            encoding = encodingParam;
        }
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        // 设置请求和响应的字符编码
        request.setCharacterEncoding(encoding);
        response.setCharacterEncoding(encoding);

        // 继续处理请求
        chain.doFilter(request, response);
    }

    @Override
    public void destroy() {
        // 销毁时的操作,如释放资源等
    }
}

web.xml 中配置过滤器:

<filter>
    <filter-name>CharacterEncodingFilter</filter-name>
    <filter-class>CharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

7.2 监听器(Listener)的使用和分类

监听器是Servlet API中用于监听Web应用中域对象(如request、session、application)创建、销毁和属性变化等事件的组件。通过监听器,开发者可以在对象生命周期的各个阶段执行相应的逻辑,如进行对象初始化、资源清理、统计信息跟踪等。

7.2.1 监听器的基本原理和类型

监听器接口包括:

  • ServletContextListener :用于监听Web应用的启动和销毁事件。
  • HttpSessionListener :用于监听session的创建和销毁事件。
  • ServletRequestListener :用于监听请求的创建和销毁事件。
  • 以及对应的属性监听器,如 ServletContextAttributeListener 等。

每个监听器接口都包含两个核心方法:

  • contextInitialized :在监听器对象创建时被调用。
  • contextDestroyed :在监听器对象销毁时被调用。

7.2.2 实际开发中监听器的应用场景

以一个应用启动时初始化数据的场景为例,我们可以通过 ServletContextListener 来实现:

import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import java.util.concurrent.atomic.AtomicInteger;

public class MyServletContextListener implements ServletContextListener,
        ServletContextAttributeListener {
    private AtomicInteger sessionCounter = new AtomicInteger();

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        // 在Web应用启动时执行初始化操作
        sce.getServletContext().setAttribute("sessionCount", sessionCounter);
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        // 在Web应用销毁时执行清理操作
    }

    @Override
    public void attributeAdded(ServletContextAttributeEvent sbae) {
        // 监听属性添加时的操作
        if ("sessionCount".equals(sbae.getName())) {
            Object value = sbae.getValue();
            if (value instanceof AtomicInteger) {
                sessionCounter = (AtomicInteger) value;
            }
        }
    }

    @Override
    public void attributeRemoved(ServletContextAttributeEvent sbae) {
        // 监听属性移除时的操作
    }

    @Override
    public void attributeReplaced(ServletContextAttributeEvent sbae) {
        // 监听属性替换时的操作
    }
}

web.xml 中配置监听器:

<listener>
    <listener-class>MyServletContextListener</listener-class>
</listener>

以上提供的代码示例和配置文件演示了如何在Java Web应用中实现和配置过滤器和监听器。这些高级特性为开发者提供了灵活的方式来处理请求响应流程和应用状态的变化,增强了Web应用的可维护性和扩展性。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:Java Web教学PPT包含多个章节,从Web基础到Java Web技术的深入应用。章节包括HTTP、HTML、CSS、JavaScript、Servlet生命周期、HTTP请求与响应、会话技术、JSP技术、EL表达式和JSTL、Servlet高级特性,以及“传智书城”项目的前后端设计。这套教程是学习和巩固Java Web开发技能的宝贵资源,能够帮助开发者从理论到实践全方位掌握Web应用开发的技能。


本文还有配套的精品资源,点击获取
menu-r.4af5f7ec.gif

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐