2018/1/3 JSP
1、Jsp的執行過程
問題: 訪問http://localhost:8080/day12/hello.jsp 如何顯示效果?
1)訪問到01.hello.jsp頁面,tomcat掃描到jsp文件,在%tomcat%/work把jsp文件翻譯成java源文件
(01.hello.jsp -> _01_hello_jsp.java) (翻譯)
2)tomcat服務器把java源文件編譯成class字節碼文件 (編譯)
(_01_hello_jsp.java -> _01_hello_jsp.class)
3)tomcat服務器構造_01_hello_jsp類對象
4)tomcat服務器調用_01_hello_jsp類裏面方法,返回內容顯示到瀏覽器。
第一次訪問jsp:
走(1)(2)(3)(4)
第n次訪問jsp:
走(4)
註意:
1)jsp文件修改了或jsp的臨時文件被刪除了,要重新走翻譯(1)和編譯(2)的過程
2、(1)Jsp語法:
1)jsp表達式:<%=變量或表達式%> 向瀏覽器輸出變量或表達式計算的結果
2)jsp腳本: <% java代碼 %> 執行java代碼 原理:翻譯到_jspService()方法中
3)jsp聲明: <%! 變量或方法 %> 聲明jsp的成員變量或成員方法
4)jsp註釋: <%!-- jsp註釋 --%> 用於註釋jsp代碼,不會翻譯到java文件中,也不會執行。
(2)jsp的三大指令
include指令:用於包含其他頁面。原理:先合並再翻譯,叫靜態包含
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表達式
3、9大內置對象
內置對象名 類型
request HttpServletRequest
response HttpServletResponse
config ServletConfig
application ServletContext
session HttpSession
exception Throwable
page Object(this)
out JspWriter
pageContext PageContext
4、(1)Jsp的4個域對象
request
session
application
pageContext
作用範圍:
pageContext : 處於當前jsp頁面中有效的!!
request: 處於同一個請求中有效的!!
session: 處於同一個會話中有效的!
application: 處於同一個web應用中有效的!
2)EL表達式
替代jsp表達式,用於向瀏覽器輸出域對象中的變量值和表達式計算的結果。
語法:
${變量}
3.1 輸出普通字符串: ${name}
3.2 輸出對象屬性: ${student.name} 註意: .name 相當於 .getName()方法
3.3 輸出List集合: ${list[0].name } 註意: [0] 相當於 get(下標)方法
3.4 輸出map集合: ${map[key].name} 註意: [key]相當於get(key)方法
3)jsp標簽 替代jsp腳本,用於在jsp頁面中執行java代碼
內置標簽:
<jsp:foward/> request.getRequesetDipsacher("/路徑").foward(request,response);
<jsp:param/> 參數標簽 ?name=eric
<jsp:include/> 包含其他頁面 ,動態包含
靜態包含: 先合並再翻譯。不能傳遞參數
動態包含: 先翻譯再合並。可以傳遞參數
jstl標簽庫 (java標準標簽庫)
使用步驟:
1)確保jstl支持的jar包存在於項目中
2)在jsp頁面中導入標簽庫
<%@taglib uri="標簽庫聲明文件tld文件的標記" prefix="前綴"%>
3)使用標簽庫中的標簽
核心標簽庫:
<c:set /> 保存數據到域對象中
<c:out/> 從域中取出數據
<c:if/> 單條件判斷
<c:choose/> + <c:when/> + <c:otherwise/> 多條件判斷
<c:forEach /> 遍歷數據
<c:forTokens/> 遍歷特殊字符串
<c:redirect/> 重定向
5、自定義標簽&編碼實戰
1)自定義標簽步驟:
編寫標簽處理器類,繼承SimpleTagSupport類,覆蓋doTag方法
在WEB-INF目錄下建立tld文件,在tld配置標簽
在jsp頁面導入標簽庫,使用taglib指令
在jsp頁面中使用標簽庫中的標簽
2)自定義標簽生命周期:
SimpleTag接口:
setJspContext(JspContext context) --傳入pagContext對象
setParent(JspTag tag) --傳入父標簽對象
setXXX(參數) --給屬性賦值
setJspBody(JspFrament jspBody) --傳入標簽體內容
doTag() --執行標簽
3)自定義標簽的作用:
控制是否輸出標簽體內容
輸出: this.getJspBody().invoke(null)
不輸出: 不調用invoke(null)方法
控制標簽余下內容是否輸出
輸出: 什麽不都做!
不輸出: 拋出SkipPageException異常
重復輸出標簽體內容
重復調用: this.getJspBody().invoke(null)
修改標簽體內容
StringWriter sw = new StringWriter();
this.getJspBody().invoke(sw);
String content = sw.toString();
//修改內容
//手動輸出到瀏覽器
this.getJspContext().getOut().writer(修改過的內容);
帶屬性的標簽
a)在標簽處理器類中聲明成員變量和setter方法,用於給屬性變量賦值。
b)在tld文件中聲明屬性
c) 使用屬性
4)JavaBean規範
必須要有無參的構造方法
所有成員屬性必須私有化 (private)
必須提供公開的getter和setter方法
5)MVC開發模式
MVC就是servlet+jsp+javabean的開發模式
M,Model,javabean實現,封裝業務數據
V,View,jsp實現,顯示數據
C,Controller,servlet實現,接收參數,調用業務邏輯,跳轉視圖
6)三層結構開發
dao層: 數據訪問對象。實現對數據的操作相關的方法
service層: 業務邏輯對象。實現對項目的業邏輯處理相關的方法
web層: 表現層。處理和用戶直接相關的,接收參數,處理參數,跳轉視圖,展示數據。
6、
2018/1/3 JSP