- Java Web程序設(shè)計(jì)
- 張磊 丁香乾編著
- 171字
- 2018-12-29 18:50:51
第3章 JSP基礎(chǔ)
本章目標(biāo)
■ 了解JSP的概念及特點(diǎn)
■ 理解JSP和Servlet的區(qū)別與聯(lián)系
■ 理解JSP的執(zhí)行過程及原理
■ 掌握J(rèn)SP頁面的常用元素
■ 熟練使用JSP聲明
■ 熟練使用JSP表達(dá)式
■ 熟練使用JSP腳本
學(xué)習(xí)導(dǎo)航

任務(wù)描述
【描述3.D.1】
編寫一個JSP頁面,顯示服務(wù)器的當(dāng)前系統(tǒng)時間。
【描述3.D.2】
編寫一個JSP頁面,定義兩個整型變量并賦值,然后輸出最大值。
【描述3.D.3】
編寫一個JSP頁面,輸出10個整數(shù)及其總和。
3.1 JSP概述
JSP(Java Server Page)是由Sun公司倡導(dǎo)、多家公司參與編寫的一種動態(tài)網(wǎng)頁技術(shù)標(biāo)準(zhǔn)。JSP是Servlet的擴(kuò)展,與Servlet一樣,JSP是一種基于Java的服務(wù)器端技術(shù),其目的是簡化建立和管理動態(tài)網(wǎng)站的工作。在傳統(tǒng)的HTML文件(*.html,*.htm)中插入Java程序片段(Scriptlet)和JSP標(biāo)簽,就構(gòu)成了JSP頁面,其中,JSP頁面文件以“.jsp”作為擴(kuò)展名。
3.1.1 JSP特點(diǎn)
JSP主要有如下幾個特點(diǎn)。
■ 簡單快捷
JSP在原來的HTML結(jié)構(gòu)中,通過添加Java程序片段,并通過標(biāo)簽技術(shù)的使用從而簡化了頁面開發(fā)。相對于Java,JSP要簡單得多,所以即使是不熟悉Java語言的開發(fā)人員也能夠快速掌握J(rèn)SP的使用。通過開發(fā)或擴(kuò)展JSP標(biāo)簽庫,Web頁面開發(fā)人員能夠使用熟悉的工具和類似于HTML標(biāo)簽的組件來完成工作。
■ 動態(tài)內(nèi)容的生成和顯示相分離
使用JSP技術(shù),Web頁面開發(fā)人員可以使用HTML或者XML來設(shè)計(jì)頁面,使用JSP的標(biāo)簽或者小腳本來生成頁面上的動態(tài)內(nèi)容。所有的Java腳本都在服務(wù)器端運(yùn)行,客戶端得到的是JSP的最終運(yùn)行結(jié)果,這就保證了任何基于HTML的Web瀏覽器都可以正確顯示JSP頁面。
■ 組件重用
絕大多數(shù)JSP頁面依賴可重用的JavaBean組件來執(zhí)行復(fù)雜的業(yè)務(wù)處理,這些組件能夠在多個JSP之間共享,由此加速了總體開發(fā)過程,方便維護(hù)和優(yōu)化。
■ 易于部署、升級和維護(hù)
JSP容器能夠?qū)SP的修改進(jìn)行檢測,自動翻譯和編譯修改后的JSP文件,無須手動編譯。同時,作為B/S架構(gòu)的應(yīng)用技術(shù),JSP項(xiàng)目更加易于部署、升級和維護(hù)。
3.1.2 JSP與Servlet的比較
JSP是一種服務(wù)器端腳本語言,它降低了Servlet的使用難度。JSP在本質(zhì)上就是Servlet,JSP提供了Servlet能夠?qū)崿F(xiàn)的所有功能,實(shí)際上JSP是首先被翻譯成Servlet后才編譯并運(yùn)行的,所以JSP幾乎擁有Servlet的所有優(yōu)點(diǎn)。與Servlet相比,JSP更加適合制作動態(tài)頁面,因?yàn)閱渭兪褂肧ervlet開發(fā)動態(tài)頁面是相當(dāng)煩瑣的,需要在Java代碼中使用大量的“out.println()”語句來輸出字符串形式的HTML代碼,這種方法難調(diào)試、易出錯;而JSP通過標(biāo)簽庫等機(jī)制能很好地與HTML結(jié)合,即使不了解Servlet的開發(fā)人員同樣可以使用JSP開發(fā)動態(tài)頁面。對于不熟悉Java語言的開發(fā)人員,會覺得JSP開發(fā)更加方便快捷。可以這樣理解,Servlet是在Java中嵌入了HTML,而JSP是在HTML中嵌入了Java,圖3-1從結(jié)構(gòu)上對JSP和Servlet進(jìn)行了區(qū)別。

圖3-1 JSP與Servlet的區(qū)別
3.1.3 第一個JSP程序
下述代碼用于實(shí)現(xiàn)任務(wù)描述3.D.1,編寫一個JSP頁面,顯示服務(wù)器的當(dāng)前系統(tǒng)時間。
【描述3.D.1】showTime.jsp
<%@ page language="java" contentType="text/html; charset=GBK"%> <html> <head> <title>第一個JSP頁面</title> </head> <body> <h1 align="center">歡迎!</h1> <% java.util.Date now = new java.util.Date(); out.println("當(dāng)前時間是:" + now); %> </body> </html>
上述代碼中,使用“<% %>”聲明了一段Java腳本,在代碼片段中新建了一個Date對象用來封裝系統(tǒng)當(dāng)前時間,然后使用out對象在頁面中輸出時間。
JSP文件開頭通常使用“<%@ page %>”指令進(jìn)行頁面的設(shè)置,在該指令中,language屬性指定所用語言,contentType屬性指定頁面的MIME類型和字符集。此外,Java腳本在“<% %>”之內(nèi)進(jìn)行聲明,用于完成特定的邏輯處理。
注意 關(guān)于page指令和out對象會在后續(xù)章節(jié)中詳細(xì)介紹。
啟動Tomcat,在IE中訪問http://localhost:8080/ch03/showTime.jsp,顯示結(jié)果如圖3-2所示。

圖3-2 showTime.jsp顯示結(jié)果
3.1.4 JSP執(zhí)行原理
同Servlet一樣,JSP運(yùn)行在Servlet/JSP容器(如Tomcat)中,其運(yùn)行過程如下:
01 客戶端發(fā)出請求(request)。
02 容器接收到請求后檢索對應(yīng)的JSP頁面,如果該JSP頁面是第一次被請求,則容器將其翻譯成一個Java文件,即Servlet。
03 容器將翻譯后的Servlet源代碼編譯形成字節(jié)碼,即.class文件,并加載到內(nèi)存中執(zhí)行。
04 把執(zhí)行結(jié)果即響應(yīng)(response)發(fā)送回客戶端。
整個運(yùn)行過程如圖3-3所示。

圖3-3 JSP第一次被請求時的執(zhí)行過程
當(dāng)這個JSP頁面再次被請求時,只要該JSP文件沒有發(fā)生過改動,JSP容器就直接調(diào)用已裝載的字節(jié)碼文件,而不會再執(zhí)行翻譯和編譯步驟,這樣大大提高了服務(wù)器性能。再次請求JSP時的運(yùn)行過程如圖3-4所示。
注意 JSP文件修改后,容器能夠檢測到并自動重新進(jìn)行翻譯和編譯,當(dāng)然這需要一些運(yùn)行上的開銷,通常容器會提供相應(yīng)的選項(xiàng)來開啟和關(guān)閉此項(xiàng)功能。

圖3-4 再次請求JSP
3.2 JSP基本結(jié)構(gòu)
JSP文件由6類基本元素組成:
■ JSP指令
■ JSP聲明
■ JSP表達(dá)式
■ JSP腳本
■ JSP動作
■ JSP注釋
3.2.1 JSP指令
JSP指令用來向JSP容器提供編譯信息。指令并不向客戶端產(chǎn)生任何輸出,所有的指令都只在當(dāng)前頁面中有效。
JSP指令的語法格式如下:
<%@ 指令名 屬性="值" 屬性="值"%>
常用的三種指令為:
■ page指令
■ include指令
■ taglib指令
下面語句展示了page指令的簡單用法:
<%@ page language="java" contentType="text/html; charset=gbk"%>
其中:
■ language屬性用來設(shè)置JSP頁面中的腳本語言,目前此屬性值只能是“java”。
■ contentType屬性用來設(shè)置頁面類型及編碼,“text/html; charset=gbk”指明了JSP頁面文本是HTML格式并且采用GBK中文字符集。
注意 本書將在后續(xù)章節(jié)中詳細(xì)介紹這三種指令。
3.2.2 JSP聲明
JSP聲明用于在JSP頁面中定義變量和方法。JSP聲明通過“<%! %>”定義。一個JSP頁面可以有多個聲明,并且每個聲明中可以同時定義多個變量或方法,其中,每個JSP聲明只在當(dāng)前JSP頁面中有效。
JSP聲明的語法格式如下:
<%! 聲明的內(nèi)容 %>
例如:
<%! // 全局方法和變量 private String str = "全局變量"; void setStrParam(String param) { str = param; } %>
上述代碼聲明了一個變量和一個方法,類似于在類中聲明屬性和方法。
注意 JSP會被翻譯成Servlet,而JSP聲明中的變量和方法實(shí)際上就是定義在翻譯成的Servlet中的,所以本質(zhì)上就是類的屬性和方法。
3.2.3 JSP表達(dá)式
JSP表達(dá)式用于將Java表達(dá)式的運(yùn)行結(jié)果輸出在頁面中。JSP表達(dá)式通過“<%= %>”定義。在JSP表達(dá)式中可以包含任何一個有效的Java表達(dá)式。當(dāng)請求JSP頁面時,表達(dá)式會被運(yùn)行并將結(jié)果轉(zhuǎn)化成字符串插入到該表達(dá)式所在的位置上。
JSP表達(dá)式的語法格式如下:
<%=表達(dá)式%>
示例:
<%=1+1%>
注意 表達(dá)式后不能加分號,%和=之間不能有空格。
下述代碼用于實(shí)現(xiàn)任務(wù)描述3.D.2,使用JSP聲明和表達(dá)式來顯示兩個數(shù)中的最大值。
【描述3.D.2】max.jsp
<%@ page language="java" contentType="text/html; charset=GBK"%> <%! private int a = 34; private int b = 40; public int max(int num1, int num2) { return num1 > num2 ? num1 : num2; } %> <html> <head> <title>最大數(shù)</title> </head> <body> <%=a%>和<%=b%>中最大的數(shù)是<%=max(a, b)%> </body> </html>
上述代碼中,使用JSP聲明定義了兩個變量a、b,并定義了求最大值的方法max(),最后使用JSP表達(dá)式分別輸出了a、b的值和max()運(yùn)算的結(jié)果。
啟動Tomcat,在IE中訪問http://localhost:8080/ch03/max.jsp,運(yùn)行結(jié)果如圖3-5所示。

圖3-5 max.jsp結(jié)果
3.2.4 JSP腳本
JSP腳本用于在JSP頁面中插入Java代碼,JSP腳本通過“<%”和“%>”定義,其中可以包含任何符合Java語法的代碼。JSP腳本在服務(wù)器端執(zhí)行,當(dāng)JSP頁面被請求時,頁面上的JSP腳本會從上到下依次執(zhí)行。
JSP腳本的語法格式如下:
<% Java代碼 %>
例如:
<% java.util.Date now = new java.util.Date(); out.println("當(dāng)前時間是:" + now); %>
下述代碼用于實(shí)現(xiàn)任務(wù)描述3.D.3,使用JSP腳本循環(huán)輸出10個整數(shù)及其總和。
【描述3.D.3】 number.jsp
<%@ page language="java" contentType="text/html; charset=GBK"%> <html> <head> <title>十個數(shù)</title> </head> <body> <% int sum = 0; for (int i = 1; i <= 10; i++) { sum += i; out.println(i + " "); } out.println("<br>這十個數(shù)的和為:" + sum); %> </body> </html>
上述代碼中,使用for循環(huán)求1到10的和,并在HTML頁面中打印輸出結(jié)果。
啟動Tomcat,在IE中訪問http://localhost:8080/ch03/number.jsp,運(yùn)行結(jié)果如圖3-6所示。

圖3-6 number.jsp結(jié)果
3.2.5 JSP動作標(biāo)簽
JSP中可以使用內(nèi)置的動作標(biāo)簽實(shí)現(xiàn)一些常見的特定功能,其語法格式如下:
<jsp:動作名> </jsp:動作名>
例如:
<jsp:include page="welcome.jsp"> </jsp:include>
上述代碼使用include動作將welcome.jsp頁面包含到當(dāng)前JSP頁面中。
注意 本書將在后續(xù)章節(jié)中詳細(xì)介紹JSP動作標(biāo)簽。
3.2.6 JSP注釋
在JSP頁面中可以使用“<%-- --%>”的方式來注釋。服務(wù)器編譯JSP時會忽略“<%--”和“--%>”之間的內(nèi)容,所以生成的注釋在客戶端是看不到的。
JSP注釋的語法格式如下:
<%--注釋內(nèi)容--%>
例如:
<%--此處為隱藏注釋,客戶端不可見--%>
除了上述JSP特有的注釋方式外,在JSP頁面中還可以使用HTML的注釋,即“<!-- -->”的方式,以對HTML標(biāo)簽進(jìn)行注釋,這種方式的注釋在客戶端可以查看到。此外,在JSP的聲明和腳本中,也可以使用Java語言的單行和多行注釋方式。
下述示例匯總了JSP指令、聲明、腳本、表達(dá)式以及注釋的使用方法。
【代碼3-1】 color.jsp
<%@ page language="java" contentType="text/html; charset=GBK"%> <html> <head> <title>顏色</title> </head> <body> <%--聲明兩種顏色全局變量--%> <%! private String color1 = "EBEBEB"; private String color2 = "F8F8F8"; %> <!-- Table表格 --> <table border="1" align="center"> <% for (int i = 11; i < 16; i++) { String color = ""; if (i % 2 == 0) { color = color1; } else { color = color2; } %> <tr bgcolor="<%=color%> "> <td>姓名<%=i%></td> <td><%=i%></td> </tr> <% } %> </table> </body> </html>
此JSP中先聲明兩種顏色,分別設(shè)置到表格中的奇偶行,使顏色交替顯示。
啟動Tomcat,在IE中訪問http://localhost:8080/ch03/color.jsp,運(yùn)行結(jié)果如圖3-7所示。

圖3-7 color.jsp
小結(jié)
通過本章的學(xué)習(xí),學(xué)生應(yīng)該能夠?qū)W會:
■ JSP是一種在HTML中嵌入Java代碼的動態(tài)網(wǎng)頁技術(shù)。
■ 與Servlet相比,JSP更偏重于將數(shù)據(jù)展示在HTML中,更適合制作動態(tài)頁面。
■ JSP的執(zhí)行過程需要經(jīng)過翻譯、編譯、執(zhí)行三個步驟。
■ JSP頁面的構(gòu)成元素有指令、聲明、表達(dá)式、腳本、動作標(biāo)簽和注釋。
■ JSP指令用來向JSP容器提供編譯信息。
■ JSP聲明用于在JSP中定義變量和方法。
■ JSP表達(dá)式用于將Java表達(dá)式的運(yùn)行結(jié)果輸出在頁面中。
■ JSP腳本用于在JSP頁面中插入Java代碼。
■ JSP提供了很多動作標(biāo)簽實(shí)現(xiàn)特定的功能。
練習(xí)
1. 下列關(guān)于JSP執(zhí)行過程的說法正確的是______。(多選)
A. JSP在容器啟動時會被翻譯成Servlet,并編譯為字節(jié)碼文件
B. JSP在第一次被請求時會被翻譯成Servlet,并編譯為字節(jié)碼文件
C. 在第二次請求時,將不再執(zhí)行翻譯步驟
D. 如果JSP頁面有錯誤,將不執(zhí)行翻譯步驟
2. 下列不屬于JSP構(gòu)成元素的是______。
A. 腳本
B. 聲明
C. 表達(dá)式
D. JavaScript
3. 下列注釋方式可以在JSP中使用并且客戶端無法查看到的是______。
A. <!-- 注釋 -->
B. <% 注釋 %>
C. <%-- 注釋 --%>
D. <%! 注釋 %>
4. 下列JSP表達(dá)式的寫法正確的是______。(多選)
A. <%="abcdefg".length()%>
B. <%="abcdefg" + 123%>
C. <%=new java.util.Date()%>
D. <%=this%>
5. 在JSP頁面中有下述代碼,第二次訪問此頁面的輸出是______。
<%! int x = 0; %> <% int y = 0; %> <%=x++%>,<%=y++%>
A. 0,0
B. 0,1
C. 1,0
D. 1,1
6. 找出下述代碼中的錯誤。
<%! int x; int method1() { return x++; } %> <% int x = method1(); int y; %> <%=method1();%>
7. 編寫JSP頁面,輸出100以內(nèi)的質(zhì)數(shù)。
- 區(qū)塊鏈架構(gòu)與實(shí)現(xiàn):Cosmos詳解
- Hands-On RESTful Web Services with Go
- Unity&VR游戲美術(shù)設(shè)計(jì)實(shí)戰(zhàn)
- Hands-On Kubernetes on Windows
- 微信小程序開發(fā)實(shí)戰(zhàn):設(shè)計(jì)·運(yùn)營·變現(xiàn)(圖解案例版)
- Oracle實(shí)用教程
- Advanced Python Programming
- 深入理解Kafka:核心設(shè)計(jì)與實(shí)踐原理
- Manage Your SAP Projects with SAP Activate
- Backbone.js Patterns and Best Practices
- Learning Zimbra Server Essentials
- C語言進(jìn)階:重點(diǎn)、難點(diǎn)與疑點(diǎn)解析
- Visual Basic.NET程序設(shè)計(jì)
- Python AI游戲編程入門:基于Pygame和PyTorch
- HTML+CSS+JavaScript前端開發(fā)(慕課版)