day20 过滤器和监听器

文章详细介绍了Web开发中Filter的作用,包括字符编码处理、登录检验和敏感词过滤等场景。Filter的生命周期、配置方式以及执行顺序被阐述,同时提到了如何通过web.xml或注解进行配置。此外,还讨论了监听器的功能,如监听作用域对象和属性变化,以及如何创建默认管理员。最后,文章探讨了分页查询的实现,包括真分页的原理和MyBatis中的过滤查询标签使用。
摘要由CSDN通过智能技术生成
过滤器Filter

作用:对请求和响应进行预处理

使用场景:字符编码处理,登录检验,敏感词过滤,前端框架分发器

Filter的开发步骤

filter也是一个web组件,结构和servlet相似

1.定义类:实现javax.servlet.Filter接口

2.覆盖里面的3个方法:

innit:初始化

doFilter:对请求和响应进行预处理

destroy:对象销毁

3.使用web.xml配置文件或者注解的方式交给tomcat进行管理

web.xml配置文件的格式(可用于解决硬编码的时候使用):

<!--将过滤器交给tomcat管理-->
<filter>
    <filter-name>HelloFillter</filter-name>
    <filter-class>cn.wolfcode.fillter._01_hellow.HelloFillter</filter-class>
</filter>
<filter-mapping>
    <filter-name>HelloFillter</filter-name>
    <!--请求哪些资源时要经过当前过滤器,只针对访问关于hello的资源的时候进行过滤-->
    <url-pattern>/hello</url-pattern>
</filter-mapping>

注解的方式:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ImvGT1IL-1684933883183)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230423185747917.png)]

Fillter配置文件的执行顺序(过滤器链):

xml:按照mapper的的先后顺序进行先后过滤

注解:按照注解的字母先后顺序进行优先级的过滤

过滤路径:

**servlet中的url-parttern:**给当前的资源起一个别名,外界可以通过这个别名进行访问

**Fileter中的url-partern:**指定里面的哪些资源需要进行过滤

/hello:对/hello中的资源进行过滤

/hello/*:对/hello下的所有资源进行过滤

/*:对根下面的所有资源进行过滤

Filter的生命周期:

对象的创建:启动服务器的时候进行创建,一次

innit方法执行:启动服务器的时候执行innit方法,一次

doFilter方法的执行:每次请求对应的资源都会执行,n次

destory方法的执行:正常关闭服务器的时候销毁,0或者1次

过滤方式的设置

 <filter-mapping>
        <filter-name>Filter3</filter-name>
        <url-pattern>/*</url-pattern>
 //新的请求经过过滤器
		<dispatcher>REQUEST</dispatcher>
//请求转发
		<dispatcher>FORWARD</dispatcher>
//错误页面跳转
		<dispatcher>ERROR</dispatcher>
    </filter-mapping>
字符编码过滤器

**作用:**对servlet中的字符编码进行处理,解决重复代码问题,在过滤的时候就进行处理

方式一:在文件中写死编码的格式

1.创建一个doFileter,并设置字符编码的格式

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-txRWEVyJ-1684933883184)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230423193013465.png)]

2.配置web.xml文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qvJ3yTkK-1684933883185)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230423193313355.png)]

由于上一中的编码在java代码中已经写死了,造成了硬编码的问题,所以使用方式二进行编码的配置

方式二:在web.xml配置文件中配置编码

在filter中进行配置,

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yNVRc65f-1684933883186)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230423194347692.png)]

只有在innit方法中才可以从filteConfig对象中获取配置的encoding初始化参数,并在doFilter方法中进行使用

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NRHWkqvn-1684933883186)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230423201030773.png)]

字符编码覆盖设置

由实际的条件控制是否进行编码的设置,

1.前面的过滤器没有设置,此时需要设置

2.如果当前过滤器的编码是强制执,此时需要设置

首先xml中必须的有字符的设置,才能进行编码的覆盖

web.xml中的配置如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Qh9TxBG4-1684933883187)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230423201455830.png)]

写一个工具类进行判断

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-w5R3cYBq-1684933883188)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230423202958109.png)]

需要在从初始化方法中的filterconfig对象中获取force的初始值

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KiGv6TVw-1684933883189)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230423205016043.png)]

登录校验过滤器

将登录校验的过滤器使用使用了重复代码

创建一个CheckLoginFilter,使用过滤器进行判断用户是否进行登录

监听器

是web组件之一

**监听的对象:**作用域对象,作用域属性

**监听的动作:**作用域对象的创建和销毁,作用域属性值的改变.

监听器分类:

作用域对象分:

ServletRequestListener

HttpSessionLitener

ServiceContextListener

按作用域属性分:

ServletRequestAttrubuteListener

HttpSessionAttrubuteListener

ServiceContextAttrubuteListener

开发步骤

**1.**创建一个xxLisener的类,实现对应的接口

是:javax.servlet.http下的接口

**2.**实现里面的方法(统计游客数量)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-89AZSIg8-1684933883189)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230424200955137.png)]

**3.**将监听器交给tomcat管理

(1)配置web.xml

一般习惯将listener配置在第一个位置

<listener>
    <listener-class>cn.wolfcode.listener.VisiterListener</listener-class>
</listener>

(2)注解

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6UNBJb8r-1684933883190)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230424201205699.png)]

创建默认管理员

在启动服务器的时候使用监听器进行创建

1.先出查询账户是否存在管理员账号

2.如果没有账号就在创建一个监听器中并在里面创建一个默认账号

@WebListener
public class CreadAdminListener implements ServletContextListener {
    private IUserDAO dao=new UserDAOImpl();

    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
      User user=  dao.selectByName("admin");
      if(user==null){
          //保存管理员账号
          User user1 = new User();
          user1.setUsername("admin");
          user1.setPassword("123");
          dao.insert(user1);
      }
    }
    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
    }
}
分页查询

假分页:将查询的所有结果方法 内存中,数据过多荣誉造成内存溢出

真分页(开发使用):每一次翻页都从数据库中查询数据

效果如图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VfEGZIAS-1684933883191)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230424220117392.png)]

由于数据量较多,此时将所有的数据进行封装到一个对象里面进行共享

分页的步骤

1.分析分页需要哪些数据,单独使用一个包来装

通过SQL语句查询的结果两个

List<?> list , 数据库中所有的结果集,展示在列表里面

totalCount, 统计有多少条数据

用户输入的两个数据:

pageSize, 每页展示多少条数据,用户可选择

currentPage, 当前页,即跳转到第几页

通过计算得到的三条数据:

totalPage=totalCount%pageSize==0?totalCount/pageSize:totalCount/pageSize, 总页数

prevPage=currentPage>0?currentPage-1:1: 上一页

nextPage=currentPage<toltalPage?currentPage+1:totalPage. 下一页

2.将分页的数据在PageResult做成一个构造器,用于创建对象用

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ulyEWOwS-1684933883192)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230424222340522.png)]

3.可以看见上面的分页只需要传4个参数(结果集,总数据条数)就可以获得所有的数据,service直接new对象就可以对结果进行计算,但是dao需要通过查询得到结果集和总条数,在搞一个类,同时将limit的第一个参数进行计算来进行传递

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kG2lgTwY-1684933883192)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230425073216840.png)]

sql 语句书写如下,查两条数据就行

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SOYdAA3q-1684933883193)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230425073404935.png)]

dao层实现

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mAYGnZcg-1684933883194)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230425073452677.png)]

service中的实现

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cnuBAWou-1684933883194)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230425073604664.png)]

在servlet中传递用户所传递的参数即可,并将数济进行共享

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oY6CCjSB-1684933883195)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230425073942753.png)]

在jsp中使用连接的方式进行页面的跳转,用min和max设置页数的大小,没一页的跳转通过表单提交的方式进行,复选框的默认使用的是"selected",单选框使用的是"checked"

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jjJBJStM-1684933883196)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230425074304895.png)]

过滤查询:

使用最开始的的数据库的sql查询语句进行查询会进行sql语句的拼写,比较繁琐,此时需要使用mybaties自带的标签来进行过滤语句的拼接,根据用户传递的参数,拼接where条件

1.创建一个类接收过滤查询的条件,同时继承分页查询,减少重复代码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WMzUetwA-1684933883196)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230427071048457.png)]

2.使用where标签进行多条件拼接,他可以将第一个and或者or关键字进行替换到层的代码没有改变,由于两条查询语句中的条件差不多,可以使用xxx将查询条件进行统一,使用concat函数与%完成字符串模糊查询的需求

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xGjGzHvz-1684933883197)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230427071846880.png)]

3.在查询条件中使用进行标签的调用

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Sfc76TnM-1684933883197)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230427072053085.png)]

4.service层里面需要给selectForCount进行传参保证分页与过滤能同时进行

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IVb2LCSD-1684933883198)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230427072424614.png)]

5.解决翻页数据丢失问题,翻到最后一页是没有数据的,此时使用jsp来解决数据丢失问题,为页面跳转增加id属性进行控制

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ugAjDMU5-1684933883198)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230427073055937.png)]

3.在查询条件中使用进行标签的调用

4.service层里面需要给selectForCount进行传参保证分页与过滤能同时进行

5.解决翻页数据丢失问题,翻到最后一页是没有数据的,此时使用jsp来解决数据丢失问题,为页面跳转增加id属性进行控制
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fGGYZU2g-1684933883199)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230427073126164.png)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值