Listener监听器和base标签

- 什么是监听器?

  - 监听器是Servlet规范中的一员。就像Filter一样。Filter也是Servlet规范中的一员。
  - 在Servlet中,所有的监听器接口都是以“Listener”结尾。

- 监听器有什么用?

  - 监听器实际上是Servlet规范留给我们javaweb程序员的特殊时机。
  - 特殊的时刻如果想执行这段代码,你需要想到使用对应的监听器。

- Servlet规范中提供了哪些监听器?

  - jakarta.servlet包下:
    - ServletContextListener
    - ServletContextAttributeListener
    - ServletRequestListener
    - ServletRequestAttributeListener
  - jakarta.servlet.http包下:
    - HttpSessionListener
    - HttpSessionAttributeListener
      - 该监听器需要使用@WebListener注解进行标注。
      - 该监听器监听的是什么?是session域中数据的变化。只要数据变化,则执行相应的方法。主要监测点在session域对象上。
    - HttpSessionBindingListener
      - 该监听器不需要使用@WebListener进行标注。
      - 假设User类实现了该监听器,那么User对象在被放入session的时候触发bind事件,User对象从session中删除的时候,触发unbind事件。
      - 假设Customer类没有实现该监听器,那么Customer对象放入session或者从session删除的时候,不会触发bind和unbind事件。
    - HttpSessionIdListener
      - session的id发生改变的时候,监听器中的唯一一个方法就会被调用。
    - HttpSessionActivationListener
      - 监听session对象的钝化和活化的。
      - 钝化:session对象从内存存储到硬盘文件。
      - 活化:从硬盘文件把session恢复到内存。

- 实现一个监听器的步骤:以ServletContextListener为例。

  - 第一步:编写一个类实现ServletContextListener接口。并且实现里面的方法。

    - ```
      void contextInitialized(ServletContextEvent event)
      void contextDestroyed(ServletContextEvent event)
      ```

  - 第二步:在web.xml文件中对ServletContextListener进行配置,如下:

    - ```
      <listener>
          <listener-class>com.bjpowernode.javaweb.listener.MyServletContextListener</listener-class>
      </listener>
      ```

    - 当然,第二步也可以不使用配置文件,也可以用注解,例如:@WebListener
  
- 注意:所有监听器中的方法都是不需要javaweb程序员调用的,由服务器来负责调用?什么时候被调用呢?

  - 当某个特殊的事件发生(特殊的事件发生其实就是某个时机到了。)之后,被web服务器自动调用。
  
- 思考一个业务场景:

  - 请编写一个功能,记录该网站实时的在线用户的个数。
  - 我们可以通过服务器端有没有分配session对象,因为一个session代表了一个用户。有一个session就代表有一个用户。如果你采用这种逻辑去实现的话,session有多少个,在线用户就有多少个。这种方式的话:HttpSessionListener够用了。session对象只要新建,则count++,然后将count存储到ServletContext域当中,在页面展示在线人数即可。
  - 业务发生改变了,只统计登录的用户的在线数量,这个该怎么办?
    - session.setAttribute("user", userObj); 
    - 用户登录的标志是什么?session中曾经存储过User类型的对象。那么这个时候可以让User类型的对象实现HttpSessionBindingListener监听器,只要User类型对象存储到session域中,则count++,然后将count++存储到ServletContext对象中。页面展示在线人数即可。

- 实现oa项目中当前登录在线的人数。

  - 什么代表着用户登录了?
    - session.setAttribute("user", userObj); User类型的对象只要往session中存储过,表示有新用户登录。
  - 什么代表着用户退出了?
    - session.removeAttribute("user"); User类型的对象从session域中移除了。
    - 或者有可能是session销毁了。(session超时)

base标签

- 使用什么技术改造呢?

- Servlet + JSP + EL表达式 + JSTL标签。进行改造。

- 在前端HTML代码中,有一个标签,叫做base标签,这个标签可以设置整个网页的基础路径。

- 这是Java的语法,也不是JSP的语法。是HTML中的一个语法。HTML中的一个标签。通常出现在head标签中。

- < base href="http://localhost:8080/oa/">

- 在当前页面中,凡是路径没有以“/”开始的,都会自动将base中的路径添加到这些路径之前。

    - < a href="ab/def"></ a>
    - 等同于:< a href="http://localhost:8080/oa/ab/def"></ a>

- 需要注意:在JS代码中的路径,保险起见,最好不要依赖base标签。JS代码中的路径最好写上全路径。

  - ```
    <base href="${pageContext.request.scheme}://${pageContext.request.serverName}:${pageContext.request.serverPort}${pageContext.request.contextPath}/">

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老衲只用阿道夫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值