## 分页(重点)和 监听器 ##
**分页的简介**
1.为什么使用分页。
2.好处:用户体检的非常好。查询的速度非常快。缺点数据库的交互比较多。
3.分页的技术
4.MySQL的关键字 limit MySQL数据库方言 (使用它就行分页)
* mySQL 直接使用limit操作
* 使用关键字top,嵌套的查询
* Oracle 嵌套查询
5.limit关键字
* select * from t_customer limit a,b;
* a参数:从哪条记录开始
* b参数:查询多少条记录
例: select * from t_customer limit 0,10;
-- 一共显示10条记录 1-10 11-20 21-30
-- 查询第三页的数据 0-10 10-10 20-10 (当前页-1)*每页显示的数据10
**分页的分析的过程**
1.pageCode 当前页 -- 从页面获取
2.totalPage 总页数 -- 计算出来
3.totalCount 总记录数 -- 查询数据库
4.pageSize 每页显示的记录数 -- 用户规定的(10)
5.beanList 显示的数据 -- 查询数据库的
6.把上述这些变量封装到JavaBean中,PageBean。在各层之间传递PageBean
**分页遇到问题**
**页面列表**
1.页码列表显示10个 -- 一共10个。
2.当前页在第6个位置,发生变化。 -- 当前页是pageCode
[5][6][7][8][9][10][11][12][13][14]
* 能知道开始是位置是1 ,结束的位置10.
* 定义变量开始位置begin 结束位置end
* 通过pageCode来计算begin和end
* 如果totalPage <= 10 begin =1 end = totalPage [1][2][3][4][5][6][7][8][9][10]
* 如果totalPage > 10 begin = pageCode - 5 end = pageCode + 4
* 头溢出 当begin < 1 begin = 1 end = 10
* 尾溢出 当end > totalPage end = totalPage begin = end - 9
**带条件的分页查询**
## WEB监听器 ##
**监听器的概述**
1.概述:监听器是一个Java的类,作用是用来监听另一个Java类的状态的改变。
2.概念:(场景:电动车上安装了一个报警器)
* 事件源:被监听的对象 (电动车)
* 监听器:监听的对象 (报警器)
* 绑定事件源:在事件源上绑定监听器。(在电动车上安装报警器)
* 事件:一旦事件源的状态发生了变化,创建一个事件对象,把事件对象传递给监听器,监听器中一个方法就会执行了。(我的电动车被人踢了一脚,报警器就说话了:主人,我被人给踢了!!)
* 事件对象:产生的,在监听器中可以使用事件对象获取事件源对象。
3.模拟的一个例子
**开发步骤**
1.编写一个Java的类,实现监听器的接口,重写方法。
2.在web.xml中进行配置。
<listener>
<listener-class>cn.itcast.listener1.MyServletContextListener</listener-class>
</listener>
**第一类:域对象的创建和销毁的监听器**
1.ServletContextListener -- 监听ServletContext对象的创建和销毁。
* 方法:
* contextInitialized(ServletContextEvent sce) -- ServletContext一被创建就执行
* contextDestroyed(ServletContextEvent sce) -- ServletContext一被销毁就执行
* ServletContext什么创建和什么时候销毁?与天地同寿
* 服务器一启动的时候,ServletContext创建了,一次。
* ServletContext服务器关闭的时候,或者项目移除了。销毁了。
2.HttpSessionListener -- 监听HttpSeesion对象的创建和销毁
* 方法
* sessionCreated(HttpSessionEvent se) -- session一创建该方法就执行
* sessionDestroyed(HttpSessionEvent se) -- session一销毁该方法就执行
* session什么时候创建呢?啥时候销毁呀?
* 第一次调用该request.getSession()方法,
* session什么时候销毁
* 默认的销毁时间 30分钟
* 非正常原因关闭服务器
* 调用invalidate()方法销毁
* 访问JSP会创建session吗 (会)? 访问Servlet会创建呢(不一定)?访问HTML会不会(不会)?
3.ServletRequestListener -- 监听ServlertRequest对象的创建和销毁
* 方法:
* requestInitialized(ServletRequestEvent sre)
* requestDestroyed(ServletRequestEvent sre)
* request什么是创建和销毁?
* 有一次请求就创建request对象,做出响应,就销毁了。
* 访问JSP会创建session吗 (会)? 访问Servlet会创建呢(会)?访问HTML会不会(会)?
**统计现在在线的人数**
1.第一步:编写一个ServeltContext的监听器,在ServletContext对象中初始化一个变量(count 0)
2.第二步:编写一个HttpSession的监听器(countListener),你只要一访问demo1.jsp,为你创建一个session,countListener中sessionCreated方法就会执行一次。 从ServletContext中获取count值。count++,再保存到ServletContext.
3.如果session销毁了,sessionDestroyed默认执行,ServletContext获取count,这回count--。
**第二类:域对象属性的状态改变的监听器**
1.ServletContextAttributeListener -- 监听ServletContext域对象中的属性的状态改变(增强、替换、删除)
* attributeAdded(ServletContextAttributeEvent scab) -- 添加属性
* attributeRemoved(ServletContextAttributeEvent scab) -- 删除属性
* attributeReplaced(ServletContextAttributeEvent scab) -- 替换
2.HttpSessionAttributeListener -- 监听HttpSession域对象的属性的状态改变
* attributeAdded(HttpSessionBindingEvent se)
* attributeRemoved(HttpSessionBindingEvent se)
* attributeReplaced(HttpSessionBindingEvent se)
3.ServletRequestAttributeListener -- 监听ServletRequest域对象的属性的状态改变
* attributeAdded(ServletRequestAttributeEvent srae)
* attributeRemoved(ServletRequestAttributeEvent srae)
* attributeReplaced(ServletRequestAttributeEvent srae)
**第三类:session域对象中的JavaBean的监听器**
1.HttpSessionBindingListener -- 监听Session中的JavaBean对象的绑定(存入session中)和解除绑定(从session中移除)
* 方法:
* valueBound(HttpSessionBindingEvent event) -- 绑定
* valueUnbound(HttpSessionBindingEvent event) -- 解除绑定
2.HttpSessionActivationListener -- 监听session的中JavaBean钝化(和session一起序列化磁盘上)和活化(从磁盘上反序列化)
* 方法:
* sessionDidActivate(HttpSessionEvent se) -- 活化
* sessionWillPassivate(HttpSessionEvent se) -- 钝化
* 总结:对session机制的优化。通过钝化的操作,如果一段时间没有操作,可以把session钝化(序列化磁盘上)。你要操作的时候,活化过来,session中东西还有。