JSP 技術
掌握:JSP語法 + EL + JSTLhtml
爲何sun推出 JSP技術 ?
Servlet 生成網頁比較複雜,自己不支持HTML語法,html代碼須要經過response輸出流輸出,JSP支持HTML語法,生成HTML方便。java
JSP技術與Servlet 技術區別和關係?
JSP和Servlet技術都是用來動態生成網頁的,Servlet不支持HTML語法,生成網頁麻煩,JSP支持HTML語法,生成網頁方便,JSP運行時翻譯Servlet 執行的。JSP 就是 Servlet 。程序員
JSP運行原理是怎樣的 ?
客戶端訪問編寫JSP文件,服務器讀取JSP文件,根據JSP生成Servlet ,Servlet編譯運行生成網頁。web
JSP <%! %> <%= %> <% %>
<%! %> 聲明:定義翻譯後Servlet程序的 全局變量或全局方法、內部類
<%= %> 表達式 輸出內容到瀏覽器 效果out.print
<% %> 腳本代碼塊,嵌入java運行代碼 ---- 不翻譯sql
JSP翻譯Servlet 存放tomcat/work 目錄
* JSP翻譯Servlet 頁面當前全部HTML 翻譯爲 out.write 輸出數據庫
JSP的註釋 支持三種註釋
一、JSP註釋: <%-- --%> 只存在JSP文件源碼中,在JSP翻譯Servlet時,這類註釋消失了
* 該類註釋得不到執行 express
二、Java註釋: /** */文檔註釋、 /* */多行註釋、 // 單行註釋
文檔註釋 /** */ 生成javadoc 主要用來註釋 包、類、成員變量、成員方法 ------ 代碼功能使用者
多行註釋 和 單行註釋 不會生成javadoc,註釋代碼實現邏輯 用於在方法內 ------ 程序員自己,讀懂代碼進行註釋
* Java註釋 在JSP翻譯爲Servlet時存在,在Servlet程序執行時,會被忽略,生成HTML網頁源代碼中不存在
* 在Servlet執行過程當中被忽略數組
三、HTML註釋 <!-- -->
* 在JSP翻譯爲Servlet時 會被翻譯 out.print 在生成HTML頁面源代碼中該類註釋 也是存在的 瀏覽器
結論:JSP註釋在翻譯階段消失,Java註釋在Servlet運行階段消失,HTML註釋不消失 緩存
思考題:
<%
String s = "abcd";
%>
<!-- 用HTML註釋 註釋 JSP或者java代碼 <%=s%> -->
在頁面結果中 <!-- 用HTML註釋 註釋 JSP或者java代碼 abcd -->
結論: HTML註釋沒法阻止JSP或者 Java代碼執行的
JSP 指令 (JSP Directive)
page指令
include指令
taglib 指令
語法:<%@ 指令名稱 屬性=值 屬性=值 ... %>
page指令用來定義JSP文件的全局屬性 <% page 屬性=值 %>
一、language 只能爲java
二、extends JSP翻譯後Servlet 繼承父類,這個屬性通常不設置 ,若是非要設置,繼承類必須是Servlet實現類
三、session 定義JSP中是否能夠直接使用Session隱含對象
若是屬性設置爲true在JSP翻譯Servlet時 生成如下兩句代碼
HttpSession session = null;
session = pageContext.getSession();
* 若是jsp中想使用HttpSession對象,使用session屬性默認值true
四、import 完成 JSP翻譯後 Servlet 導包
jsp在翻譯爲Servlet 默認導包
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
jre默認導入 java.lang
* 在jsp中若是使用類 不屬於以上四個包,須要導包
五、buffer autoFlush 設置 out隱含對象屬性
buffer 設置緩衝區大小
autoFlush 設置當緩衝區滿後,自動刷出
六、isELIgnored 設置JSP是否執行EL表達式
isELIgnored="false" 不忽略---執行解析
isELIgnored="true" 忽略 ---- 不解析
* 通常就是默認值false
七、經過contentType和pageEncoding 設置 JSP頁面編碼
pageEncoding 是 JSP文件源代碼在硬盤上編碼集
contentType 在Servlet生成HTML 傳遞瀏覽器採用編碼
八、經過errorPage 和 isErrorPage 控制 JSP頁面發生錯誤時跳轉
設置錯誤友好頁面 ---- 當頁面發生錯誤,不該該給用戶看到含有代碼錯誤頁面,看到一個友好頁面
經過errorPage指定 在頁面發生錯誤跳轉到哪一個頁面
* IE 瀏覽器默認好友頁面 ,若是想看到本身編寫友好頁面,關閉IE默認友好頁面
IE 工具欄 --- Internet選項 ----- 高級 -----顯示友好HTTP錯誤信息 將鉤去掉
在錯誤友好頁面中,能夠經過設置isErrorPage屬性,得到錯誤緣由
*在實際開發中,通常不使用上面講解錯誤處理方式
錯誤頁面第二種處理方式: 不只能夠處理500 ,還能夠處理404
配置web.xml
<error-page>
<error-code>500</error-code>
<location>/demo5/500.jsp</location>
</error-page>
include指令 ,用來靜態包含頁面 ----- 將頁面公共部分提取出來,經過include完成頁面佈局
語法:<%@ include file="文件路徑" %>
include包含目標頁面整個內容,被包含頁面,不須要是一個完整HTML,只要編寫HTML片斷就能夠了
靜態include 原理
*在 JSP翻譯爲Servlet時,完成包含動做,Servlet程序並無執行,包含路徑不能用變量、不能含有?拼接參數,目標文件必須存在
* 存在特殊案例:被包含頁面存在錯誤,只要包含後Servlet沒有錯誤,就能夠執行
taglib指令 ,用來在jsp頁面引用標籤庫文件
* 定義標籤做用爲了簡化 jsp頁面開發
* 經過taglib 指令引入 jstl標籤庫 ,語法: <%taglib uri="" prefix="" %>
uri ---- 定義標籤 惟一命名空間
prefixt ---- 命名空間前綴
引用jstl時,在導入jstl.jar中 META-INF/c.tld
<short-name>c</short-name> -------- 就是prefix屬性
<uri>http://java.sun.com/jsp/jstl/core</uri> ----- 就是uri屬性
JSP的九個內置對象分別是什麼?
什麼是內置對象? JSP翻譯爲Servlet代碼時,有些對象默認已經建立好的,這類對象能夠直接在jsp中使用,內置對象
page、request、session、application、response、pageContext、out、config、exception
request HttpServletRequest ---- 請求對象
response HttpServletResponse ---- 響應對象
session HttpSession ------- 會話對象
application ServletContext ------ web應用全局惟一對象
config ServletConfig ------ 初始化數據
page this (HttpServlet)
pageContext PageContext
exception Throwable (全部異常父類) ----- 當頁面是一個錯誤頁面,用exception得到異常信息
* Throwable 是 exception 類 父類
out JspWriter
page 表明當前jsp生成Servlet對象
* page 是 Object類型,只能使用Object中方法 ---- 這個對象在開發中不建議 使用
* 能夠將page強制轉換 HttpServlet對象的
Servlet有幾種數據範圍? 三種: request、session、servletcontext
JSP 在 Servlet三種數據範圍基礎上,新添加page數據範圍 ---- JSP 四種數據範圍: page request session application
* page數據範圍存放數據 只在當前jsp內有效
pageContext表明當前頁面上下文
一、向page範圍存取數據
findAttribute 依次在 page 、request 、session 、 application 四個數據範圍進行數據查找
EL 中 ${name} 調用 findAttribute 在四個範圍中依次查找數據
二、pageContext 用來 得到其它八個隱含對象
* pageContext封裝八個隱含對象意義:框架編寫,獲得PageContext對象 至關於獲得 JSP九個內置對象
out對象
out功能向瀏覽器輸出信息,是JspWriter類型,內部使用PrintWriter實現,擁有獨立緩衝區。
out建立 ,out對象經過pageContext對象得到,建立pageContext對象時,指定out緩衝區大小以及是否自動flush
* 經過 page指令 buffer autoFlush 設置out 緩存區大小 以及是否自動 flush
out向瀏覽器輸出內容,response.getWriter 向瀏覽器輸出內容 , 區別?
out.println("aaa");
response.getWriter().println("bbb");
out.print("ccc");
response.getWriter輸出內容,在out輸出內容以前
page request session application response out config pageContext exception
JSP指令和JSP標籤 區分?
JSP 指令 Directive
JSP 標籤 Action
jsp中六個動做標籤
<jsp:useBean> <jsp:setProperty> <jsp:getProperty> ----- 與 JavaBean操做相關 明天學習
<jsp:include> <jsp:forward> <jsp:param >
<jsp:include> 效果 等價於 request.getRequestDispatcher().include
<jsp:forward> 效果 等價於 request.getRequestDispatcher().forward
<jsp:include> 標籤 功能 等價於 <%@ include %>
原理:動態包含
語法:<jsp:include page="文件路徑" />
被包含頁面不須要完整html,只須要編寫html片斷
jsp:include 和 @include 區別
@include include指令, 靜態包含,在jsp翻譯爲Servlet時,執行包含動做,包含結果是目標頁面翻譯Servlet源代碼 ,翻譯爲一個Servlet一塊兒執行
jsp include 標籤,動態包含, 在index servlet執行時 完成包含動做,包含結果是目標jsp翻譯Servlet生成 html頁面結果,每一個被包含jsp翻譯單獨Servlet進行執行
<jsp:forward page="/demo11/b.jsp"></jsp:forward> 等價於 request.getRequestDispatcher("/demo11/b.jsp").forward(request,response);
<jsp:forward page="/demo11/b.jsp">
<jsp:param value="itcast" name="name"/>
</jsp:forward>
上面寫法用jsp傳遞一個參數,用jsp若是向傳遞參數,直接經過setAttribute
EL 表達式語言,來自民間 ,Servlet2.4 以後 EL 被歸入官方規範
功能:
一、EL 得到 JSP四個範圍中保存數據 (訪問JavaBean的屬性)
二、EL 表達式支持運算
三、EL 內置 11個對象 --- web開發經常使用對象
四、EL 調用 java的方法
EL是從javaee1.4版本才被歸入規範,javaee1.3 及之前版本,默認對EL不進行解析
* 若是想 javaee1.3 以及以前版本解析 EL ------ 設置 page 屬性 isELIgnored = false
一、使用EL 得到 jsp四個範圍數據
使用EL指定查找四個範圍數據 ${pageScope.屬性名稱} ${requestScope.屬性名稱} ${sessionScope.屬性名稱} ${applicationScope.屬性名}
若是不執定查找數據範圍 ${屬性名稱} ---- 調用pageContext.findAttribute 在四個範圍依次查找
若是查找屬性不存在,返回是一個 "" 空串,而不是null
得到數組、List、Map時 有些狀況使用 [] 得到屬性值
. 和 [] 有什麼區別 ?
答案:. 和 [] 均可以用來取得EL 屬性值,.能夠實現功能 [] 均可以!
例如: ${pageScope.user.name} 也能夠寫爲 ${pageScope.user["name"]} (得到對象後,訪問對象屬性時才能夠用 [] 取代.效果 )
[] 可使用特殊標識信息,可是. 不能夠
例如:
pageContext.setAttribute("0","itcast");
pageContext.setAttribute("aa.bb","春生泰克");
只能經過[] 進行訪問 ----- 注意:在使用[] 進行屬性取值時,加"" , 不加"" 認爲是一個變量
在使用EL進行取值時,若是含有特使字符屬性,儘可能使用[] , 不然都使用. 就能夠了
二、在EL 中執行 算術、比較、邏輯運算
在EL 執行運算時,運算語句必須寫入 ${}中
* 在EL 得到屬性值 執行算術運算,自動類型轉換 ---- 執行算術運算時,進行運算參數,必須都是數字
${"a"+"b"} ---- 發生數字格式化錯誤
empty運算符
1) 判斷一個屬性是否存在 , 一般empty運算符都是結合c:if 一塊兒使用
2) 使用empty 判斷List 或者 Map是否爲空 (size==0)
二元表達式:${user!=null?user.name:""} ----- 三元運算符
三、EL 11個內置對象
pageScope requestScope sessionScope applicationScope 四個數據範圍,用來取值
pageContext 當前jsp上下文 ----- ${pageContext.request.contextPath }
${param.name} 等價於 request.getParameter("name")
${paramValues.hobby} 等價於 request.getParameterValues("hobby")
${header.referer} 等價於 request.getHeader("referer")
${headerValues["Accept-Encoding"]} 等價於 request.getHeaders("Accept-Encoding")
${initParam.name} 等價於 getServletContext().getInitParamter("name")
必須掌握cookie隱含對象寫法
Cookie[] cookies = request.getCookies();
if(cookies==null){
out.println("cookie不存在!");
}else{
for(Cookie cookie : cookies){
if(cookie.getName().equals("address")){
out.println(cookie.getValue());
}
}
}
使用EL : ${cookie.address.value }
四、EL獲取數據值,常常須要對取得數據值進行處理 ----- EL函數
步驟:
第一步:編寫java類,提供static方法
第二步:編寫tld文件 ,在tld文件中對函數進行定義描述
sun在jstl中提供一套EL函數庫,這套函數在導入jstl的jar包後,能夠直接使用
1) 導入jstl.jar
2) 在JSP頁面內,引入函數庫名稱空間
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
* 在jstl.jar 存在 META-INF/fn.tld 當中定義EL函數庫
3) sun提供EL函數庫主要對字符串進行操做 提供16個函數
語法:${fn:toUpperCase('asdasDSFSDF')}
外包項目,jsp內部不容許定義腳本元素 <%%> ----- 必須用標籤庫和表達式語言 實現<%%> 代碼效果
使用jstl步驟
一、去官網上下載jstl的jar 1.0 1.1 1.2
1.1和1.2 基本同樣 Servlet2.4(javaee1.4 ) 之後提出的
1.0 在 javaee1.3 以前提出的
* EL 在 javaee1.4 這個版本 歸入規範的 , jstl1.0 時 EL尚未歸入規範,全部1.0標籤默認不支持EL 的
二、jar包導入
jstl1.1 兩個jar jstl.jar standard.jar ----- jstl.jar 接口API standard.jar 代碼實現
將兩個jar包 複製工程/WebRoot/WEB-INF/lib 目錄中
三、在jsp頁面內 經過taglib指令 引入jstl 標籤庫對應uri
JSTL分爲五類:core核心標籤 fmt國際化標籤 sql數據庫標籤 xml操做xml標籤 fn是EL函數庫
由於數據庫操做和xml操做,都將代碼編寫Servlet中 ,因此 sql標籤庫和xml標籤庫不學習了
每一個標籤庫在jar/META-INF/ 對應一個tld文件
例如:c.tld 是jstl1.1版本的 c-1_0.tld 是 jstl1.0 版本標籤庫
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 導入1.1
<%@taglib uri="http://java.sun.com/jstl/core" prefix="c" %> 導入1.0 不支持EL
<%@taglib uri="http://java.sun.com/jstl/core_rt" prefix="c" %> 導入1.0 支持EL
* /jstl/demo.jsp(15,0) According to TLD or attribute directive in tag file, attribute test does not accept any expressions
12個核心標籤庫標籤
一、c:out 用於將內容輸出到頁面上 ------- 輸出EL值、提供默認值、HTML轉義輸出功能
二、c:set 用於設置一個變量或者屬性 ---- 向四個數據範圍保存一個數據,對四個數據範圍一個已經存在對象修改其屬性值
三、c:remove 用於移除四個數據範圍的數據
四、c:catch 至關於try -- catch代碼塊 ----- 捕獲異常,將異常對象保存page指定屬性中
五、c:if 取代頁面if 條件判斷
六、c:choose c:when c:otherwise 實現if -- else if -- else效果 --- 實現 switch 效果
七、c:forEach 實現 foreach循環效果 ----- 遍歷數組、List、Map、控制指定循環次數求和、在特殊次數進行操做
八、c:forTokens 完成字符串切割
九、c:param 不能單獨使用,一般與url相關標籤一塊兒使用 ,與c:url一塊兒使用完成中文編碼
十、c:import 導入目標頁面,將目標頁面內容保存起來,再進行使用
十一、c:url 完成URL重寫 (客戶端禁用cookie ,URL重寫拼接jSessionId),結合param對中文進行url編碼
12 c:redirect 標籤用於實現請求重定向
經常使用:c:set c:if c:forEach c:url進行中文url編碼 c:redirect
總結:一、JSP 和Servlet關係 二、JSP運行原理三、JSP 腳本元素三種 <%! %> <%=%> <% %>四、JSP三種註釋 五、page指令 contentType和pageEncoding區別 六、錯誤友好頁面 web.xml 配置七、<%@include %> 與 <jsp:include> 原理區別八、<jsp:forward>轉發 <c:redirect>重定向 九、EL 獲取數據 . []用法 十、empty not 使用十一、${pageContext.request.contextPath } 取得工程名 /day08 ----- ${cookie.name.value } 快速得到cookie值 十二、EL 使用 JSTL提供EL函數庫1三、JSTL 區分1.0 和 1.1 1四、經常使用core標籤 c:set 、c:if 、c:forEach 、c:url和c:param編碼、 c:redirect