Web三大组件之Filter,Listener和Servlet详解

Web三大组件之Filter, Listener和Servlet,是Java Web应用程序开发中不可缺少的三个组件。Servlet是用于处理请求的Java类,Listener是用于监听Web应用程序的状态变化的组件,而Filter是用于对请求和响应进行过滤处理的组件。

Filter详解

Filter是对请求和响应进行过滤处理的组件。它可以对请求参数、请求头、请求URL进行修改或拦截。Filter是在Servlet容器加载Servlet之前进行拦截处理的,与Servlet是一样级别的组件,不需要在web.xml配置中指定Filter,只需要在Filter类中使用@WebFilter()注解即可。

示例1:过滤敏感词汇

@WebFilter(filterName = "SensitiveWordFilter", urlPatterns = {"/*"})
public class SensitiveWordFilter implements Filter {

    private static final Logger logger = LoggerFactory.getLogger(SensitiveWordFilter.class);

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        logger.info("SensitiveWordFilter init...");
    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) resp;

        String uri = request.getRequestURI();
        if (uri.contains("sensitiveWord")) {
            String content = request.getParameter("content");
            String filter = "敏感词汇1,敏感词汇2,敏感词汇3"; // 假设这是过滤的词汇
            String[] filters = filter.split(",");
            for (String s : filters) {
                content = content.replaceAll(s, "**");
            }
            request.setAttribute("content", content);
        }

        chain.doFilter(request, response);
    }

    @Override
    public void destroy() {
        logger.info("SensitiveWordFilter destroy...");
    }
}

在上面的代码中,实现了对请求参数中包含特定关键字的拦截处理,将敏感词汇替换为**。

示例2:跨域请求

@WebFilter(filterName = "CorsFilter", urlPatterns = {"/*"})
public class CorsFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("CorsFilter init...");
    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
        HttpServletResponse response = (HttpServletResponse) resp;
        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setHeader("Access-Control-Allow-Methods", "POST, GET, PUT, DELETE, OPTIONS");
        response.setHeader("Access-Control-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization, Accept, X-Requested-With, remember-me");

        chain.doFilter(req, resp);
    }

    @Override
    public void destroy() {
        System.out.println("CorsFilter destroy...");
    }
}

在上面的代码中,实现了对跨域请求的拦截处理,允许前端发送跨域请求。

Listener详解

Listener是监听Web应用程序状态变化的组件,包括ServletRequest、HttpSession、ServletContext等的生命周期事件。Listener是一种特殊的Java类,需要实现Servlet规范中的javax.servlet.ServletContextListener、javax.servlet.http.HttpSessionListener、javax.servlet.ServletRequestListener等接口,用@WebListener()标识。

示例1:监听Servlet上下文

@WebListener
public class MyServletContextListener implements ServletContextListener {

    private static final Logger logger = LoggerFactory.getLogger(MyServletContextListener.class);

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        logger.info("ServletContextListener contextInitialized...");
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        logger.info("ServletContextListener contextDestroyed...");
    }
}

在上面的代码中,实现了对Servlet上下文状态变化的监听,包括ServletContext的初始化和销毁事件。

示例2:监听HttpSession

@WebListener
public class MySessionListener implements HttpSessionListener {

    private static final Logger logger = LoggerFactory.getLogger(MySessionListener.class);

    @Override
    public void sessionCreated(HttpSessionEvent se) {
        logger.info("SessionListener sessionCreated...");
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        logger.info("SessionListener sessionDestroyed...");
    }
}

在上面的代码中,实现了对HttpSession状态变化的监听,包括HttpSession的创建和销毁事件。

Servlet详解

Servlet是用于处理请求的Java类。它是一种基于Java的Web组件,用于扩展Web服务器的能力。实现Servlet需要扩展javax.servlet.http.HttpServlet类,同时需要在web.xml中进行配置。

示例1:Hello World Servlet

@WebServlet(name = "HelloWorldServlet", value = "/hello")
public class HelloWorldServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        out.println("<html><body>");
        out.println("<h3>Hello World Servlet!</h3>");
        out.println("</body></html>");
    }
}

在上面的代码中,实现了简单的Hello World Servlet,当浏览器请求/hello URL时,返回一个简单的HTML页面。

示例2:文件上传Servlet

@WebServlet(name = "FileUploadServlet", urlPatterns = {"/fileUpload"})
@MultipartConfig(location = "D:/temp")
public class FileUploadServlet extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");

        String savePath = request.getServletContext().getRealPath("/upload");// 上传文件存储目录
        File saveDir = new File(savePath);

        if (!saveDir.exists() && !saveDir.isDirectory()) {
            saveDir.mkdir();
        }

        // 消息提示
        String message = "";
        try {
            Part part = request.getPart("file");// 获取上传文件
            String fileName = getFileName(part);// 文件名
            part.write(savePath + "\\" + fileName);
            message = "文件上传成功!";
        } catch (Exception e) {
            e.printStackTrace();
            message = "文件上传失败!";
        }
        request.setAttribute("message", message);
        request.getRequestDispatcher(request.getContextPath() + "/index.jsp").forward(request, response);
    }

    // 获取文件名
    private String getFileName(Part part) {
        String header = part.getHeader("content-disposition");
        String[] arr = header.split(";");
        for (String s : arr) {
            if (s.trim().startsWith("filename")) {
                return s.substring(s.indexOf("=") + 2, s.length() - 1);
            }
        }
        return "";
    }
}

在上面的代码中,实现了一个文件上传Servlet,使用了@MultipartConfig注解来配置文件上传的存储位置,当有文件上传时,将其保存到指定目录,并返回上传成功或失败的消息提示。

综上所述,Filter, Listener和Servlet是Java Web应用程序开发中不可缺少的三大组件。通过本文的介绍,相信您已经了解了它们的作用和使用方法。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Web三大组件之Filter,Listener和Servlet详解 - Python技术站

(0)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • Python多进程multiprocessing用法实例分析

    Python多进程multiprocessing用法实例分析 本文将详细介绍Python内置库multiprocessing的用法,包括创建进程、进程间通信以及进程池等方面,同时会提供两个示例来帮助读者更好地理解使用multiprocessing进行并发编程的思想。 创建进程 Python的multiprocessing库提供了Process类来创建进程。以…

    云计算 2023年5月18日
    00
  • Python远程开发环境部署与调试过程图解

    下面我来详细讲解“Python远程开发环境部署与调试过程图解”的完整攻略。 准备工作 在进行远程开发环境的部署与调试之前,需要做一些准备工作: 在本地安装好Python环境和IDE,推荐使用VSCode; 在远程服务器上安装好Python环境; 配置好本地和远程服务器之间的SSH登录; 使用git等版本控制工具管理代码。 部署远程开发环境 在远程服务器上安装…

    云计算 2023年5月17日
    00
  • 21行Python代码实现拼写检查器

    下面我来详细讲解“21行Python代码实现拼写检查器”的完整攻略,具体步骤如下: 步骤一:下载数据集 首先,我们需要下载一个包含单词列表的数据集。常用的数据集包括 Google 10000 English 和 dwyl/english-words。这里以 dwyl/english-words 数据集为例,下载路径为 https://github.com/d…

    云计算 2023年5月18日
    00
  • Nodejs libuv运行原理详解

    Node.js libuv运行原理详解 Node.js是一种基于事件驱动、非阻塞I/O模型的服务器端JavaScript运行环境。在Node.js中,libuv是一个跨平台的异步I/O库,负责处理事件循环、文件I/O、网络I/O等操作。本文将详细介绍Node.js libuv的运行原理,并提供两个示例说明。 libuv的事件循环 libuv的事件循环是Nod…

    云计算 2023年5月16日
    00
  • python实现数据分析与建模

    Python实现数据分析与建模攻略 Python是一种广泛使用的编程语言,因其功能强大、易学易用而广受欢迎。在数据分析和建模方面,Python也拥有丰富的工具和库,如pandas、numpy、scikit-learn等,可以帮助我们更好地处理数据和构建模型。下面是一个Python实现数据分析与建模的完整攻略。 1. 数据获取 要进行数据分析和建模,首先需要获…

    云计算 2023年5月18日
    00
  • 在ASP.NET Core Mvc集成MarkDown的方法

    当我们需要在ASP.NET Core Mvc中使用Markdown时,可以采用以下简单的步骤进行集成。 添加依赖 首先,我们需要添加Markdown依赖项。打开NuGet包管理器控制台,执行以下命令: Install-Package Markdig 这将安装Markdig Markdown处理库。 创建处理器 接下来,我们需要一个处理器类,将文本转换成Mar…

    云计算 2023年5月17日
    00
  • 详解Python使用simplejson模块解析JSON的方法

    下面我将为你详细讲解如何使用Python中的simplejson模块解析JSON数据。 什么是JSON? JSON(JavaScript Object Notation)是轻量级的数据交换格式。它基于JavaScript语言的一个子集,使用简单的文本格式描述数据结构,可与Python、PHP等多种编程语言进行数据交换。 为什么要使用simplejson模块解…

    云计算 2023年5月18日
    00
  • 王家林的“云计算分布式大数据Hadoop实战高手之路—从零开始”的第九讲Hadoop图文训练课程:剖析NameNode和Secondary NameNode的工作机制和流程

    本讲主要剖析SecondaryNameNode。   “云计算分布式大数据Hadoop实战高手之路”之完整发布目录 云计算分布式大数据实战技术Hadoop交流群:312494188,每天都会在群中发布云计算实战性资料,欢迎大家加入!   Hadoop在启动的时候,会启动SecondaryNameNode,我们使用JPS命令查看一下查看一下Hadoop启动时启…

    云计算 2023年4月11日
    00
合作推广
合作推广
分享本页
返回顶部