java学习之jsp第29天(--java中的监听-- timer接口(定时器)-- filter-- 分页查询limit--)

你想要多大的成功,你愿意为这份成功付出什么?

1 . JavaWeb可以监听的三个对象:

             1.  HttpServletRequest  对象

             2.ServletContext 对象

             3. httpSession对象 (-监听保存的对象的变换- )

2. 监听对象的创建和销毁

              1.ServletContextListener

              2. HttpSessionListener

              3. servletRequestListener

 3. 监听  --域对象中属性值的变化

              1.ServletContextAttributeListener

               2. HttpSessionAttributeListener 

                3.ServletRequestAttributeListener

4. 监听: -- 域对象中自定义对象的值的变化

    httpSessionBindingListener( user类必须实现这个接口 )


练习一: 访问一个jsp相当于创建了一个Servlet  ,  jsp里面给你创建了9大内置对象

          每个监听都要配置一下 web.xml 里面的Listener标签

     1.监听 session域  创建一个类实现HttpSessionListener 接口

public class MyHttpSessionListener implements HttpSessionListener{
     @Override
    public void sessionCreated(HttpSessionEvent se) {
    	 //HttpSessionEvent session的事件对象 来获取session.
    	    HttpSession session = se.getSession();
    	    String id = session.getId();
    	    System.out.println(id +"创建了");
        System.out.println("我session被创建了");
    }
     
     @Override
    public void sessionDestroyed(HttpSessionEvent se) {
    System.out.println("我session被销毁了");
    }
}

   2.监听request域 创建一个类实现servletContextListener

 * 测试监听 ServletContext 创建和销毁;
 * 1. 实现一个接口
 */
public class MyServletContextListener implements ServletContextListener {
	@Override
	public void contextInitialized(ServletContextEvent sce) {
	 System.out.println("初始化了");
	
	}

	@Override
	public void contextDestroyed(ServletContextEvent sce) {
		System.out.println("销毁了");
	}
}
 3.监听ServletContext域中值的变化 继承接口 ServletContextAttributeListener , 访问下面jsp时候, 里面的方法会被执行;

                       

<%@page import="com.lanou3g.User"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
	都是范德萨范德萨的收费更换
	<%
  /*   request.setAttribute("name", "wanglong"); */
   User user = new User();
   session.setAttribute("user", user);
   %>
</body>
</html>
package com.lanou3g;

import javax.servlet.ServletRequestAttributeEvent;
import javax.servlet.ServletRequestAttributeListener;

public class MyServletContextAttributeListener implements ServletRequestAttributeListener {
	@Override
	public void attributeAdded(ServletRequestAttributeEvent srae) {
		 System.out.println("添加的值"+srae.getName()+"----"+srae.getValue());
	}
	
	@Override
	public void attributeRemoved(ServletRequestAttributeEvent srae) {
		 System.out.println("移除的值"+srae.getName()+"----"+srae.getValue());
	}
	
	@Override
	public void attributeReplaced(ServletRequestAttributeEvent srae) {
	    System.out.println("替换的值"+srae.getName()+"----"+srae.getValue());
	}
	
}

 4. 利用监听实现定时销毁

     4.1 配置xml

           

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
	id="WebApp_ID" version="3.0">
	<display-name>sh-web-timer</display-name>
	<listener>
		<listener-class>com.lanou3g.MyServletContextListener</listener-class>

	</listener>

	<listener>
		<listener-class>com.lanou3g.MyHttpSessionListener</listener-class>

	</listener>
	
		<servlet>
		<servlet-name>demo01</servlet-name>
		<servlet-class>com.lanou3g.Demo01</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>demo01</servlet-name>
		<url-pattern>/demo01</url-pattern>
	</servlet-mapping>

</web-app>
    4.2  创建一个Servlet  获取session
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/*
 * 4练习.定时销毁session(5秒销毁一次); 
    
    	1. 把所有创建出来的session保存起来.用户只要访问服务器就会产生session, 保存在哪个域里面呢?
    	       1.ServletContext(哪个类都能获取到);
    	       2.把session对象扔进数组里面 把数组保存到域中
    	       ---什么时候cj到数组中
    	            1. 当ServletContext对象 初始化的时候创建数组; --需要一个监听类,触发方法的时候就创建数组;
    	       ----什么时候把session放到数据里面.
    	             1.当session对象创建的时候, 就把对象放入到数组中;
    	       
    	2. 遍历保存起来的session对象;
    	    查看session 5秒没用的 就让该session失效;
    	    
    long getLastAccessedTime();
    	 获取最后session 没使用的时间, 返回值是long的;  1970年到 没有使用时间的毫秒数?
    	   System.currentTimeMillis() - long getLastAccessedTime(); ---结果就是五秒没使用的session;
 */
public class Demo01 extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		response.setContentType("text/html;charset=UTF-8");
		//防止请求数据乱码;
		request.setCharacterEncoding("UTF-8");
		
		HttpSession session = request.getSession();
		System.out.println(session.getId()+"创建了");	
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

4.3 获取ServletContext的监听

public class MyServletContextListener implements ServletContextListener {
	@Override

	// 第一步:
	public void contextInitialized(ServletContextEvent sce) {
		// 创建一个数组 保存session;
		ArrayList<HttpSession> list = new ArrayList<>();
		// 从 ServletContextEvent 里面获取域;
		sce.getServletContext().setAttribute("list", list);

		// 当保存session的数组被创建出来
		// 就开始每隔一秒中检查一次, 有没有超过5秒的session 将他移除;
		Timer timer = new Timer();
		timer.schedule(new TimerTask() {

			@Override
			public void run() {
				System.out.println("扫描中");
				// 使用迭代器遍历集合
				Iterator<HttpSession> iterator = list.iterator();
				while (iterator.hasNext()) {
					// 获取每一个session
					HttpSession session = iterator.next();
					// 计算时间
					Long time = System.currentTimeMillis() - session.getLastAccessedTime();
					// 判断时间
					if (time > 5000) {
						// 让session失效,
						session.invalidate();
						// 从数组中删除该session
						iterator.remove();
						System.out.println(session.getId() + "被移除了");
					}
				}

			}
		}, 2000, 1000);
	}

	@Override
	public void contextDestroyed(ServletContextEvent sce) {
		// TODO Auto-generated method stub
		ServletContextListener.super.contextDestroyed(sce);
	}
}

  4.4  获取保存在ServletContext域 中的 session对象的数组  , 取出数组;

package com.lanou3g;

import java.util.ArrayList;

import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
/*
 * 创建监听session; 扔到数组里, 数组已经创建了保存在ServletContext域中了
 */
public class MyHttpSessionListener implements HttpSessionListener {
	@Override
	public void sessionCreated(HttpSessionEvent se) {
		 //获取保存在ServletContext域 中的 session对象的数组  , 取出数组;
		
		 ArrayList<HttpSession> list = ( ArrayList<HttpSession>)se.getSession().getServletContext().getAttribute("list");
		 //将创建好的session对象,放入数组中
		 list.add(se.getSession());
		 //从新将list放回域中?????-------不用了;	 
	}

	@Override
	public void sessionDestroyed(HttpSessionEvent se) {
		
	}
}二

二 .过滤器( Filter)

     1.  过滤器是处于客户端与服务器资源文件之间的一道过滤网,在访问资源文件之前,通过一系列的过滤器对请求进行修改、判断等,把不符合规则的请求在中途拦截或修改。也可以对响应进行过滤,拦截或修改响应。  

     2.Filter配置和Servlet配置类似

     3.无论访问哪个jsp页面,都会事先设置其字符集,不用分别对每个页面都进行设置了。   

     4. 进入过滤器以后:需要  chain.doFilter(request, response); 才能回到

     5.当配置xml里面写/* 对所有的servlet 都有拦截左营

 

</filter>

	<filter-mapping>

		<filter-name>demo01</filter-name>

		<!-- 配置要过滤的路径  /* 过滤所有路径   可以填绝对的/Demo01 配一个过滤器 配一个所有路径都拦截,-->

		<url-pattern>/*</url-pattern>

		<!-- 配置拦截跳转方式 只要是请求就能拦截 -->

		<dispatcher>FORWARD</dispatcher> //加上这句, 只会拦截请求转发的路径
	</filter-mapping>

3. 分页查询

   1. 获取数据池 ,并且给数据池取出来的数据进行赋值, 利用Properties 集合进行文件读取,.properties放在src下面

package com.lanou3g;
/*
 * 获取数据库连接池类
 */

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

import javax.sql.DataSource;

import org.apache.commons.dbcp.BasicDataSource;

public class DataSourceUtil {
   private static   BasicDataSource dataSource = new BasicDataSource();
       static {
    	       //读取文件
    	      InputStream inputStream = DataSourceUtil.class.getClassLoader().getResourceAsStream("dbinfo.properties");
    	      Properties properties = new Properties();
    	      try {
				properties.load(inputStream);
				//设置连接池
				dataSource.setDriverClassName(properties.getProperty("driverClass"));
				dataSource.setUrl(properties.getProperty("url"));
				dataSource.setUsername(properties.getProperty("user"));
				dataSource.setPassword(properties.getProperty("password"));
				//扩展设置;字符串转成integer类型
				dataSource.setInitialSize(Integer.parseInt(properties.getProperty("initialSize")));
				dataSource.setMaxActive(Integer.parseInt(properties.getProperty("maxActive")));
				dataSource.setMaxIdle(Integer.parseInt(properties.getProperty("maxIdle")));
				dataSource.setMinIdle(Integer.parseInt(properties.getProperty("minIdle")));
				
				
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
       }
       
       //私有化构造方法 
       private DataSourceUtil() {
    	   
       }
       
       public static DataSource getDateSource() {
		return  dataSource;
	}
}

 2. 获取Sort表中的字段, 并且创建Sort对象, 对象属性与数据库字段一一对应!

package com.lanou3g;

public class Sort {
	private int sid;
	private String sname;
	private double sprice;
	private String sdesc;

	// 添加属性用于 多条件查询 where and and 
	private String min;
	private String max;

	public Sort() {
		super();
		// TODO Auto-generated constructor stub
	}

3 . 创建一个pagebean对象 里面有--1.当前页--2.每页多少条记录--3.总记录数--4.总页数--5.保存sort集合!

package com.lanou3g;

import java.util.ArrayList;

public class PageBean {
	// 当前页
	private int currentPage;
	// 每页显示多少条数据
	private int pageSize;
	// 总记录数
	private int count;
	// 总页数
	private int totalPage;
	// 保存数据的数组或者集合;
	private ArrayList<Sort> sorts;

	public PageBean() {
		super();
		// TODO Auto-generated constructor stub
	}

4.创建servlet网页

   首先知道 1.  pagesize 和currentPage( 默认为1)

               2. beginPage = (currentPage-1)*size

               3.count(总记录数)=直接数据库查询

              4. 总页数tatolPage= (count%pageSize )?(count/pageSize):(count/pageSize+1)

             5. sorts保存数据表中所有数据;--                

package com.lanou3g;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/*
 * 分页查询:
 * dao层: 
 *  1.ArrayList   findList(beginPage,pageSize)
 * limit  起始页(beginPage),每页显示多少条数据(pageSize);
 * 2.getCount(); 查询总记录数;
 * 
 * service 层调用dao层的方法. 
 * pageSize = 3;
 * beginPage=
 * 当前页,currentPage=1
 *  beginPage = (current-1)*pageSize
 *  tatalPage = (count%pageSize) ?(count/pageSize):(count/pageSize+1)
 *  9条 3页 
 *  注意: 将要返回的值封装成一个对象返回去;   
 *  
 *  
 *  jsp 页面都显示什么;
 *  1.商品数据,都在ArrayList 里面保存在
 *  2.上一页和下一页 currentPage-1;
 *  3.下一页 currentPage+1
 *    第几页  currentPage
 *    共几页  totalPage = (总记录数count)
 * 
 *  
 *  Servlet 层
 *  1. 获取参数   currentPage(点上一页或下一页传来的,)
 *  第一次访问 默认当前页 currentPage =1;
 *   2. 调用service 的方法, 封装好的对象PageBean,
 *   请求分法
 *   
 * 3.把封装好的的pageBean保存到域中, 转发到jsp页面中显示对象;
 */
public class ListServlet extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

		response.setContentType("text/html;charset=UTF-8");
		// 防止请求数据乱码;
		request.setCharacterEncoding("UTF-8");
		// 获取参数
		// 默认从第一页开始
		int currentPage = 1;
		String currentPageString = request.getParameter("currentPage");
		if (currentPageString != null) {
			// 不等于null默认点了上一页或者下一页
			currentPage = Integer.parseInt(currentPageString);
		}
		// 每页显示多少条数据
		int pageSize = 3;
		// 调用逻辑层方法
		ListService service = new ListService();
		PageBean pageBean = service.findList(pageSize, currentPage);

		// 跳转页面
         request.setAttribute("pageBean", pageBean);
         request.getRequestDispatcher("/list.jsp").forward(request, response);
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

5. 完成pageBean的对象的封装, 以及调用service层的方法

	// 分页查询
	public PageBean findList(int pageSize, int currentPage) {
		// 计算
		int beginPage = (currentPage - 1) * pageSize;

		// 获取查询集合
		ArrayList<Sort> sorts = null;
		int count = 0;
		try {
			sorts = dao.findList(beginPage, pageSize);
			// 获取总记录数
			count = dao.getCount();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		// 获取总页数
		int totalPage = (count % pageSize == 0) ? (count / pageSize) : (count / pageSize + 1);

		// 创建pageBean
		PageBean pageBean = new PageBean(currentPage, pageSize, count, totalPage, sorts);

		return pageBean;
	}

}
6 .调用dao层的方法. 获取list集合 以及 limit( beginpage, pagesize )
package com.lanou3g;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;

public class ListDao {
	private QueryRunner runner = new QueryRunner(DataSourceUtil.getDateSource());

	public ArrayList<Sort> findList(int beginPage, int pageSize) throws SQLException {
		// 分页查询
		String sql = "select *from sort limit ?,?";
		Object[] params = { beginPage, pageSize };
		List<Sort> query = runner.query(sql, new BeanListHandler<>(Sort.class), params);
		ArrayList<Sort> sorts = (ArrayList<Sort>) query;
		return sorts;
	}

	public int getCount() throws SQLException {
		// 获取记录数;
		String sql = "select count(*) from sort ";
		Long query = runner.query(sql, new ScalarHandler<>());
		return query.intValue();
	}

}

7. jsp内容

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@taglib uri="http://java.sun.com/jsp/jstl/core"  prefix="c"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
	<table>
		<tr>
			<td>商品</td>
			<td>名称</td>
			<td>目录</td>
		</tr>
       <c:forEach items="${pageBean.sorts }" var="sort" >
          <tr>
			<td>${sort.sname }</td>
			<td>${sort.sprice }</td>
			<td>${sort.sdesc }</td>
		 </tr>
	
       </c:forEach>
	</table>
	
	
       	 <!-- 上一页 第几页 共几页 下一页 
		  
		 -->
		 <a href="${pageContext.request.contextPath }/listServlet?currentPage=${pageBean.currentPage-1}">上一页</a>
		      第${pageBean.currentPage==1:pageBean.currentPage?pageBean.currentPage-1 }页--- 
		      共${pageBean.totalPage }页
		  <a href="${pageContext.request.contextPath }/listServlet?currentPage=${pageBean.currentPage+1}">下一页</a>
       
</body>
</html>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值