过滤器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)]](https://img-blog.csdnimg.cn/4c8806bcafc34b4384e0853f6a958765.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)]](https://img-blog.csdnimg.cn/4969045f560843b685c7f4ded608526b.png)
2.配置web.xml文件
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qvJ3yTkK-1684933883185)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230423193313355.png)]](https://img-blog.csdnimg.cn/5af8bbd728a743ea8e18c95f74365228.png)
由于上一中的编码在java代码中已经写死了,造成了硬编码的问题,所以使用方式二进行编码的配置
方式二:在web.xml配置文件中配置编码
在filter中进行配置,
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yNVRc65f-1684933883186)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230423194347692.png)]](https://img-blog.csdnimg.cn/67e70601b03a4ba98017056699e8e325.png)
只有在innit方法中才可以从filteConfig对象中获取配置的encoding初始化参数,并在doFilter方法中进行使用
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NRHWkqvn-1684933883186)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230423201030773.png)]](https://img-blog.csdnimg.cn/8683ce9a6779466ea513f3993464cdd0.png)
字符编码覆盖设置
由实际的条件控制是否进行编码的设置,
1.前面的过滤器没有设置,此时需要设置
2.如果当前过滤器的编码是强制执,此时需要设置
首先xml中必须的有字符的设置,才能进行编码的覆盖
web.xml中的配置如下:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Qh9TxBG4-1684933883187)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230423201455830.png)]](https://img-blog.csdnimg.cn/36551dbec05949a18faac0b1b537178b.png)
写一个工具类进行判断
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-w5R3cYBq-1684933883188)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230423202958109.png)]](https://img-blog.csdnimg.cn/ac269bc5d3604328b8135f51bd84462b.png)
需要在从初始化方法中的filterconfig对象中获取force的初始值
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KiGv6TVw-1684933883189)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230423205016043.png)]](https://img-blog.csdnimg.cn/bdf80b58f9134693bfd3bc94aa5064e7.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)]](https://img-blog.csdnimg.cn/d12738ea945f48328c75bee61950336c.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)]](https://img-blog.csdnimg.cn/e41dba8443284c58b3e638a278ab2709.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)]](https://img-blog.csdnimg.cn/b76df99b2c194870ad2561bd7ed55cc9.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)]](https://img-blog.csdnimg.cn/acf1fb7cde674d43bb6825ff21df31ea.png)
3.可以看见上面的分页只需要传4个参数(结果集,总数据条数)就可以获得所有的数据,service直接new对象就可以对结果进行计算,但是dao需要通过查询得到结果集和总条数,在搞一个类,同时将limit的第一个参数进行计算来进行传递
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kG2lgTwY-1684933883192)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230425073216840.png)]](https://img-blog.csdnimg.cn/63c00460918c42db82294792d0f38027.png)
sql 语句书写如下,查两条数据就行
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SOYdAA3q-1684933883193)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230425073404935.png)]](https://img-blog.csdnimg.cn/732392214efb40609d5ec28e52d753b1.png)
dao层实现
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mAYGnZcg-1684933883194)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230425073452677.png)]](https://img-blog.csdnimg.cn/ced58bf54402483b9af4a7032f700f12.png)
service中的实现
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cnuBAWou-1684933883194)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230425073604664.png)]](https://img-blog.csdnimg.cn/57bf0d8a9a2b44fea24d0e285a92d91d.png)
在servlet中传递用户所传递的参数即可,并将数济进行共享
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oY6CCjSB-1684933883195)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230425073942753.png)]](https://img-blog.csdnimg.cn/77f5a6a91acc45f08f90d4d44b24e6f9.png)
在jsp中使用连接的方式进行页面的跳转,用min和max设置页数的大小,没一页的跳转通过表单提交的方式进行,复选框的默认使用的是"selected",单选框使用的是"checked"
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jjJBJStM-1684933883196)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230425074304895.png)]](https://img-blog.csdnimg.cn/621254570baa4a9ea2c6784689227581.png)
过滤查询:
使用最开始的的数据库的sql查询语句进行查询会进行sql语句的拼写,比较繁琐,此时需要使用mybaties自带的标签来进行过滤语句的拼接,根据用户传递的参数,拼接where条件
1.创建一个类接收过滤查询的条件,同时继承分页查询,减少重复代码
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WMzUetwA-1684933883196)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230427071048457.png)]](https://img-blog.csdnimg.cn/f1403ccb9ccc44d8a7f8b02b1617abd9.png)
2.使用where标签进行多条件拼接,他可以将第一个and或者or关键字进行替换到层的代码没有改变,由于两条查询语句中的条件差不多,可以使用xxx将查询条件进行统一,使用concat函数与%完成字符串模糊查询的需求
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xGjGzHvz-1684933883197)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230427071846880.png)]](https://img-blog.csdnimg.cn/16901b78c43a4130b5fd456a0c0f62a9.png)
3.在查询条件中使用进行标签的调用
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Sfc76TnM-1684933883197)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230427072053085.png)]](https://img-blog.csdnimg.cn/4ef1be8bd2d8420e8f822c22275be661.png)
4.service层里面需要给selectForCount进行传参保证分页与过滤能同时进行
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IVb2LCSD-1684933883198)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230427072424614.png)]](https://img-blog.csdnimg.cn/4f3947163405427d86a0f36e5fc01413.png)
5.解决翻页数据丢失问题,翻到最后一页是没有数据的,此时使用jsp来解决数据丢失问题,为页面跳转增加id属性进行控制
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ugAjDMU5-1684933883198)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230427073055937.png)]](https://img-blog.csdnimg.cn/0fab30c26c9a4a0ca68d3d4da1183d61.png)
3.在查询条件中使用进行标签的调用
4.service层里面需要给selectForCount进行传参保证分页与过滤能同时进行
5.解决翻页数据丢失问题,翻到最后一页是没有数据的,此时使用jsp来解决数据丢失问题,为页面跳转增加id属性进行控制
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fGGYZU2g-1684933883199)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230427073126164.png)]](https://img-blog.csdnimg.cn/0f8db77c81364f4fabe84cb82406e888.png)












![[极客大挑战 2019]HardSQL1](https://img-blog.csdnimg.cn/img_convert/371f807c75ee420b9af63daf209682b8.png)





