JavaWeb之JDBC分页/监听器(十六)

多表关联操作

1. 一对多(客户与订单表)

# 一对多(客户与订单表)
0. C3P0工具类
1. 建domain类与之对应要建立相应的表结构
	Customer表
	private int id;
	private String name;
	private List<Orders> orders = new ArrayList<Orders>();
	Orders表
	private int id;
	private String num;
	private float money;
	private Customer customer;
2. CustomerDaoImpl类
	addCustomer(Customer c)
	Customer findByCustomerId(int i,boolean isDelay) //isDelay是否显示对应的信息
3. 测试类
testAdd()方法
	Customer c = new Customer();
	c.setId(1);
	c.setName("红姐");

	Orders o1 = new Orders();
	o1.setId(1);
	o1.setNum("201401");
	o1.setMoney(1000);

	Orders o2 = new Orders();
	o2.setId(2);
	o2.setNum("201402");
	o2.setMoney(2000);

	//建立关系
testQuery()方法

2. 多对多(学生与教师表结构)

# 多对多(学生与教师表结构)
0. C3P0工具类
1. 建domain类与之对应要建立相应的表结构
	学生信息表Student
		private int id;
		private String name;
		private String grade;
		private List<Teacher> teachers = new ArrayList<Teacher>();
	教师信息表
		private int id;// Integer
		private String name;
		private float money;
		private List<Student> students = new ArrayList<Student>();
2. TeacherDaoImpl类
	void addTeacher(Teacher t1)
		//判断该学生是否存在,?为什么要判断呢,因为如果不判断的话,当添加到第二个老师的时候,学生会再次添加到表中,主键有也约束的
	Teacher findTeacherById(int i)
3. 测试类
addTest()
	Teacher t1= new Teacher();
	t1.setId(1);
	t1.setName("QB");
	t1.setMoney(10000);

	Teacher t2= new Teacher();
	t2.setId(2);
	t2.setName("WYJ");
	t2.setMoney(10000);

	Student s1 = new Student();
	s1.setId(1);
	s1.setName("DDD");
	s1.setGrade("A");

	Student s2 = new Student();
	s2.setId(2);
	s2.setName("DJJ");
	s2.setGrade("A");
testQuery()

分页技术

1. 建domain类与之对应要建立相应的表结构
	create table account (
	  id int primary key,
	  name varchar(20),
	  money float
	);
	insert into account values(1,‘aaa‘,1500);
	insert into account values(2,‘bbb‘,1300);
	insert into account values(3,‘ccc‘,1100);
	insert into account values(4,‘ddd‘,1400);
	insert into account values(5,‘eee‘,13300);
	insert into account values(6,‘fff‘,1100);
	insert into account values(7,‘张三‘,22100);
	insert into account values(8,‘小陈‘,13300);
	insert into account values(9,‘阿娇‘,5500);
	insert into account values(10,‘小芙‘,700);
	insert into account values(11,‘丽哥‘,600);
	insert into account values(12,‘ggg‘,900);
	insert into account values(13,‘hhh‘,800);

	------------------------------------------
	或者使用循环语句批量插入数据
	AccountDaoImpl dao = new AccountDaoImpl();
	Account a = new Account();
	Random r = new Random();
	String base = Unicode.getUnicode();
	for(int i=1; i<100; i++) {
		a.setId(i);
		a.setName(base.charAt(r.nextInt(base.length()))+""+base.charAt(r.nextInt(base.length()))+""+base.charAt(r.nextInt(base.length()))+"");
		a.setMoney(10000.00f+i*20);
		dao.updateAccount(a);
	}
	------------------------------------------
	Java类Account
	private int id;
	private String name;
	private float money;

2. 数据访问层AccountDaoImpl类
	int getCount()	//获取总记录
	List<Account> getAccountByPage(int startIndex, int size)	//获取每页内容,用作分页查询

3. 建立PageBean类
	private int prep;//上一页getPrep
		如果当前页小于1,上一页就等于1;	prep = 1;
		否则上一页等于==当前页-1;		prep = pageNo-1;

	private int nextp;//下一页getNextp
		如果下一页大于总页数,下一页就等于总页数		nextp = this.getTotalPage();
		否则就是下一页等于当前页+1 nexp = pageNo+1;

	private int totalPage;//总页数-->getTotalPage
		如果总记录数取余每页显示记录数等于0   totalPage=totalRecordes/pageSize
		否则   totalPage=totalRecordes/pageSize+1;

	private int startIndex;//当前页的第一条记录的索引
		(当前页-1)*pageSize--->getStartIndex

	//为了加入滚动数字
	private int endPageno;
	private int beginPageno;
		1. 如果当前页小于9的话,起始页为1,结束页为总页数
		2.
			否则起始页-4,结束页相应+4
			如果起始页小于0	beginPage=1;
			如果结束页大于总页数	endPageno=this.getTotalPage();

	private int pageNo=1;//当前页
	private int pageSize=3;//每页显示的记录数

	private int totalRecordes;//总记录数
	private List recordes;// 当前页的记录

	private String url;

4. 业务层AccountServiceImpl类
	void findAccountByPage(PageBean pb)		//进行分页查询
	设置总记录数和当前页的记录	

5. ControllerServlet
	1. 乱码问题/生成一个分页组件/获取新的当前页/
	2. 如果当前页不为空并且不等于空,将当前页设置到分页组件中
	3. 调用业务方法,实现分页查询
	4. 设置分页组件中的url
	5. 将分页组件对象设置到request域中
	6. 转发到页面中

页面设计
1. index.jsp	<jsp:forward>转发到servlet中
2. list.jsp		在表格中显示数据库中的数据	静态包含page.jsp
3. page.jsp
	1. 当前页/总共页显示	上一页
	2. 滚动数字	遍历每一页 begin/end
	3. 下一页
	4. 选择页(改变事件onchange=changePage(this))
		遍历每一页

	changePage(objOpt) {
		地址栏信息提交页去option的value
	}

监听器

1. 自定义监听器

# 自定义观察者模式
1. 定义监听器接口StudentListener
	监听学习方法	void preStudy(StudentEvent event);
	监听吃饭的方法	void preEat(StudentEvent event);
2. 定义事件类StudentEvent
	定义事件源对象/有参构造/getter/setter
3. 事件本身Student学生类
	1. name/监听对象,有参构造
	2. void addStudentListener(StudentListener listener)
	3. void study()	如果监听的对象不为空,执行监听学习方法
	4. void eat()如果监听的对象不为空,执行监听吃饭方法
4. 测试学生类/添加事件源/执行学生中的方法

2. Servlet规范中的8个监听器

感知型
	HttpSessionBindingListenner: 监听自身是否到Httpsession中去了
	HttpSessionActivationListener: 监听自身何时钝化和激活

监听器
	事件:
	事件源:
	事件处理程序:
监听三个对象创建和销毁ServletContext/HttpSession/ServletRequest
	ServletContextListener
	HttpSessionListener
	ServletRequestListenner
监听域中数据变化
	ServletContextAttributeListenner
	HttpSessionAttributeListener
	ServletRequestAttributeListener

感知型监听器
	HttpSessionBindingListenner:感知自己何时被HttpSession绑和解绑
	HttpSessionActivationListener:感知自己何时随着HttpSession钝化和激活

监听器实现步骤
	1. 写类(实现相应Listenner接口)
	2. 配置web.xml	注册
	<listener>
		<listener-class>全路径名</listener-class>
	</listener>

3. 显示在线用户,并能踢人

1. LoginServlet类
	1.1 解决乱码问题
	1.2 获取登录参数
	1.3 调用业务逻辑,判断用户登录是否成功...
	1.4 创建一个User对象,将登录参数封装进去
	1.5 将user设置到session域中
	1.6 重定向到主页面

2. 使用监听器监听域中的数据,如果有向session域中添加值,这里可以使用监听器类监听到
	所以新建一个UserListener类,实现HttpSessionAttributeListener类,实现其中的方法
	配置web.xml

	2.1 首先通过HttpSessionBindingEvent获取到session对象
	2.2 获取session中的user对象
	2.3 如果对象为空直接返回
	2.4 创建User对象
	2.5 判断session中对象是否是User类,如果是 直接将该对象赋值给user
	2.6 如果user对象不等于空
		通过session对象获取ServletContext
		经典代码实现将map设置到context域中(注意map要同步)
		将session对象添加到map集合中

3. 踢出KickServlet类
	3.1 获取username参数
	3.2 将username处理乱码,编码解码
	3.3 得到ServletContext
	3.4 获取context域中的map
	3.5 获取map中的session
	3.6 如果session不等于空,才移除session中的user
	3.7 通过username从集合中移除该用户
	3.8 重定向到首页

页面设计
1. login.jsp 提供登录页面,提交到登录LoginServlet
2. index.jsp 主页,如果session中的user不为空,显示在线的用户列表
	因为用户需要在全局显示,所以这里需要将用户列表存在map中,然后遍历集合
	使用<c:url >标签封装地址栏信息,请求参数username,值为,遍历的key
	添加踢人功能链接到url上
时间: 2024-08-05 13:51:59

JavaWeb之JDBC分页/监听器(十六)的相关文章

笔记: JDBC分页&amp;监听器

JDBC分页: * 概述: * 定义:将一页显示的内容,分成两页或两页以上来显示. * 分类: * 物理分页: * 就是在查询数据库记录时,已经实现分页. * 这种分页技术一定是数据库提供.(不同数据库实现方式不同) * 逻辑分页: * 就是查询数据库所有记录,然后在通过Java代码实现分页效果. * 逻辑分页与数据库产品本身是无关的. * 物理分页: * MySQL的Limit: * 语法:SELECT * FROM 表名 LIMIT 位置偏移量,行数; * 问题:Limit是否可以实现分页效

Bootstrap &lt;基础二十六&gt;进度条

Bootstrap 进度条.在本教程中,你将看到如何使用 Bootstrap 创建加载.重定向或动作状态的进度条. Bootstrap 进度条使用 CSS3 过渡和动画来获得该效果.Internet Explorer 9 及之前的版本和旧版的 Firefox 不支持该特性,Opera 12 不支持动画. 默认的进度条 创建一个基本的进度条的步骤如下: 添加一个带有 class .progress 的 <div>. 接着,在上面的 <div> 内,添加一个带有 class .prog

Gradle 1.12用户指南翻译——第三十六章. Sonar Runner 插件

本文由CSDN博客万一博主翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Github上的地址: https://github.com/msdx/gradledoc/tree/1.12. 直接浏览双语版的文档请访问: http://gradledoc.qiniudn.com/1.12/userguide/userguide.html. 另外,Android 手机用户可通过我写的一个

十六、mysql 分区之 简单sql优化2

1.索引的分类 B-Tree 基本支持 HASH 只有memory支持 R-Tree myisam支持 Full-text myisam支持(全文索引) 2.Memory引擎下只有“=”条件才会使用索引 =============================== 导入数据的优化 ======================== 3.如何提高myisam的导入效率 alter table emp disable keys;关闭索引 load data infile 'aa.sql' into

Java 设计模式系列(十六)观察者模式(Observer)

Java 设计模式系列(十六)观察者模式(Observer) 观察者模式是对象的行为模式,又叫发布-订阅(Publish/Subscribe)模式.模型-视图(Model/View)模式.源-监听器(Source/Listener)模式或从属者(Dependents)模式. 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己. 一.观察者模式的结构 Subject:目标对象,通常具有如下功能:

李晓菁201771010114《面向对象程序设计Java》第十六周学习总结

一:理论知识 1.线程的概念: 程序是一段静态的代码,它是应用程序执行的蓝本.‐进程是程序的一次动态执行,它对应了从代码加载.执行至执行完毕的一个完整过程. 多线程是进程执行过程中产生的多条执行线索.‐线程是比进程执行更小的单位.‐线程不能独立存在,必须存在于进程中,同一进程的各线程间共享进程空间的数据.‐每个线程有它自身的产生.存在和消亡的过程,是一个动态的概念.‐多线程意味着一个程序的多行语句可以看上去几乎在同一时间内同时运行. (2)Java中实现多线程的途径有两种: ‐创建Thread类

马凯军201771010116《面向对象与程序设计Java》第十六周知识学习总结

一:理论知识部分 1.线程的概念: 程序是一段静态的代码,它是应用程序执行的蓝 本. ‐进程是程序的一次动态执行,它对应了从代码加 载.执行至执行完毕的一个完整过程. 多线程是进程执行过程中产生的多条执行线索. ‐线程是比进程执行更小的单位. ‐线程不能独立存在,必须存在于进程中,同一进 程的各线程间共享进程空间的数据. ‐每个线程有它自身的产生.存在和消亡的过程, 是一个动态的概念. ‐多线程意味着一个程序的多行语句可以看上去几 乎在同一时间内同时运行. (2)Java中实现多线程的途径有两种

201771010101 白玛次仁 《2018面向对象程序设计(Java)》第十六周学习总结

实验十六  线程技术 实验时间 2017-12-8 1.学习总结: 1.程序 是一段静态的代码,它应用程序执行蓝 是一段静态的代码,它应用程序执行蓝 本.2.进程 是程序的一次动态执行,它对应了从代码加 是程序的一次动态执行,,它对应了从代码加 载.执行至完毕的一个整过程. 3.操作系统为每个进程分配一段独立的内存空间和 系统资源,包括:代码数据以及堆栈等.每 系统资源,包括:代码数据以及堆栈等.每 一个进程的内部数据和状态都是完全独立. 4.多任务操作系统 中,进程切换对 CPU 资源消耗较

Flask 教程 第十六章:全文搜索

本文翻译自The Flask Mega-Tutorial Part XVI: Full-Text Search 这是Flask Mega-Tutorial系列的第十六部分,我将在其中为Microblog添加全文搜索功能. 本章的目标是为Microblog实现搜索功能,以便用户可以使用自然语言查找有趣的用户动态内容.许多不同类型的网站,都可以使用Google,Bing等搜索引擎来索引所有内容,并通过其搜索API提供搜索结果. 这这方法适用于静态页面较多的的大部分网站,比如论坛. 但在我的应用中,基