Java Web应用开发

侯玉香,聂军,雷秦川,骆丽华,陈道敏,苗莹莹,刘叶

目录

  • 1 Java Web概述
    • 1.1 任务导引
    • 1.2 动态网页技术介绍
    • 1.3 JSP的运行环境
    • 1.4 JSP的运行原理
    • 1.5 JSP程序开发模式
    • 1.6 JSP开发工具
    • 1.7 任务实施:搭建项目环境及公司主页设计
    • 1.8 学习测验
  • 2 JSP基本语法
    • 2.1 任务导引
    • 2.2 JSP的基本组成
    • 2.3 脚本元素
    • 2.4 指令元素
    • 2.5 动作元素
    • 2.6 任务实施
    • 2.7 学习测验
  • 3 服务器交互
    • 3.1 任务导引
    • 3.2 课堂实录
    • 3.3 JSP内置对象概述
    • 3.4 out对象
    • 3.5 request对象
    • 3.6 response对象
    • 3.7 session对象
    • 3.8 application对象
    • 3.9 其他内置对象
    • 3.10 任务实施:使用JSP内置对象实现登录和注销功能
    • 3.11 学习测验
  • 4 JavaBean技术
    • 4.1 任务引导
    • 4.2 JavaBean概述
    • 4.3 JavaBean的应用
    • 4.4 JavaBean的作用域
    • 4.5 任务实施
    • 4.6 JSP中的文件操作
    • 4.7 学习测验
  • 5 Servlet技术
    • 5.1 任务引导
    • 5.2 Servlet基础
    • 5.3 Servlet开发
    • 5.4 Servlet常用API
    • 5.5 任务实施
    • 5.6 章节测验
  • 6 第6章 过滤器和监听器
    • 6.1 任务导引
    • 6.2 Servlet过滤器
    • 6.3 过滤器创建与配置
    • 6.4 Servlet监听器
    • 6.5 Servlet3.0新特性
    • 6.6 任务实施
    • 6.7 学习测验
  • 7 Java Web的数据库操作
    • 7.1 任务导引
    • 7.2 JDBC技术
    • 7.3 使用JDBC驱动程序访问数据库
    • 7.4 数据库连接的JavaBean
    • 7.5 JDBC对事务的操作
    • 7.6 连接池技术
    • 7.7 任务实施
    • 7.8 扩展阅读
    • 7.9 章节测验
  • 8 JSP高级技术
    • 8.1 任务导引
    • 8.2 EL概述
    • 8.3 JSTL标签库简介
    • 8.4 JSTL核心标签
    • 8.5 JSP与Ajax
    • 8.6 任务实施
    • 8.7 扩展阅读
    • 8.8 学习测验
  • 9 JSP实用组件技术
    • 9.1 任务导引
    • 9.2 上传与下载组件
    • 9.3 发送E-mail
    • 9.4 JSP动态图表
    • 9.5 在线编辑器
    • 9.6 任务实施
  • 10 教学过程材料
    • 10.1 2024-2025学年第一学期
      • 10.1.1 教学大纲
      • 10.1.2 授课计划
      • 10.1.3 实训指导书
      • 10.1.4 教案
      • 10.1.5 课件PPT
    • 10.2 2024-2025学年第二学期
      • 10.2.1 教学大纲
      • 10.2.2 授课计划
      • 10.2.3 实训指导书
      • 10.2.4 教案
      • 10.2.5 课件PPT
    • 10.3 2025-2026学年第一学期
      • 10.3.1 教学大纲
      • 10.3.2 授课计划
      • 10.3.3 实训指导书
      • 10.3.4 教案
      • 10.3.5 课件PPT
    • 10.4 2025-2026学年第二学期
      • 10.4.1 教学大纲
      • 10.4.2 授课计划
      • 10.4.3 实训指导书
      • 10.4.4 教案
      • 10.4.5 课件PPT
  • 11 课外资料
    • 11.1 电子书
      • 11.1.1 JavaWeb从入门到精通
      • 11.1.2 JavaWeb开发详解
      • 11.1.3 JavaWeb开发之道
      • 11.1.4 深入体验JavaWeb开发内幕-核心基础
      • 11.1.5 学通JavaWeb的24堂课
      • 11.1.6 Java Web 程序设计
      • 11.1.7 Java Web程序设计教程
      • 11.1.8 Java Web设计与应用教程
      • 11.1.9 Java_Web编程新手自学手册
      • 11.1.10 Tomcat and Java Web 开发技术详解
      • 11.1.11 Spring Boot 2+Thymeleaf企业应用实战
      • 11.1.12 Spring Boot+Vue全栈开发实战
      • 11.1.13 Spring实战
      • 11.1.14 JavaEE 8+Tomcat 9
    • 11.2 教学视频
      • 11.2.1 JDBC基础教学视频
      • 11.2.2 JDBC高级应用教学视频
过滤器创建与配置


1.创建过滤器

       过滤器对象放置在javax.servlet包中,其名称为Filter,它是一个接口。除了这个接口外,与过滤器相关的对象还有FilterConfig对象与FilterChain对象,这个两个对象同样是接口,位于javax.servlet包中,分别为过滤器的配置对象与传递对象。实际开发中,定义过滤器只需要实现Filter接口即可,见下图


Filter接口:每一个过滤器对象都要直接或间接地实现Filter接口,在Filter接口中定义了3个方法,分别为init()方法、doFilter()方法和destroy()方法,其方法声明及说明如下表所示。

Filter接口的方法声明及说明


方法声明说明
public void init(FilterCofig filterConfig)throws ServletException过滤器初始化方法,该方法在过滤器初始化时调用
public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain) throw IOException,ServletException对请求进行过滤处理
public void destroy()销毁方法,以便释放资源

FilterConfig接口的方法声明及说明



方法声明说明
public String getFilterName()用于获取过滤器的名字
public ServletContext getServletContext()获取Servlet上下文
public String getInitParameter(String name)获取过滤器的初始化参数值
public Enumeration getInitParameterNames()获取过滤器的所有初始化参数

FilterChain接口仍然由Servlet容器进行实现,在这个接口中只有一个方法,其方法声明如下:


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

该方法用于将过滤后的请求传递给下一个过滤器,如果此过滤器已经是过滤器链中的最后一个过滤器,那么,请求将传递给目标资源

【案例6-1】创建名为MyFilter的过滤器对象。

package ch6;


import java.io.IOException;

import javax.servlet.Filter;

import javax.servlet.FilterChain;

import javax.servlet.FilterConfig;

import javax.servlet.ServletException;

import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse;


public class MyFilter implements Filter{

@Override

public void init(FilterConfig arg0) throws ServletException {

System.out.println("初始化处理");

}

@Override

public void doFilter(ServletRequest request, ServletResponse response,

FilterChain chain) throws IOException, ServletException {

System.out.println("过滤处理");

chain.doFilter(request, response);//向下传递过滤器

}

@Override

public void destroy() {

System.out.println("释放资源");

}

}

过滤器处理的业务逻辑需要编写到doFilter()方法中,在请求过滤处理后,需要调用chain参数的doFilter()方法将请求向下传递给下一过滤器或者目标资源。

2.配置过滤器


配置Servlet过滤器包括下面两个步骤: 

(1)命名Servlet过滤器和指定Servlet过滤器相应的实现类,并且可选择指定传递至Servlet过滤器的初始化参数。配置代码如下: 

<filter>

     <filter-name>FilterName</filter-name>

     <filter-class>package.className </filter-class>

     <init-param>

         <param-name>ParamName1</param-name>

         <param-value>ParamValue1</param-value>

     </init-param>

     <init-param>

        <param-name>ParamName2</param-name>

        <param-value>ParamValue2</param-value>

     </init-param>

</filter> 

FilterName是过滤器的名称,package.className是过滤器的实现类,<init-param>是可选的元素,用来给过滤器提供初始化参数,过滤器可包含多个<init-param>子元素。

(2)将Servlet 过滤器映射至URL或 Servlet,这是通过<filter-mapping>元素来实现的。将Servlet 过滤器映射至 URL的配置代码如下:

<filter-mapping>

<filter-name>FilterName</filter-name>

<url-pattern>/path</url-pattern>

</filter-mapping>  

<filter-name>元素和上面<filter>元素的子元素<filter-name>一致。<url-pattern>元素指定了过滤器的映射路径,Servlet过滤器还可以映射至Servlet:

<filter-mapping>

<filter-name>FilterName</filter-name>

<servlet-name>ServletName</servlet-name>

</filter-mapping>  

<filter-name>元素和<filter>元素的子元素<filter-name>一致。<servlet-name>元素指定过滤器映射的Servlet的名称。

【案例6-2】配置MyFilter过滤器。

<?xml version="1.0" encoding="UTF-8"?>

<web-app>

 <filter>

    <filter-name>MyFilter</filter-name>

    <filter-class>ch6.MyFilter</filter-class>

  </filter>

  <filter-mapping>

  <filter-name>MyFilter</filter-name>

  <url-pattern>/MyFilter</url-pattern>

  </filter-mapping> 

</web-app>

【案例6-3】创建一个过滤器实现网站访问计数器的功能,并在配置文件将网站访问量的初始值设置为1000。

package ch6;


import java.io.IOException;

import javax.servlet.Filter;

import javax.servlet.FilterChain;

import javax.servlet.FilterConfig;

import javax.servlet.ServletContext;

import javax.servlet.ServletException;

import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse;

import javax.servlet.http.HttpServletRequest;


public class CountFilter implements Filter {

// 来访数量

private int count;

@Override

public void init(FilterConfig filterConfig) throws ServletException {

// 获取初始化参数

String param = filterConfig.getInitParameter("count");

// 将字符串转换为int

count = Integer.valueOf(param);

}


@Override

public void doFilter(ServletRequest request, ServletResponse response,

FilterChain chain) throws IOException, ServletException {

// 访问数量自增

count ++;

// 将ServletRequest转换成HttpServletRequest

HttpServletRequest req = (HttpServletRequest) request;

// 获取ServletContext

ServletContext context = req.getSession().getServletContext();

//将访问数量值放入ServletContext中

context.setAttribute("count", count);

//向下传递过滤器

chain.doFilter(request, response);

}


@Override

public void destroy() {


}

}

配置文件web.xml:

<?xml version="1.0" encoding="UTF-8"?>

<web-app>

 <!-- 过滤器声明 -->

<filter>

<!-- 过滤器的名称 -->

<filter-name>CountFilter</filter-name>

<!-- 过滤器的完整类名 -->

<filter-class>ch6.CountFilter</filter-class>

<!-- 设置初始化参数 -->

<init-param>

<!-- 参数名 -->

<param-name>count</param-name>

<!-- 参数值 -->

<param-value>1000</param-value>

</init-param>

</filter>

<!-- 过滤器映射 -->

<filter-mapping>

<!-- 过滤器名称 -->

<filter-name>CountFilter</filter-name>

<!-- 过滤器URL映射 -->

<url-pattern>/example/ch6/count.jsp</url-pattern>

</filter-mapping>

</web-app>

页面文件count.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>人数统计</title>

</head>

<body>

<h2>

欢迎光临,<br>

您是本站的第【 

<%=application.getAttribute("count") %>

】位访客!

</h2>

</body>

</html>

效果图如下:


3.字符编码过滤器

       在Java Web程序开发中,由于Web容器内部所使用编码格式并不支持中文字符集,所以,处理浏览器请求中的中文数据,就会出现乱码现象,如图所示。


       在实际开发过程中,如果通过在每一个业务处理中指定中文字符集编码,操作过于烦琐,而且容易遗漏某一个业务中的字符编码设置。如果通过过滤器来处理字符编码,就可以做到简单又万无一失,如下图所示:


       在Web应用中部署了字符编码过滤器后,即使Web容器的编码格式不支持中文,但浏览器的每一次请求都会经过过滤器进行转码,所以也就完全避免了中文乱码现象的产生。

【案例6-4】创建字符编码过滤器,避免中文乱码现象的产生。

package ch6;


import java.io.IOException;

import javax.servlet.Filter;

import javax.servlet.FilterChain;

import javax.servlet.FilterConfig;

import javax.servlet.ServletException;

import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse;

// 字符编码过滤器

public class CharactorFilter implements Filter {

// 字符编码

String encoding = null;

@Override

public void destroy() {

encoding = null;

}


@Override

public void doFilter(ServletRequest request, ServletResponse response,

FilterChain chain) throws IOException, ServletException {

// 判断字符编码是否为空

if(encoding != null){

// 设置request字符编码

request.setCharacterEncoding(encoding);

// 设置response字符编码

              response.setContentType("text/html; charset="+encoding);

}

// 传递给下一过滤器

chain.doFilter(request, response);

}


@Override

public void init(FilterConfig filterConfig) throws ServletException {

// 获取初始化参数

encoding = filterConfig.getInitParameter("encoding");

}

}

CharactorFilter的配置代码如下:

<?xml version="1.0" encoding="UTF-8"?>

<web-app>

<!--声明过滤器-->

 <filter>

<!-- 过滤器名称 -->

<filter-name>CharactorFilter</filter-name>

<!-- 过滤器的完整类名 -->

<filter-class>ch6.CharactorFilter</filter-class>

<!-- 初始化参数 -->

<init-param>

<!-- 参数名 -->

<param-name>encoding</param-name>

<!-- 参数值 -->

<param-value>UTF-8</param-value>

</init-param>

  </filter>

  <!-- 过滤器映射 -->

  <filter-mapping>

<!-- 过滤器名称 -->

<filter-name>CharactorFilter</filter-name>

<!-- URL映射 -->

<url-pattern>/*</url-pattern>

  </filter-mapping>

</web-app>

在过滤器CharactorFilter的配置声明中,它的初始化参数encoding的值为UTF-8,它与JSP页面的编码格式相同,支持中文。过滤器的URL映射可以使用正则表达式进行配置,本例中使用“/*”来匹配所有请求。