一文把Servlet整的明明白白!2??
五、JSP
5.1、JSP的作用
JSP——Java Server Page運(yùn)行在服務(wù)器端的 Java 頁面,以前學(xué)習(xí)的 HTML 運(yùn)行在瀏覽器端。JSP 是運(yùn)行在服務(wù)器上,最終還是解析成靜態(tài)的HTML,運(yùn)行在瀏覽器。我們在瀏覽器上看到的HTML頁面,其實(shí)是 JSP 在服務(wù)器上運(yùn)行的結(jié)果。
JSP 的主要作用是代替 Servlet 程序回傳 html 頁面的數(shù)據(jù)。因?yàn)?Servlet 程序回傳 html 頁面數(shù)據(jù)是一件非常繁鎖的事情。開發(fā)成本和維護(hù)成本都極高。
5.2、JSP的優(yōu)勢
5.3、JSP的原理
**JSP頁面本質(zhì)上是一個(gè) Servlet 程序。**當(dāng)我們第一次訪問 jsp 頁面的時(shí)候。Tomcat 服務(wù)器會幫我們把 jsp 頁面翻譯成為一個(gè) java 源文件。并且對它進(jìn)行編譯成為.class 字節(jié)碼程序。我們打開 java 源文件不難發(fā)現(xiàn)其里面的內(nèi)容是:
我們跟蹤原代碼發(fā)現(xiàn),HttpJspBase 類。它直接地繼承了 HttpServlet 類。也就是說。jsp 翻譯出來的 java 類,它間接了繼承了 HttpServlet 類。也就是說,翻譯出來的是一個(gè) Servlet 程序。
翻譯出來的 Servlet 程序的源代碼,不難發(fā)現(xiàn)。其底層實(shí)現(xiàn),也是通過輸出流。把 html 頁面數(shù)據(jù)回傳
給客戶端。
out.write("\r\n"); out.write("\r\n"); out.write("\r\n"); out.write("
\r\n"); out.write("5.4、JSP運(yùn)行過程
JspServlet 首先會將 jsp 文件代碼翻譯成 Servlet 的 Java 代碼,然后再編譯成字節(jié)碼文件執(zhí)行,其底層就是一個(gè) Servlet。
瀏覽器請求 JSP 頁面,Tomcat 中的 JspServlet 會先 JSP 文件翻譯成 Servlet 文件:xxx_jsp.java。
將 xxx_jsp.java 文件編譯產(chǎn)生字節(jié)碼文件:xxx_jsp.class。
加載字節(jié)碼文件 xxx_jsp.class 并創(chuàng)建 xxx_jsp 對象。
調(diào)用 xxx_jsp 的 service 方法處理請求并響應(yīng)數(shù)據(jù)。
瀏覽器第一次訪問 JSP 的時(shí)候,由 Tomcat 將 JSP 翻譯成了 Servlet,并且編譯成字節(jié)碼文件,只生成1次。如果這期間修改了JSP內(nèi)容,就會重新翻譯。
六、轉(zhuǎn)發(fā)和重定向
6.1、轉(zhuǎn)發(fā)和重定向的作用
用于 web 組件的跳轉(zhuǎn),從A 組件跳到另一個(gè)組件B。
6.2、轉(zhuǎn)發(fā)
6.2.1、跳轉(zhuǎn)位置
請求轉(zhuǎn)發(fā)是指,服務(wù)器收到請求后,從一次資源跳轉(zhuǎn)到另一個(gè)資源的操作叫請求轉(zhuǎn)發(fā)。在服務(wù)器端進(jìn)行的組件(資源)的跳轉(zhuǎn)。
6.2.2、轉(zhuǎn)發(fā)的方法
request.getRequestDispatcher("/要跳轉(zhuǎn)到的地址").forward(request, response);
6.3、重定向
6.3.1、跳轉(zhuǎn)的位置
在瀏覽器端進(jìn)行的頁面(組件/資源)跳轉(zhuǎn)。
6.3.2、重定向的方法
response.sendRedirect("要跳轉(zhuǎn)的地址")
6.4、轉(zhuǎn)發(fā)和重定向的區(qū)別
6.5、注意
無論是重定向還是轉(zhuǎn)發(fā),后續(xù)代碼都會執(zhí)行,但一般轉(zhuǎn)發(fā)或重定向后面不會有代碼,沒有執(zhí)行的意義了,因?yàn)椴还苁寝D(zhuǎn)發(fā)還是重定向?yàn)g覽器最終顯示的都是跳轉(zhuǎn)后頁面的數(shù)據(jù)。
如果需要保留請求域中的數(shù)據(jù),必須使用轉(zhuǎn)發(fā)。
如果需要跳轉(zhuǎn)到WEB-INF目錄中的資源,必須使用轉(zhuǎn)發(fā)。
如果需要跨域,必須使用重定向。
七、三大作用域
7.1、什么是作用域
用于 Servlet 之間數(shù)據(jù)共享的服務(wù)器內(nèi)存區(qū)域,作用域結(jié)構(gòu)是一個(gè)Map
7.2、作用域類型
7.3、作用域方法
7.4、如何選擇作用域
先考慮作用范圍小的作用域,如果小作用范圍的作用域能滿足需求就使用小作用范圍的作用域。
八、EL表達(dá)式
8.1、什么是EL表達(dá)式
EL 表達(dá)式的全稱是:Expression Language。是表達(dá)式語言。
EL 表達(dá)式主要是代替 jsp 頁面中的表達(dá)式腳本在 jsp 頁面中進(jìn)行數(shù)據(jù)的輸出。因?yàn)?EL 表達(dá)式在輸出數(shù)據(jù)的時(shí)候,要比 jsp 的表達(dá)式腳本要簡潔很多。
8.2、EL表達(dá)式運(yùn)算
8.2.1、算數(shù)運(yùn)算
8.2.2、邏輯運(yùn)算
8.2.3、關(guān)系運(yùn)算
8.2.4、三元運(yùn)算
表達(dá)式 1?表達(dá)式 2:表達(dá)式 3
如果表達(dá)式 1 的值為真,返回表達(dá)式 2 的值,如果表達(dá)式 1 的值為假,返回表達(dá)式 3 的值。
8.2.5、判空運(yùn)算
判空:判斷的是內(nèi)容是否為空,不是對象是否為空。
8.3、EL 從四個(gè)作用域中取值
EL 獲取數(shù)據(jù)的方式是從 4 個(gè)作用域?qū)ο笾校瑥男〉酱蟮娜カ@取,如果需要指定作用域獲取數(shù)據(jù),可使用以下 EL 的內(nèi)置對象來指定。
8.3.1、PageContext 對象
JSP 本質(zhì)是 Servlet,但比 Servlet 多了一個(gè)作用域:頁面域,在 JSP 中有四大作用域。頁面域是只在一個(gè)JSP頁面中起作用,不同的JSP之間不能實(shí)現(xiàn)數(shù)據(jù)的共享,比請求域范圍還要小。
<% //向頁面域中添加一個(gè)字符串 pageContext.setAttribute("name","我是頁面域"); %>
8.3.2、 EL 指定域獲取數(shù)據(jù)
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
從請求域獲取:${requestScope.name}
從會話域獲取:${sessionScope.name}
從上下文域獲取:${applicationScope.name}
自動查找作用域獲取:${name}
九、JSTL 標(biāo)簽庫
JSTL 標(biāo)簽庫 全稱是指 JSP Standard Tag Library JSP 標(biāo)準(zhǔn)標(biāo)簽庫。是一個(gè)不斷完善的開放源代碼的 JSP 標(biāo)簽庫。EL 表達(dá)式主要是為了替換 jsp 中的表達(dá)式腳本,而標(biāo)簽庫則是為了替換代碼腳本。這樣使得整個(gè) jsp 頁面變得更佳簡潔。JSTL 由五個(gè)不同功能的標(biāo)簽庫組成。
9.1、使用步驟
9.1.1、導(dǎo)入jar包
taglibs-standard-impl-1.2.1.jar taglibs-standard-spec-1.2.1.jar
9.1.2、引入標(biāo)簽庫
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
9.1.3、使用標(biāo)簽
9.2、核心標(biāo)簽庫常用標(biāo)簽
9.2.1、
用于頁面上單條件判斷。
<%-- ii.如果a等于b
如果a不等于b
9.2.2、
用于多分支判斷(多條件判斷),類似于跟 switch … case … default 。
9.2.3、
用于遍歷集合或數(shù)組(最為常用)。
varStatus屬性表:
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
序號 | 學(xué)號 | 姓名 | 性別 | 成績 |
---|---|---|---|---|
${status.count} | ${stu.id} | ${stu.name} | ${stu.gender? "男":"女"} | ${stu.score} |
9.3、格式化標(biāo)簽庫常用標(biāo)簽
9.3.1、
用于對日期進(jìn)行格式化。
Java JSP Servlet
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。