过滤器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>
注解的方式:
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,并设置字符编码的格式
2.配置web.xml文件
由于上一中的编码在java代码中已经写死了,造成了硬编码的问题,所以使用方式二进行编码的配置
方式二:在web.xml配置文件中配置编码
在filter中进行配置,
只有在innit方法中才可以从filteConfig对象中获取配置的encoding初始化参数,并在doFilter方法中进行使用
字符编码覆盖设置
由实际的条件控制是否进行编码的设置,
1.前面的过滤器没有设置,此时需要设置
2.如果当前过滤器的编码是强制执,此时需要设置
首先xml中必须的有字符的设置,才能进行编码的覆盖
web.xml中的配置如下:
写一个工具类进行判断
需要在从初始化方法中的filterconfig对象中获取force的初始值
登录校验过滤器
将登录校验的过滤器使用使用了重复代码
创建一个CheckLoginFilter,使用过滤器进行判断用户是否进行登录
监听器
是web组件之一
**监听的对象:**作用域对象,作用域属性
**监听的动作:**作用域对象的创建和销毁,作用域属性值的改变.
监听器分类:
作用域对象分:
ServletRequestListener
HttpSessionLitener
ServiceContextListener
按作用域属性分:
ServletRequestAttrubuteListener
HttpSessionAttrubuteListener
ServiceContextAttrubuteListener
开发步骤
**1.**创建一个xxLisener的类,实现对应的接口
是:javax.servlet.http下的接口
**2.**实现里面的方法(统计游客数量)
**3.**将监听器交给tomcat管理
(1)配置web.xml
一般习惯将listener配置在第一个位置
<listener>
<listener-class>cn.wolfcode.listener.VisiterListener</listener-class>
</listener>
(2)注解
创建默认管理员
在启动服务器的时候使用监听器进行创建
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) {
}
}
分页查询
假分页:将查询的所有结果方法 内存中,数据过多荣誉造成内存溢出
真分页(开发使用):每一次翻页都从数据库中查询数据
效果如图:
由于数据量较多,此时将所有的数据进行封装到一个对象里面进行共享
分页的步骤
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做成一个构造器,用于创建对象用
3.可以看见上面的分页只需要传4个参数(结果集,总数据条数)就可以获得所有的数据,service直接new对象就可以对结果进行计算,但是dao需要通过查询得到结果集和总条数,在搞一个类,同时将limit的第一个参数进行计算来进行传递
sql 语句书写如下,查两条数据就行
dao层实现
service中的实现
在servlet中传递用户所传递的参数即可,并将数济进行共享
在jsp中使用连接的方式进行页面的跳转,用min和max设置页数的大小,没一页的跳转通过表单提交的方式进行,复选框的默认使用的是"selected",单选框使用的是"checked"
过滤查询:
使用最开始的的数据库的sql查询语句进行查询会进行sql语句的拼写,比较繁琐,此时需要使用mybaties自带的标签来进行过滤语句的拼接,根据用户传递的参数,拼接where条件
1.创建一个类接收过滤查询的条件,同时继承分页查询,减少重复代码
2.使用where标签进行多条件拼接,他可以将第一个and或者or关键字进行替换到层的代码没有改变,由于两条查询语句中的条件差不多,可以使用xxx将查询条件进行统一,使用concat函数与%完成字符串模糊查询的需求
3.在查询条件中使用进行标签的调用
4.service层里面需要给selectForCount进行传参保证分页与过滤能同时进行
5.解决翻页数据丢失问题,翻到最后一页是没有数据的,此时使用jsp来解决数据丢失问题,为页面跳转增加id属性进行控制
3.在查询条件中使用进行标签的调用
4.service层里面需要给selectForCount进行传参保证分页与过滤能同时进行
5.解决翻页数据丢失问题,翻到最后一页是没有数据的,此时使用jsp来解决数据丢失问题,为页面跳转增加id属性进行控制