1. 程式人生 > >day12-(jsp&el&jstl)

day12-(jsp&el&jstl)

回顧:
jsp:
cookie:
    瀏覽器端會話技術
    由伺服器產生,生成key=value形式,通過響應頭(set-cookie)返回給瀏覽器,儲存在瀏覽器端
    下次訪問的時候根據一定的規則攜帶cookie,通過請求頭(cookie)攜帶給伺服器.
    常用方法:
        構造:
            new Cookie(String key,String value)
        寫回:
            response.addCookie(Cookie c)
        獲取:
            Cookie[] request.getCookies();
        cookie的api:
            getName():獲取cookie的名稱
            getValue():獲取cookie的值
            setMaxAge(
int 秒數);持久化 若int為0;刪除此cookie(前提必須路徑一致) setPath(String path):設定cookie的路徑 若訪問的連結的路徑中包含cookie的path,則攜帶 注意: cookie不能跨瀏覽器 cookie不支援中文 //////////////////////////// session: 伺服器端的會話技術 瀏覽器訪問伺服器的時候,伺服器會獲取jsessionid, 若獲取不到: 伺服器建立一個session,儲存使用者資料,將該session的jsessionid通過響應返回給瀏覽器 若獲取到: 伺服器拿著這個jessionid去session池中查詢有無此session 若查詢不到: 伺服器建立一個session,儲存使用者資料,將該session的jsessionid通過響應返回給瀏覽器 若查詢到: 拿過來直接使用,將該session的jsessionid通過響應返回給瀏覽器 常用方法: 獲取一個session request.getSession(); session域物件: xxxAttribute() 生命週期: 建立:java程式中第一次使用request.getsession方法的時候 銷燬: 伺服器非正常關閉 session超時 預設時間 手動設定時間 手動刪除★ session.invalidate(); 域物件: ServletContext:共享的資料 HttpServletRequest:一次請求的資料 HttpSession:私有的資料
///////////////////////////////////////////// jsp/el/jstl 案例1-在頁面中展示所有商品資訊,不要使用jsp的指令碼 技術分析: jsp/el/jstl ///////////////////////////////////////// jsp: java 伺服器頁面 作用: 將內容的生成和資訊的展示相分離 執行在伺服器端,本質上就是一個serlvet,產生的java檔案和class保留在tomcat的word目錄下. jsp指令碼: <%..%> java程式碼片段 <%=..%> 輸出表達式 相當於out.print(); <%!...%> 宣告成員 jsp的指令 作用:宣告jsp頁面的一些屬性和動作 格式:
<%@指令名稱 屬性="值" 屬性="值"%> jsp指令的分類: page:主要宣告jsp頁面的一些屬性 include:靜態包含. taglib:匯入標籤庫 注意: 一個頁面中可以出現多個指令 指令可以放在任意位置,一般都放在jsp頁面最上面. /////////////////////////// page指令: 重要屬性:3個 contentType:設定響應流的編碼,及通知瀏覽器用什麼編碼開啟.設定檔案的mimetype pageEncoding:設定頁面的編碼 import:匯入所需要的包 contentType和pageEncoding聯絡: 若兩者都出現的時候,各自使用各自的編碼 若只出現一者,兩個都使用出現的這個編碼 若兩者都不出現,使用伺服器預設的編碼 tomcat7使用的iso-8859-1 瞭解屬性: language:當前jsp頁面裡面可以巢狀的語言 buffer:設定jsp頁面的流的緩衝區的大小 autoFlush:是否自動重新整理 extends:聲明當前jsp的頁面繼承於那個類.必須繼承的是httpservlet 及其子類 session:設定jsp頁面是否可以使用session內建物件 isELIgnored:是否忽略el表示式 errorPage:當前jsp頁面出現異常的時候要跳轉到的jsp頁面 isErrorPage:當前jsp頁面是否是一個錯誤頁面 若值為true,可以使用jsp頁面的一個內建物件 exception include指令: 靜態包含,就是將其他頁面或者servlet的內容包含進來,一起進行編譯執行.生成一個java檔案. 格式: <%@include file="相對路徑或者是內部路徑" %> 例如: <%@include file="/jsp/include/i1.jsp" %> 路徑: 相對路徑: ./或者什麼都不寫 當前路徑 上一級路徑 ../ 絕對路徑: 帶協議和主機的絕對路徑 不帶協議和主機的絕對路徑 /專案名/資源 內部路徑: 不帶協議和主機的絕對路徑去掉專案名 請求轉發 靜態包含 動態包含 taglib指令:匯入標籤庫 格式: <%@taglib prefix="字首名" uri="名稱空間" %> 若匯入之後 <字首名:標籤 .. > 例如: <c:if test="">輸出內容</c:if> /////////////////////////////////// jsp的內建物件:★★★(9大內建物件) 在jsp頁面上可以直接使用的物件 內建物件 型別 out JspWriter request HttpServletRequest response HttpServletResponse session HttpSession exception Throwable page Servlet(this) config ServletConfig application ServletContext pageContext PageContext jsp的域物件:理解 application 整個專案 session 一次會話 request 一次請求 pageContext 一個頁面 pagecontext作用:理解 1.域物件 xxxAttribute() 2.操作其他域物件 方法: xxxAttribute(...,int scope); scope取值: APPLICATION_SCOPE SESSION_SCOPE REQUEST_SCOPE PAGE_SCOPE 3.獲取其他的內建物件 getXxx() 注意: getRequest():獲取request內建物件 4.便捷查詢, findAttribute(String key): 依次從pagecontext,request,session,application四個域中,查詢相應的屬性,若查詢到了返回值,且結束該次查詢 若查詢不到,返回一個null jsp的動作標籤 <jsp:forward>:請求轉發 相當於java中 request.getRequestDispatcher(..).forward(..); <jsp:forward page="內部路徑"></jsp:forward> <jsp:include>:動態包含 就是將被包含頁面或者servlet的執行結果包含到當前頁面中. ///////////////////////////////////////////////////////// el: jsp的內建表示式語言,從jsp2.0開始. 用來替代<%=..%> 作用: 1.獲取域中資料 ★ 2.執行運算 ★ 3.獲取常見的web物件 4.呼叫java的方法 格式: ${el表示式} 獲取域中資料:★ 注意:★ 若屬性名中出現了"."|"+"|"-"等特殊符號,需要使用scope獲取 例如: ${requestScope["arr.age"] } 獲取簡單資料 ${pageScope|requestScope|sessionScope|applicationScope.屬性名} 以後經常使用: ${屬性名}:依次從pageContext,request,session,application查詢指定屬性,若查詢到返回值,結束該次查詢 若查詢不到,返回"" 獲取複雜資料 獲取陣列中的資料 ${域中的名稱[index]} 獲取list中的資料 ${域中的名稱[index]} 獲取map中的資料 ${域中的名稱.鍵名} javabean導航 javabean: java語言編寫的一個可重用的元件, 狹義上來說就是我們編寫的一個普通的java類 例如:User Person javabean規範: 1.必須是一個公共的具體的類 public class 2.提供私有的欄位 private String id;//id稱之為欄位 3.提供公共訪問欄位的方法 get|set|is方法 public String getId(){..} 一旦有公共的方法之後,get|set|is之後的內容,將首字母小寫,將這個東西稱之為bean屬性 id就是一個bean屬性 4.提供一個無參的構造器 5.一般實現序列化介面 serializable ${域中javabean名稱.bean屬性} ////////////////// 執行運算: 四則運算 關係(>..) 邏輯(&& ||) 注意: +:只能進行加法運算,字串形式數字可以進行加法運算. empty:判斷一個容器的長度是否為0(array set list map),還可以判斷一個物件是否為空 ${empty 域中的物件名稱} 三元運算子 ////////////////// el的內建物件(瞭解) 11個 pageScope requestScope sessionScope applicationScope param paramValues header haederValues initParam cookie★ pageContext★ 注意: 除了pagecontext其餘物件獲取的全是map集合 瞭解:和引數相關的el內建物件 param paramValues 瞭解:和請求頭相關的el內建物件 header haederValues 瞭解:和全域性初始化引數相關的el內建物件 initParam cookie內建物件: ${cookie} 獲取map{key=Cookie} 例如:建立cookie Cookie c=new Cookie("username","tom"); 通過${cookie}獲取相當於 {username=new Cookie("username","tom")} 相當於map的key是cookie的鍵 map的value是當前cookie 若項獲取名稱username的cookie的value值(獲取tom) ${cookie.username.value}--javabean導航 注意: java中Cookie的api getName():獲取cookie的名稱 getValue():獲取cookie的value值 我們稱name和value是cookie的bean屬性 使用cookie內建物件: ${cookie.給cookie起名字.value} 例如: 獲取jsession的值 ${cookie.JSESSIONID.value} pageContext:獲取不是map集合,相當於jsp的pageContext內建物件 在jsp頁面中獲取專案名 ${pageContext.request.contextPath} ///////////////////////////////////////// ///////////////////////////////////////// jsp註釋: html註釋 <!-- --> 註釋的內容只在頁面上看不到 java程式碼和html原始碼都有 java註釋 只在java程式碼中存在 jsp註釋 <%-- --%> 只在jsp頁面中存在,翻譯成java檔案之後就沒有了 /////////////////////// /////////////////////// jstl: jsp標準的標籤庫語言 apache的 用來替代java指令碼 使用步驟: 1.匯入jar包 (jstl.jar和standard.jar) 2.在頁面上匯入標籤庫 <%@taglib prefix="" uri=""%> 例如: <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> jstl的分類: core:核心類庫 ★ fmt:格式化|國際化 xml:過時了 sql:過時了 函式庫:很少使用 core:掌握 ★c:if ★c:forEach c:set 往域中設定值 c:choose c:when c:otherwise 分支 ★c:if 判斷 <c:if test="${el表示式}">滿足的時候輸出的內容</c:if> 例如: <c:if test="${3>4 }"> 3大於4 </c:if> <c:if test="${3<=4 }"> 3不大於4 </c:if> ////////////// ★c:forEach 迴圈 格式1: <c:forEach begin="從那裡開始" end="到那裡結束" step="步長" var="給變數起個名字" varStatus="迴圈狀態變數"> ${i }--${vs.count }--${vs.current }<br> </c:forEach> varStatus:用來記錄迴圈的狀態 常用的屬性: count:記錄次數 current:當前遍歷的內容 例如: <c:forEach begin="1" end="20" step="2" var="i" varStatus="vs"> ${i }--${vs.count }--${vs.current }<br> </c:forEach> 格式2: <c:forEach items="${el獲取域中的容器}" var="n"> ${n } </c:forEach> 例如: //遍歷list <c:forEach items="${list }" var="n"> ${n } </c:forEach> //遍歷map <c:forEach items="${map }" var="en"> ${en.key }-- ${en.value }<br/> </c:forEach> 擴充套件: c:set 和 c:choose 函式庫: ////////////////////////// 案例1-步驟分析: 1.資料庫和表 create database day12; use day12; create table product( id int primary key auto_increment, pname varchar(20), price double, pdesc varchar(20) ); insert into product values (null,'電視機',3200,'液晶曲面大電視'); insert into product values (null,'韭菜盒子',3,'味重請小心食用'); insert into product values (null,'益達',10,'韭菜伴侶'); insert into product values (null,'十三香',12,'守義牌'); 新建一個專案 匯入jar包: 驅動 dbutils c3p0 jstl 匯入c3p0配置檔案 和工具類 實體類: private int id; private String pname; private double price; private String pdesc; 2.index.jsp中新增一個連線 <a href="/day1201/findAll">展示所有商品</a> 3.FindAllServlet: 呼叫ProductService.findAll() 返回一個集合 List<Product> 將list放入request域中 請求轉發到product_list.jsp 4.ProductService.findAll() 呼叫dao.findAll() 5.dao.findAll() 使用beanListHandler() 6.在product_list.jsp展示所有商品 使用 c:forEach 使用javabean導航獲取裡面的資料 ///////////////////////////// 案例2-重寫登入案例 需求: 在頁面上填寫使用者名稱和密碼及驗證碼,點選提交,先校驗驗證碼是否一致.若一致後再去找資料庫.順便記住使用者名稱 技術: 表單 驗證碼 servlet request session cookie 步驟分析: 1.資料庫和表 create table user( id int primary key auto_increment, username varchar(20), password varchar(20) ); 2.建立一個專案 包結構 jar包 工具類和配置檔案 3.表單 login.jsp 4.表單提交 loginServlet loginServlet: 獲取驗證碼(從前臺傳過來和session中) 判斷兩個驗證碼是否一致 若不一致: 填寫錯誤資訊,請求轉發到login.jsp 若一致:獲取使用者名稱和密碼 呼叫userService的getuserbyusernameandpassword 返回值 User user 判斷user是否為空 若為空:填寫錯誤資訊,請求轉發到login.jsp 若不為空: 繼續判斷是否勾選了記住使用者名稱 若勾選: 建立cookie 將使用者名稱放入cookie寫回瀏覽器 將user物件放入session中 頁面重定向 index.jsp 展示 xxx:歡迎回來 //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// 上午回顧: jsp: 作用: 將內容的生成和資訊的展示相分離 jsp指令碼: jsp的指令: 作用:宣告jsp頁面的一些屬性或者動作 格式: <%@指令名 屬性=值 屬性=值%> page: 重要屬性: import pageEncoding: contentType: 瞭解: isErrorPage:一旦值為true 可以使用jsp的一個內建物件 exception include:靜態包含,就是將被包含頁面或者servlet的所有內容複製過來一起編譯執行,只生成一個java檔案 taglib:匯入標籤庫 jsp的內建物件: out request response session exception page config application pageContext jsp的域物件: pageContext request session application pageContext的使用: 1.域物件 xxxAttribute() 2.操作其他域物件 xxxAttribute(..,int scope) 3.獲取其他的內建物件 getXxx() 4.便捷查詢 findAttribute(String key):依次從小到大 jsp的動作標籤 jsp:forward 請求轉發 jsp:include 動態包含 是將被包含頁面或者servlet執行的結果包含進來 el: jsp內建的表示式語言 用來替代 <%=...%> 作用: 注意: 若屬性名中出現一些特殊符號 "."等等 必須使用:${域Scope["屬性名"]} 1.獲取域中的資料 獲取簡單資料 ${域Scope.屬性名} ${域中的屬性名}:依次從小到大 獲取複雜資料 陣列和list ${域中的容器名稱[index]} map ${域中的容器名稱.鍵名} javabean導航 ${域中的bean名稱.bean屬性} 2.執行運算 注意: +:加法運算 empty:判斷一個容器的長度是否為0,還能判斷一個物件是否為空 ${empty 域中的物件} ${not empty 域中的物件} 三元運算子 3.獲取常見的web物件 4.呼叫java的方法 /////////////////// el內建物件(11個) cookie: ${cookie.cookie的key.value} pageContext ${pageContext.request.contextPath}://動態獲取