jsp 事務 反射 基礎基礎知識
為了方便之後的複習,將學習筆記釋出到部落格中,供大家使用。
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