Document

回顾:
jsp:
	java服务器页面
	jsp的脚本
	jsp的注释
		html注释
		java注释
		jsp注释
			<%-- --%>
	jsp的指令
		page:声明页面一些属性
			重要的属性:
				import
				pageEncoding
				contentType
			了解属性
				isErrorPage:一旦他的值为true jsp页面就是可以使用exception内置对象
		include:静态包含,(内容)
		taglib:导入标签库
		
	jsp的内置对象 9个
		out 
		request
		response
		session
		
		exception
		page
		config
		application
		pageContext
	jsp的域对象
		pageContext
		request
		session
		application
	jsp的动作标签
		jsp:forward 请求转发
		jsp:include 动态包含(运行结果)
el:
	从jsp2.0使用的内置表达式语言
	替代<%=...%>
	作用:
		1.获取域中的数据
			简单
				${域.域中属性名}
				${域中属性名}:若找不到返回一个""
				注意:
					若属性名字中有"."等特殊符号的时候
						必须使用 ${域["域中属性名"]}
			复杂
				数组和list ${域中名称[index]}
				map 	${域中的名称.键}
			javabean导航
				javabean:
					1.必须公共的类
					2.私有字段
					3.提供公共的访问字段的方法  get|set|is
						一旦提供公共的方法之后,get|set|is后面的名称首字母小写,这个东西称之为bean属性
							例如:getName()  name就是一个bean属性
					4.提供一个无参构造器
					5.一般会实现序列化接口
					
				${域中的属性名.bean属性}
		2.执行运算
			注意:
				+
				empty
				三元运算符
	el的内置对象:
		cookie
			${cookie.cookie名称.value}
		pageContext
			在jsp页面动态的获取项目路径 /day11
				${pageContext.request.contextPath}
jstl:
	jsp 标准标签库
	apache组织
	使用步骤:
		1.导入jar包
		2.在页面上导入标签库
	core:核心包
		c:if 判断
		c:forEach 循环
//////////////////////////////////////////////////
分层和事务
案例-使用mvc思想完成转账操作
需求:
	在一个页面上有汇款人 收款人 转账金额.一旦转账之后,汇款人金额减少,收款人金额增多.使用事务控制起来.
技术分析:
	mvc思想
	事务
///////////////////////////////////
mvc思想
	servlet-->缺点:生成html内容太麻烦
		|
	jsp--->缺点:阅读起来不方便,维护比较困难
		|
	jsp+javabean:
			jsp的model1:
				jsp:接受请求,展示数据
				javabean:和数据打交道 
		|
	jsp+javabean+servlet
			jsp的model2:
				jsp:展示数据
				javabean:和数据打交道
				servlet:接受请求,处理业务逻辑
			就是MVC思想的体现
MVC:
	就是将业务逻辑,代码,显示相分离的一种思想
	M:model 模型 作用:主要是封装数据,封装对数据的访问
	V:view 	视图 作用:主要是用来展示数据 一般是jsp担任的
	C:ctrl	控制 作用:接受请求,找到相应的javabean完成业务逻辑
/////////////////////////
jsp设计模式1 model1:(了解)
	javabean+jsp
	javabean在model1使用(了解)
		<!-- 接受值 -->
		<jsp:useBean id="u" class="com.itheima.domain.User"></jsp:useBean><!--相当于  User u=new User()-->
		<jsp:setProperty property="name" name="u"/><!--相当于  u.setName(...)-->
		<jsp:setProperty property="password" name="u"/>

		<!-- 打印值-->
		<jsp:getProperty property="name" name="u"/>
//////////////////////////////////////
反射:
	1.获取class对象
		方式1:
			Class clazz=Class.forName("全限定名")
		方式2:
			Class clazz=类名.class;
		方式3:
			Class clazz=对象.getClass;
	2.可以获取对应类的构造方法(了解)
		Constructor con = clazz.getConstructor(Class .. paramClass);
		Person p = (Person) con.newInstance(参数);
	3.可以通过clazz创建一个对象(了解)
		clazz.newInstance();//相当于调用的无参构造器
	4.可以通过clazz获取所有的字段 getFiled()(了解中的了解)
	5.可以通过clazz获取所有的方法
		Method m = clazz.getMethod("sleep");//获取公共的方法
		Method m = clazz.getDeclaredMethod("sleep");//获取任意的方法
		
		注意:若是私有的方法 必须让该方法可以访问
			m.setAccessible(true);
	6.Method对象的invoke是有返回值,他的返回值就是目标方法执行的返回值
总结:
	有了class对象之后,无所不能.
////////////////
javabean在model2中使用
	BeanUtils:可以看作封装数据一个工具类
		使用步骤:
			1.导入jar包
			2.使用BeanUtils.populate(Object bean,Map map);
	
/////////////////////////////////////////////////////////
分层:javaee的三层架构
	web
		作用:
			展示数据 ----jsp
			
			
			-----servlet-------
			接受请求
			找到对应的service,调用方法 完成逻辑操作
			信息生成或者页面跳转
	service 业务层
		作用:
			完成业务操作
			调用dao
	dao(data access object 数据访问对象)
		作用:
			对数据库的curd操作
/////////////////////////////////////////////////
/////////////////////////////////////////////////
事务:
	就是一件完整的事情,包含多个操作单元,这些操作要么全部成功,要么全部失败.
	例如:转账
		包含转出操作和转入操作.
	mysql中的事务:
		mysql中事务默认是自动提交,一条sql语句就是一个事务.
		开启手动事务方式
			方式1:关闭自动事务.(了解)
				set autocommit = off;
			方式2:手动开启一个事务.(理解)
				start transaction;-- 开启一个事务
				commit;-- 事务提交
				rollback;-- 事务回滚
		扩展:
			oracle中事务默认是手动的,必须手动提交才可以.
		
		例如:创建数据库和表
			create database day13;
			use day13;
			create table account(
				name varchar(20),
				money int
			);
			
			insert into account values('aa','1000');
			insert into account values('bb','1000');
			
		完成 aa给bb转500;
			update account set money = money - 500 where name='aa';
			update account set money = money + 500 where name='bb';
		////////////////////
	java中的事务:
		Connection接口的api:★
			setAutoCommit(false);//手动开启事务
			commit():事务提交
			rollback():事务回滚
		
		扩展:了解 Savepoint还原点
			void rollback(Savepoint savepoint) :还原到那个还原点
			Savepoint setSavepoint() :设置还原点
 /////////////////////////////
 步骤分析:
	1.数据库和表
	2.新建一个项目 day1301
	3.导入jar包和工具类
		驱动 jdbcUtils
		c3p0及其配置文件和工具类
		dbutils
	4.新建一个account.jsp 表单
	5.accountservlet:
		接受三个参数
		调用accountservice.account方法完成转账操作
		打印信息
	6.account方法中:
		使用jdbc不考虑事务
		调用dao完成转出操作
		调用dao完成转入操作
	7.dao中
			
	一旦出现异常,钱飞了.
	要想避免这事情,必须添加事务,在service添加事务.
	为了保证所有的操作在一个事务中,必须保证使用的是同一个连接
	在service层我们获取了连接,开启了事务.如何dao层使用此连接呢????
		方法1:
			向下传递参数.注意连接应该在service释放
		方法2:
			可以将connection对象绑定当前线程上
			jdk中有一个ThreadLocal类,
			ThreadLocal 实例通常是类中的 private static 字段,
			它们希望将状态与某一个线程(例如,用户 ID 或事务 ID)相关联。 
	ThreadLocal的方法:
		构造:
			new ThreadLocal()
		set(Object value):将内容和当前线程绑定
		Object get():获取和迪昂前线程绑定的内容
		remove():将当前线程和内容解绑
	内部维护了map集合
		map.put(当前线程,内容);
		map.get(当前线程)
		map.remove(当前线程)
/////////////////////////////////////////////
DButils:
	1.创建queryrunner
	2.编写sql
	3.执行sql
QueryRunner:
	构造:
		new QueryRunner(DataSource ds):自动事务
		new QueryRunner():手动事务
	常用方法:
		update(Connection conn,String sql,Object ... params):执行的cud操作
		query(Connection conn....):执行查询操作
	注意:
		一旦使用手动事务,调用方法的时候都需要手动传入connection,并且需要手动关闭连接
////////////////////////
事务总结:
	事务的特性:★★★
		ACID
		原子性:事务里面的操作单元不可切割,要么全部成功,要么全部失败
		一致性:事务执行前后,业务状态和其他业务状态保持一致.
		隔离性:一个事务执行的时候最好不要受到其他事务的影响
		持久性:一旦事务提交或者回滚.这个状态都要持久化到数据库中
	不考虑隔离性会出现的读问题★★
		脏读:在一个事务中读取到另一个事务没有提交的数据
		不可重复读:在一个事务中,两次查询的结果不一致(针对的update操作)
		虚读(幻读):在一个事务中,两次查询的结果不一致(针对的insert操作)
	通过设置数据库的隔离级别来避免上面的问题(理解)
		read uncommitted  	读未提交	上面的三个问题都会出现
		read committed  	读已提交	可以避免脏读的发生
		repeatable read		可重复读	可以避免脏读和不可重复读的发生
		serializable		串行化		可以避免所有的问题
	
	
	了解
		演示脏读的发生:
			将数据库的隔离级别设置成 读未提交
				set session transaction isolation level read uncommitted;
			查看数据库的隔离级别
				select @@tx_isolation;
		避免脏读的发生,将隔离级别设置成  读已提交
			set session transaction isolation level read committed;
			不可避免不可重复读的发生.
		
		避免不可重复读的发生 经隔离级别设置成 可重复读
			set session transaction isolation level  repeatable read;
			
		演示串行化 可以避免所有的问题
			set session transaction isolation level  serializable;
			锁表的操作.
		
	四种隔离级别的效率
		read uncommitted>read committed>repeatable read>serializable
	四种隔离级别的安全性
		read uncommitted<read committed<repeatable read<serializable
		
	开发中绝对不允许脏读发生.
		mysql中默认级别:repeatable read
		oracle中默认级别:read committed

	java中控制隔离级别:(了解)
		Connection的api
			void setTransactionIsolation(int level) 
				level是常量
 

///////////////////////////////////////
///////////////////////////////////////

///////////////////////////////////////
上午回顾:
jsp的设计模式
	model1:jsp+javabean(了解)
	model2:jsp+servlet+javabean
		jsp:展示数据
		servlet:接受请求,处理业务逻辑
		javabean:封装数据,封装对数据的访问
MVC:
	将业务逻辑 代码 显示相分离
	M:model 模型	封装数据,封装对数据的访问
	V:view	视图	展示数据,目前jsp担任
	C:ctrl	控制	接受请求
三层架构:
	web:
		作用:
			展示数据
			
			接受请求
			调用service
			页面跳转,信息的生成
	service
		作用:
			处理业务逻辑
			调用dao
	dao
		作用:
			对数据库的curd操作
///////////////////////
反射:
	1.获取class对象
	2.通过class获取构造器
	3.通过class获取字段
	4.通过class获取指定的方法
	5.可以执行方法
/////////////////////////
事务:
	就是一件完整的事情,可以包含多个操作单元,这些单元要么全部成功,要么全部失败
mysql中的事务(了解)
	默认自动提交. 
	控制事务:
		1.关闭自动事务
		2.手动打开一个事务
			start transaction;
			commit;
			rollback;
java中事务:(★)
	Connection的api
		setAutoCommit(false):手动开启事务
		commit():事务提交
		rollback():事务回滚
/////////////////////////////////
如何使用同一个connection
	1.向下传递
	2.将连接绑定到当前线程
		ThreadLocal
			set(Object value)
			Object get()
			remove()
//////////////////////////
DBUtils中事务控制
	QueryRunner:
		构造:
			new QueryRunner(Datasource ds)://自动事务.调用方法的不需要传入connection,资源不用我们释放.
			new QueryRunner()://手动事务.调用方法的必须传入connection,需要手动提交事务或者回滚事务.必须手动的释放资源
/////////////////////////
事务的特性 ★★★
	ACID
	原子性 一致性 隔离性 持久性
不考虑隔离性会出现的读问题★★
	脏读  不可重复度 虚读
数据库的隔离级别
	read uncommitted 读未提交 不能避免任何问题
	★read committed 	读已提交 避免脏读
	★repeatable read 可重复度 避免脏读和不可重复读的发生
	serializable 串行化 避免所有的问题
	
/////////////////////////
servlet
	会创建一个servlet
	会更改web.xml
	servletContext:
		全局管理者 上下文
			资源共享(域对象)
			获取资源文件
				getRealPath()
				getResourceAsStream()
			获取mimetype
				getMimeType()
	面试题:
		serlvet的生命周期
rr
	response:往浏览器写东西
		重定向:response.sendRedirect(绝对路径)
		定时刷新:refresh
			setHeader("refresh","秒数;url=跳转路径")
			meta
		getWriter():字符流
		getOutputStream():字节流
		文件下载:
			setContentType(mime类型)
			setHeader("content-disposition","attachment;filename="+文件名);
			
	request:获取浏览器发送过来的数据
		获取参数:3个
		中文乱码:
			通用的方式
				new String(名字.getBytes("iso-8859-1"),"utf-8");
			针对post请求
				request.setCharacterEncoding("utf-8");
		请求转发(域对象)
			request.getRequestDispatcher(内部路径).forward(..);
			
cookie和session
	cookie:浏览器端会话技术
		常用方法:
			new Cookie(String key,String value);
			写回浏览器
				response.addCookie(Cookie c)
			获取cookie
				request.getCookies()
			cookie的api
				getName()
				getValue()
				
				setMaxAge(int 秒)
				setPath(String path)
	session:服务器端的会话技术
		常用方法:
			获取session
				request.getSession
		域对象:私有的数据
			创建:
			销毁:
				服务器非正常关闭
				session超时
				手动删除:
					session.invalidate()
		
jsp el jstl
	jsp的指令 include taglib
	jsp的内置对象 面试题
	jsp:forward
	jsp:include
	
	el:全部
		获取数据
		执行运算
		
	jstl:
		if
		foreach
	
	
	
	
	

  

原文地址:https://www.cnblogs.com/chenyanlong/p/9986190.html