JavaWeb里的控制器Servlet,过滤器Filter,监听器Listener

文章目录

    • 简介
    • 控制器servlet
      • 控制器(Controller)概述
      • 控制器的工作原理
      • 控制器的生命周期
      • 控制器的种类
      • 控制器的应用场景
      • 示例代码
        • Servlet控制器示例
        • Spring MVC控制器示例
      • 总结
    • 过滤器filter
      • 过滤器(Filter)概述
      • 过滤器的工作原理
      • 过滤器的生命周期
      • 过滤器的链式调用
      • 过滤器的应用场景
      • 示例代码
      • 总结
    • 监听器Listener
        • 监听器是Web应用程序事件模型的一部分
        • HttpSessionBindingListener接口![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/8d9288c43c09454e8afc3edd8a521159.png)
          • 实现步骤
          • 实现在线用户统计的步骤
          • HttpSessionBindingListener示例代码
          • valueBound()和valueUnbound()方法
      • HttpSessionListener接口:
      • HttpSessionListener和ServletContextListener
      • HttpSessionListener、HttpSessionBindingListener二者的 区别
      • 常用监听器接口

简介

JavaWeb中的控制器servlet、过滤器filter和监听器listener是三种常用的组件,用于处理请求和响应、过滤和监听事件。

  1. 控制器servlet:
    控制器servlet是处理用户请求并生成响应的组件。它可以接收HTTP请求,调用业务逻辑处理请求并生成响应。控制器servlet通常继承自javax.servlet.http.HttpServlet类,并通过重写doGet()和doPost()方法来处理GET和POST请求。它可以接收请求参数、访问数据库或其他资源,并将处理结果发送给客户端。

  2. 过滤器filter:
    过滤器filter是用于在请求到达servlet之前或响应返回给客户端之前对请求和响应进行处理的组件。过滤器可以拦截请求、修改请求参数、验证用户身份、记录日志等。过滤器接收HTTP请求并可以修改请求的头、内容或包装请求使其符合特定要求。同样地,它可以接收HTTP响应并修改响应的内容或包装响应使其符合特定要求。过滤器通常实现javax.servlet.Filter接口,并通过重写doFilter()方法进行请求和响应的处理。

  3. 监听器listener:
    监听器listener是用于监听Web应用程序中事件的组件。它可以监听ServletContext、HttpSession和ServletRequest等对象的创建、销毁以及属性变化等事件。监听器可以用于在事件发生时执行某些任务,比如在ServletContext初始化时加载配置信息、在HttpSession创建时记录用户登录信息等。监听器通常实现javax.servlet.ServletContextListener、javax.servlet.http.HttpSessionListener或javax.servlet.ServletRequestListener接口,并通过重写相应的方法来监听事件。

这三种组件在JavaWeb开发中经常被使用,可以根据不同的需求来选择合适的组件来处理请求、过滤和监听事件。

控制器servlet

学习JavaWeb中的控制器(Controller)是非常重要的,控制器通常用于接收用户请求、调用业务逻辑处理请求,并将处理结果返回给客户端。以下是关于JavaWeb控制器的学习笔记:

控制器(Controller)概述

  • 控制器是JavaWeb应用中用于接收和处理用户请求的组件,通常负责调度请求、调用服务层处理业务逻辑,并最终返回响应给客户端。
  • 控制器可以是一个Servlet、一个Spring MVC的Controller类或者其他框架提供的处理请求的组件。

控制器的工作原理

  1. 控制器接收来自客户端的请求,通常通过URL映射来确定具体的处理方法。
  2. 控制器调用服务层组件进行业务逻辑处理,可能涉及数据库操作、调用其他服务等。
  3. 控制器将处理结果封装成响应,返回给客户端。

控制器的生命周期

@WebServlet(name="indexServlet",urlPatterns = {"/index"})
public class IndexServlet extends HttpServlet {
//生命周期
//1.实例化
public IndexServlet(){
System.out.println("实例化IndexServlet");
}
//2.初始化 init
public void init() throws ServletException {
System.out.println("初始化init");
}
//3.提供服务(服务化) doget dopost 这两个方法可以重写

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    QuantityIndexService quantityIndexService =new QuantityIndexServiceImpl();
    List<QuantityIndex> list = quantityIndexService.getQuantityIndexs();
    request.getSession().setAttribute("list",list);

    response.sendRedirect("index.jsp");
}

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    response.sendRedirect("welcome1.jsp");

}
//4.销毁 destory
public void destroy() {
}
}

控制器的种类

  1. Servlet控制器:基于Servlet实现的控制器,通过继承HttpServlet类来处理请求。
  2. Spring MVC控制器:基于Spring MVC框架实现的控制器,通过@Controller注解标识处理请求的类和方法。
  3. Struts控制器:基于Struts框架实现的控制器,通过配置文件或注解来映射请求和处理方法。

控制器的应用场景

  1. 业务逻辑处理:控制器负责调度业务逻辑的执行,将请求转发给合适的服务层组件进行处理。
  2. 请求参数处理:控制器可以从请求中获取参数,进行验证和处理。
  3. 视图渲染:控制器通常会将处理结果传递给视图层进行渲染,生成最终的响应。
  4. 异常处理:控制器可以捕获异常并进行适当的处理,如返回错误信息或跳转到错误页面。

示例代码

Servlet控制器示例
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 处理GET请求
        PrintWriter out = response.getWriter();
        out.println("Hello, World!");
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 处理POST请求
        PrintWriter out = response.getWriter();
        out.println("Hello, World!");
    }
}
Spring MVC控制器示例
@Controller
public class HelloController {
    @RequestMapping("/hello")
    public String hello(Model model) {
        model.addAttribute("message", "Hello, World!");
        return "helloPage";
    }
}

总结

控制器是JavaWeb应用中的重要组件,负责接收和处理用户请求,调度业务逻辑并返回响应给客户端。不同框架提供了不同类型的控制器实现,开发人员可以根据需求选择合适的控制器来实现业务逻辑。建议深入学习控制器的相关知识,并结合实际项目应用来加深理解和掌握。

过滤器filter

学习JavaWeb中的过滤器(Filter)是非常重要的,它可以在请求到达Servlet之前或者响应返回给客户端之前对请求和响应进行预处理和后处理。以下是关于JavaWeb过滤器的学习笔记:

过滤器(Filter)概述

  • 过滤器是JavaWeb中用于对请求和响应进行拦截、过滤和处理的组件。
  • 过滤器可以在请求到达Servlet之前对请求进行预处理,也可以在响应返回给客户端之前对响应进行后处理。
  • 过滤器可以用于实现日志记录、权限控制、字符编码转换、数据压缩等功能。

过滤器的工作原理

  1. 过滤器通过实现javax.servlet.Filter接口来创建,需要实现init()doFilter()destroy()方法。
  2. doFilter()方法中,可以对请求和响应进行处理,还可以调用FilterChain对象的doFilter()方法来将请求传递给下一个过滤器或Servlet。
  3. 过滤器可以在web.xml配置文件中进行配置,指定过滤器的名称、URL模式、初始化参数等信息。

过滤器的生命周期

  • 过滤器的生命周期由容器管理,容器在第一次请求到达过滤器时调用init()方法进行初始化,然后在过滤器不再需要时调用destroy()方法进行销毁。

过滤器的链式调用

  • 多个过滤器可以通过链式调用来依次处理请求,每个过滤器可以决定是否将请求传递给下一个过滤器或Servlet。

过滤器的应用场景

  1. 日志记录:记录请求信息、响应时间等。
  2. 权限控制:验证用户是否有权限访问某些资源。
  3. 字符编码转换:统一设置请求和响应的字符编码。
  4. 数据压缩:对响应数据进行压缩以提高传输效率。
  5. 防止跨站点脚本攻击(XSS):过滤请求参数中的恶意脚本。
  6. 缓存控制:控制缓存的行为,如设置缓存过期时间等。

示例代码

public class MyFilter implements Filter {
    public void init(FilterConfig config) throws ServletException {
        // 初始化操作
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        // 对请求进行处理
        // 可以在这里进行日志记录、权限控制等操作

        // 将请求传递给下一个过滤器或Servlet
        chain.doFilter(request, response);

        // 对响应进行处理
        // 可以在这里进行数据压缩、字符编码转换等操作
    }

    public void destroy() {
        // 销毁操作
    }
}

总结

JavaWeb中的过滤器(Filter)是一个强大的功能组件,可以用于对请求和响应进行灵活的处理和控制。通过合理地使用过滤器,可以提高Web应用的安全性、性能和可维护性。建议深入学习过滤器的相关知识,并结合实际项目应用来加深理解和掌握。

监听器Listener

监听器是Web应用程序事件模型的一部分
  • 监听器用于监听Web应用中特定事件的发生,并在事件发生时执行相应的操作。
  • 监听器可以用于捕获ServletContext、HttpSession、ServletRequest等域对象的状态变化事件,以及域对象中属性的变化事件。
HttpSessionBindingListener接口在这里插入图片描述
实现步骤
  1. 创建类实现相应的监听器接口,如HttpSessionBindingListener
  2. 在实现的监听器接口中,实现相应的方法,如valueBound()valueUnbound()
  3. 将监听器实例添加到对应的作用域对象中,如session作用域。
实现在线用户统计的步骤
  1. 创建类实现HttpSessionBindingListener接口。
  2. valueBound()方法中实现在线用户数量加1。
  3. valueUnbound()方法中实现在线用户数量减1。
  4. 将监听器实例添加到session作用域中。
HttpSessionBindingListener示例代码
public class UserSessionListener implements HttpSessionBindingListener {
    public void valueBound(HttpSessionBindingEvent event) {
        // 用户对象存入session时自动调用,用户数量加1
    }
    
    public void valueUnbound(HttpSessionBindingEvent event) {
        // 用户对象从session中删除时自动调用,用户数量减1
    }
}

valueBound()和valueUnbound()方法

valueUnbound方法会在三种情况下自动调用

  1. 调用使session失效的方法:session.invalidate()
  2. session超时
  3. 调用setAttribute重新设置了别的对象,或是调用removeAttribute移除了这个属性

HttpSessionListener接口:

sessionCreated(HttpSessionEvent event)

sessionDestroyed(HttpSessionEvent event)

  • 执行session.invalidate()方法
  • session会话超时

使用在HttpSessionListener接口需要在web.xml中配置监听器:

<listener>
	<listener-class>监听器完全限定名</listener-class>
</listener>

HttpSessionListener和ServletContextListener

  • HttpSessionListener用于监听整个应用中的session的创建和销毁事件。
  • ServletContextListener用于监听ServletContext对象的初始化和销毁事件。

HttpSessionListener、HttpSessionBindingListener二者的 区别

HttpSessionListener只需要设置到web.xml就可以监听整个应用中的所有session
HttpSessionBindingListener必须实例化后放入某一个session中,才能监听。

  • HttpSessionListener设置一次就可以监听整个应用中的所有session,而HttpSessionBindingListener通常是一对一的监听。
  • 监听器接口包括ServletContextListenerHttpSessionListenerHttpSessionBindingListener等,用于监听不同层次的事件。

常用监听器接口

  • ServletContextListener:在Servlet上下文对象初始化或销毁时得到通知。
  • ServletRequestListener:在请求对象初始化时或者被销毁时得到通知。
  • HttpSessionListener:在session创建后或者失效前得到通知。
  • 其他如ServletContextAttributeListenerServletRequestAttributeListener等,用于监听属性变化事件。

通过合理使用监听器,可以实现对Web应用中各种事件的监听和处理,从而增强Web应用的灵活性和功能性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/477584.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

软件测试教程 自动化测试之Junit框架

文章目录 1. 什么是 Junit &#xff1f;2. 常见的注解2.1 Test2.2 BeforeAll&#xff0c;AfterAll2.3 BeforeEach&#xff0c;AfterEach 3. 测试用例顺序指定4. 参数化4.1 单个参数4.2 多个参数4.3 通过方法生成 5. 测试套件6. 断言6.1 断言相等6.2 断言不相等6.3 断言为空6.4 …

如何从 Windows电脑恢复已删除的音频文件

在本文中&#xff0c;我们向您介绍从 Windows PC 恢复已删除的音乐/音频文件的最佳方法。 在线音乐流媒体服务正在蓬勃发展。尽管如此&#xff0c;许多用户还是下载了自己喜欢的曲目以供离线收听。此外&#xff0c;用户还出于各种目的将不同形式的音频文件&#xff08;例如录音…

HBCalculator 程序:通过 VMD 可计算分子动力学模拟中氢键密度和强度的一维和二维分布

分享一个通过 VMD 可计算分子动力学模拟中氢键密度和强度的一维和二维分布程序 HBCalculator。 感谢论文的原作者&#xff01; 主要内容 “氢键是分子系统中关键的非共价相互作用&#xff0c;对生物、化学和能量相关过程产生重大影响&#xff1b;因此&#xff0c;描述氢键信息…

DP动态规划入门(数字三角形、破损的楼梯、安全序列)

一、动态规划&#xff08;DP&#xff09;简介 动态规划&#xff08;Dynamic Programming&#xff0c;简称DP&#xff09;是运筹学的一个分支&#xff0c;它是一种通过将复杂问题分解成多个重叠的子问题&#xff0c;并通过子问题的解来构建整个问题的解的算法。在动态规划中&am…

java Flink(四十二)Flink的序列化以及TypeInformation介绍(源码分析)

Flink的TypeInformation以及序列化 TypeInformation主要作用是为了在 Flink系统内有效地对数据结构类型进行管理&#xff0c;能够在分布式计算过程中对数据的类型进行管理和推断。同时基于对数据的类型信息管理&#xff0c;Flink内部对数据存储也进行了相应的性能优化。 Flin…

Jenkins安装 Linux 更换镜像 安装插件

Jenkins安装 Linux 更换镜像 安装插件 前言 下面叙述了三种jenkins安装的方式,jenkins安装之前必须有java环境因为他是java写的… yum安装只能安装最新版本的jenkins,但是jenkins是java写的所以他强依赖java版本,当你的服务器的java版本与jenkins版本冲突时还需要给jenkins重…

2024.3.21作业

#include<myhead.h>//封装添加学生信息函数 int do_add(sqlite3 *ppDb) {//准备sql语句int add_numb 0;char add_name[20] "";double add_score 0;//提示并输入数据printf("请输入学号&#xff1a;");scanf("%d", &add_numb);print…

spring-boot如何启动WEB项目之二

文章目录 概要spring-boot项目结构踩坑1踩坑2踩坑3总结 概要 最近在做信创的项目&#xff0c;需要将原来在tomcat启动的项目&#xff0c;转移为微服务的项目&#xff0c;然后由于对spring-boot项目了解不足&#xff0c;导致耗费了一些时间来启动项目。 spring-boot项目结构 每…

YoloV8改进策略:Block改进|PKINet

摘要 PKINet是面向遥感旋转框的主干&#xff0c;网络包含了CAA、PKI等模块&#xff0c;给我们改进卷积结构的模型带来了很多启发。 论文&#xff1a;《Poly Kernel Inception Network在遥感检测中的应用》 https://export.arxiv.org/pdf/2403.06258 遥感图像&#xff08;RSI…

应用APM-如何配置Prometheus + Grafana监控springboot应用

文章目录 概述在Spring Boot应用中集成Micrometerspringboot配置修改 Docker安装Prometheus和Grafanaprometheus配置grafana配置启动Prometheus和Grafana在Grafana中配置数据源创建Grafana仪表盘配置Grafana告警&#xff08;可选&#xff09;监控和分析 概述 配置Prometheus和…

内网如何访问其他电脑?

在现代信息技术时代&#xff0c;人们对于与其他电脑进行内网访问的需求日益增长。不同地区的电脑与设备之间的信息远程通信问题成为了一个亟待解决的难题。幸运的是我们有一些解决方案&#xff0c;其中包括【天联】组网技术。 【天联】组网技术 【天联】组网技术是一种解决不同…

解决GNURadio自定义C++ OOT块-导入块时报错问题

文章目录 前言一、问题描述二、解决方法1、安装依赖2、配置环境变量3、重新编译及安装三、结果1、添加结果2、运行结果前言 本文记录在 GNURadio 自定义 C++ OOT 块后导入块时报错 AttributeError: module myModule has no attribute multDivSelect。 一、问题描述 参考官方教…

C#,图片分层(Layer Bitmap)绘制,反色、高斯模糊及凹凸贴图等处理的高速算法与源程序

1 图像反色Invert 对图像处理的过程中会遇到一些场景需要将图片反色,反色就是取像素的互补色,比如当前像素是0X00FFFF,对其取反色就是0XFFFFFF – 0X00FFFF = 0XFF0000,依次对图像中的每个像素这样做,最后得到的就是原始2 图像的反色。 2 高斯模糊(Gauss Blur)算法 …

ABAP笔记:定义指针,动态指针分配:ASSIGN COMPONENT <N> OF STRUCTURE <结构> TO <指针>.

参考大佬文章学习&#xff0c;总结了下没有提到的点&#xff1a;SAP ABAP指针的6种用法。_abap 指针-CSDN博客 定义指针&#xff1a;其实指针这玩意&#xff0c;就是类似你给个地方&#xff0c;把东西临时放进去&#xff0c;然后指针就是这个东西的替身了&#xff0c;写代码的…

异常机制二

目录 异常的处理方式之一&#xff1a;捕获异常 try-catch-finally 语句块的执行过程&#xff1a; 异常的处理方式之二&#xff1a;声明异常&#xff08;throws 子句&#xff09; 自定义异常 异常的处理方式之一&#xff1a;捕获异常 捕获异常是通过 3 个关键词来实现的&…

【UE5】动画蒙太奇简述

项目资源文末百度网盘自取 动画蒙太奇基本功能 动画蒙太奇&#xff08;Animation Montage&#xff09; 可以将多个 动画序列&#xff08;Animation Sequences&#xff09; 合并为单个资产并通过蓝图播放&#xff0c;还可以将一个蒙太奇动画切分为多个 蒙太奇分段&#xff08;M…

数据结构从入门到精通——二叉树的实现

二叉树的实现 前言一、二叉树链式结构的实现1.1前置说明1.2二叉树的手动创建 二、二叉树的遍历2.1 前序、中序以及后序遍历二叉树前序遍历二叉树中序遍历二叉树后序遍历2.2 层序遍历练习 三、二叉树的具体代码实现二叉树的节点个数二叉树叶子节点个数二叉树第k层节点个数二叉树…

【数字图像处理系列】读取图像

【数字图像处理系列】读取图像 使用函数 imread 可以将图像读人 MATLAB 环境&#xff0c;imread 的语法为 imread(filename)其中&#xff0c;filename是一个含有图像文件全名的字符串(包括任何可用的扩展名)。例如&#xff0c;命令行 >>f imread(pout.tif)将tif图像po…

MATLAB环境下基于振动信号的轴承状态监测和故障诊断

故障预测与健康管理PHM分为故障预测和健康管理与维修两部分&#xff0c;PHM首先借助传感器采集关键零部件的运行状态数据&#xff0c;如振动信号、温度图像、电流电压信号、声音信号及油液分析等&#xff0c;提取设备的运行监测指标&#xff0c;进而实现对设备关键零部件运行状…

精确率(召回率)的权衡(Machine Learning研习十六)

精确率&#xff08;召回率&#xff09;的权衡 为了理解这种权衡&#xff0c;让我们看看 SGDClassifier如何做出分类决策。 对于每个实例&#xff0c;它根据决策函数计算分数。 如果该分数大于阈值&#xff0c;则将该实例分配给正类&#xff1b; 否则它会将其分配给负类。 图 3…