1. 程式人生 > >jsp 事務 反射 基礎基礎知識

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