1)Jsp的執行過程html
tomcat服務器完成:jsp文件->翻譯成java文件->編譯成class字節碼文件-> 構造類對象-> 調用方法java
tomcat的work目錄下存放jsp運行時的臨時文件!!web
2)Jsp語法:sql
1)jsp表達式:<%=變量或表達式%> 向瀏覽器輸出變量或表達式計算的結果瀏覽器
2)jsp腳本: <% java代碼 %> 執行java代碼 原理:翻譯到_jspService()方法中緩存
3)jsp聲明: <%! 變量或方法 %> 聲明jsp的成員變量或成員方法tomcat
4)jsp註釋: <%!-- jsp註釋 --%> 用於註釋jsp代碼,不會翻譯到java文件中,也不會執行。服務器
3)jsp的三大指令session
3.1 include指令:用於包含其餘頁面。原理:先合併再翻譯,叫靜態包含app
3.2 page指令:告訴tomcat服務器如何把jsp文件翻譯成java文件
language: 翻譯的動態語言。
import: 類導入
jsp文件編碼問題:
pageEncoding: 告訴tomcat服務器使用什麼編碼翻譯jsp文件(jsp->java文件)
contentType: tomcat服務器發送給瀏覽器的數據編碼(tomcat服務器->瀏覽器)
異常錯誤相關的:
errorPage: 指定當前jsp頁面的錯誤處理頁面。
isErorrPage: 指定當前頁面是否爲錯誤處理頁面。false,不是錯誤處理頁面,則不能使用 exception內置對象;true,是錯誤處理頁面,可使用exception內置對象。
配置全局的錯誤處理頁面:
<!-- 全局錯誤處理頁面配置 --> <error-page> <error-code>500</error-code> <location>/common/500.jsp</location> </error-page> <error-page> <error-code>404</error-code> <location>/common/404.html</location> </error-page> |
session: 是否開啓session功能。false,不能用session內置對象;true,可使用session內 置對象。
buffer: jsp頁面的緩存區大小。
isELIgnore: 是否忽略EL表達式。
在jsp開發中,會頻繁使用到一些對象
。例如HttpSession,ServletContext,ServletContext,HttpServletRequet。若是咱們每次要使用這些對象都去建立這些對象就顯示很是麻煩。因此Sun公司設計Jsp時,在jsp頁面加載完畢以後就會自動幫開發者建立好這些對象,而開發者只須要直接使用這些對象調用方法便可!,這些建立好的對象就叫內置對象!!!!
舉例:
servlet:
HttpSession session = request.getSession(true); (須要開發者作)
jsp:
tomcat服務器: HttpSession session = request.getSession(true);(不須要開發者作)
開發者作的: session.getId();
內置對象名 類型
request HttpServletRequest
response HttpServletResponse
config ServletConfig
application ServletContext
session HttpSession
exception Throwable
page Object(this)
out JspWriter
pageContext PageContext
out對象類型,JspWriter類,至關於帶緩存的PrintWriter
PrintWriter:
wrier(內容): 直接向瀏覽器寫出內容。
JspWriter
writer(內容): 向jsp緩衝區寫出內容
當知足如下條件之一,緩衝區內容寫出:
1)緩衝區滿了
2)刷新緩存區
3)關閉緩存區
4)執行完畢jsp頁面
pageContext對象的類型是PageContext,叫jsp的上下文對象
public class 01_hello_jsp {
public void _jspService(request,response){
建立內置對象
HttpSession session =....;
ServletConfig config = ....;
把8個常常使用的內置對象封裝到PageContext對象中
PageContext pageContext = 封裝;
調用method1方法
method1(pageContext);
}
public void method1(PageContext pageContext){
但願使用內置對象
從PageContext對象中獲取其餘8個內置對象
JspWriter out =pageContext.getOut();
HttpServletRequest rquest = pageContext.getRequest();
........
}
}
使用場景: 在自定義標籤的時候,PageContext對象頻繁使用到!!!
ServletContext context域
HttpServletRequet request域
HttpSession session域 --Servlet學習的
PageContext page域 --jsp學習的
做用: 保存數據和獲取數據,用於共享數據
#保存數據
1)默認狀況下,保存到page域
pageContext.setAttribute("name");
2)能夠向四個域對象保存數據
pageContext.setAttribute("name",域範圍常量)
#獲取數據
1)默認狀況下,從page域獲取
pageContext.getAttribute("name")
2)能夠從四個域中獲取數據
pageContext.getAttribute("name",域範圍常量)
域範圍常量:
PageContext.PAGE_SCOPE
PageContext.REQUEST_SCOPE
PageContext..SESSION_SCOPE
PageContext.APPLICATION_SCOPE
3)自動在四個域中搜索數據
pageContext.findAttribute("name");
順序: page域 -> request域 -> session域- > context域(application域)
四個域對象:
pageContext page域
request request域
session session域
application context域
1)域對象做用:
保存數據 和 獲取數據 ,用於數據共享。
2)域對象方法:
setAttribute("name",Object) 保存數據
getAttribute("name") 獲取數據
removeAttribute("name") 清除數據
3)域對象做用範圍:
page域: 只能在當前jsp頁面中使用(當前頁面)
request域: 只能在同一個請求中使用(轉發)
session域: 只能在同一個會話(session對象)中使用(私有的)
context域: 只能在同一個web應用中使用。(全局的)
Servlet技術: 開發動態資源。是一個java類,最擅長寫java代碼
jsp技術: 開發動態資源。經過java代碼最擅長輸出html代碼。
各取所長:
在web項目中涉及到邏輯:
1)接收參數 servlet作
2)處理業務邏輯,返回結果 servlet作
3)顯示數據到瀏覽器 jsp作
4)跳轉到其餘頁面 servlet作
servlet+jsp模式
servlet:
1)接收參數
2)處理業務邏輯
3)把結果保存到域對象中
4)跳轉到jsp頁面
Jsp:
1)從域對象取出數據
2)把數據顯示到瀏覽器
servlet的數據 -> jsp頁面
List<Contact> 使用域對象 共享數據
jsp的核心語法: jsp表達式 <%=%>和 jsp腳本<% %>。
之後開發jsp的原則: 儘可能在jsp頁面中少寫甚至不寫java代碼。
使用EL表達式替換掉jsp表達式
EL表達式做用: 向瀏覽器輸出域對象中的變量值或表達式計算的結果!!!
語法: ${變量或表達式}
1)輸出基本數據類型變量
1.1 從四個域獲取
${name}
1.2 指定域獲取
${pageScope.name}
域範圍: pageScoep / requestScope / sessionScope / applicationScope
2)輸出對象的屬性值
Student
3)輸出集合對象
List 和 Map
4)EL表達式計算
jsp標籤做用:替換jsp腳本。
1)流程判斷(if for循環)
2)跳轉頁面(轉發,重定向)
3)。。。。。
1)內置標籤(動做標籤): 不須要在jsp頁面導入標籤
2)jstl標籤: 須要在jsp頁面中導入標籤
3)自定義標籤 : 開發者自行定義,須要在jsp頁面導入標籤
轉發標籤: <jsp:forward />
參數標籤: <jsp:pararm/>
包含標籤: <jsp:include/>
原理: 包含與被包含的頁面先各自翻譯成java源文件,而後再運行時合併在一塊兒。
(先翻譯再合併),動態包含
靜態包含 vs 動態包含的區別?
1) 語法不一樣
靜態包含語法: <%@inclue file="被包含的頁面"%>
動態包含語法: <jsp:include page="被包含的頁面">
2)參數傳遞不一樣
靜態包含不能向被包含頁面傳遞參數
動態包含能夠向被包含頁面傳遞參數
3)原理不一樣
靜態包含: 先合併再翻譯
動態包含: 先翻譯再合併
JSTL (全名:java standard tag libarary - java標準標籤庫 )
核心標籤庫 (c標籤庫) 每天用
國際化標籤(fmt標籤庫)
EL函數庫(fn函數庫)
xml標籤庫(x標籤庫)
sql標籤庫(sql標籤庫)
1) 導入jstl支持的jar包(標籤背後隱藏的java代碼)
注意:使用javaee5.0的項目自動導入jstl支持jar包
2)使用taglib指令導入標籤庫
<%@taglib uri="tld文件的uri名稱" prefix="簡寫" %>
3)在jsp中使用標籤
核心標籤庫的重點標籤:
保存數據:
<c:set></c:set>
獲取數據:
<c:out value=""></c:out>
單條件判斷
<c:if test=""></c:if>
多條件判斷
<c:choose></c:choose>
<c:when test=""></c:when>
<c:otherwise></c:otherwise>
循環數據
<c:forEach></c:forEach>
<c:forTokens items="" delims=""></c:forTokens>
重定向
<c:redirect></c:redirect>