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

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

圖3-1 JSP與Servlet的區(qū)別
3.1.3 第一個(gè)JSP程序
下述代碼用于實(shí)現(xiàn)任務(wù)描述3.D.1,編寫(xiě)一個(gè)JSP頁(yè)面,顯示服務(wù)器的當(dāng)前系統(tǒng)時(shí)間。
【描述3.D.1】showTime.jsp
<%@ page language="java" contentType="text/html; charset=GBK"%> <html> <head> <title>第一個(gè)JSP頁(yè)面</title> </head> <body> <h1 align="center">歡迎!</h1> <% java.util.Date now = new java.util.Date(); out.println("當(dāng)前時(shí)間是:" + now); %> </body> </html>
上述代碼中,使用“<% %>”聲明了一段Java腳本,在代碼片段中新建了一個(gè)Date對(duì)象用來(lái)封裝系統(tǒng)當(dāng)前時(shí)間,然后使用out對(duì)象在頁(yè)面中輸出時(shí)間。
JSP文件開(kāi)頭通常使用“<%@ page %>”指令進(jìn)行頁(yè)面的設(shè)置,在該指令中,language屬性指定所用語(yǔ)言,contentType屬性指定頁(yè)面的MIME類(lèi)型和字符集。此外,Java腳本在“<% %>”之內(nèi)進(jìn)行聲明,用于完成特定的邏輯處理。
注意 關(guān)于page指令和out對(duì)象會(huì)在后續(xù)章節(jié)中詳細(xì)介紹。
啟動(dòng)Tomcat,在IE中訪問(wèn)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)行過(guò)程如下:
01 客戶(hù)端發(fā)出請(qǐng)求(request)。
02 容器接收到請(qǐng)求后檢索對(duì)應(yīng)的JSP頁(yè)面,如果該JSP頁(yè)面是第一次被請(qǐng)求,則容器將其翻譯成一個(gè)Java文件,即Servlet。
03 容器將翻譯后的Servlet源代碼編譯形成字節(jié)碼,即.class文件,并加載到內(nèi)存中執(zhí)行。
04 把執(zhí)行結(jié)果即響應(yīng)(response)發(fā)送回客戶(hù)端。
整個(gè)運(yùn)行過(guò)程如圖3-3所示。

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

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

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

圖3-6 number.jsp結(jié)果
3.2.5 JSP動(dòng)作標(biāo)簽
JSP中可以使用內(nèi)置的動(dòng)作標(biāo)簽實(shí)現(xiàn)一些常見(jiàn)的特定功能,其語(yǔ)法格式如下:
<jsp:動(dòng)作名> </jsp:動(dòng)作名>
例如:
<jsp:include page="welcome.jsp"> </jsp:include>
上述代碼使用include動(dòng)作將welcome.jsp頁(yè)面包含到當(dāng)前JSP頁(yè)面中。
注意 本書(shū)將在后續(xù)章節(jié)中詳細(xì)介紹JSP動(dòng)作標(biāo)簽。
3.2.6 JSP注釋
在JSP頁(yè)面中可以使用“<%-- --%>”的方式來(lái)注釋。服務(wù)器編譯JSP時(shí)會(huì)忽略“<%--”和“--%>”之間的內(nèi)容,所以生成的注釋在客戶(hù)端是看不到的。
JSP注釋的語(yǔ)法格式如下:
<%--注釋內(nèi)容--%>
例如:
<%--此處為隱藏注釋?zhuān)蛻?hù)端不可見(jiàn)--%>
除了上述JSP特有的注釋方式外,在JSP頁(yè)面中還可以使用HTML的注釋?zhuān)础埃?-- -->”的方式,以對(duì)HTML標(biāo)簽進(jìn)行注釋?zhuān)@種方式的注釋在客戶(hù)端可以查看到。此外,在JSP的聲明和腳本中,也可以使用Java語(yǔ)言的單行和多行注釋方式。
下述示例匯總了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è)置到表格中的奇偶行,使顏色交替顯示。
啟動(dòng)Tomcat,在IE中訪問(wèn)http://localhost:8080/ch03/color.jsp,運(yùn)行結(jié)果如圖3-7所示。

圖3-7 color.jsp
小結(jié)
通過(guò)本章的學(xué)習(xí),學(xué)生應(yīng)該能夠?qū)W會(huì):
■ JSP是一種在HTML中嵌入Java代碼的動(dòng)態(tài)網(wǎng)頁(yè)技術(shù)。
■ 與Servlet相比,JSP更偏重于將數(shù)據(jù)展示在HTML中,更適合制作動(dòng)態(tài)頁(yè)面。
■ JSP的執(zhí)行過(guò)程需要經(jīng)過(guò)翻譯、編譯、執(zhí)行三個(gè)步驟。
■ JSP頁(yè)面的構(gòu)成元素有指令、聲明、表達(dá)式、腳本、動(dòng)作標(biāo)簽和注釋。
■ JSP指令用來(lái)向JSP容器提供編譯信息。
■ JSP聲明用于在JSP中定義變量和方法。
■ JSP表達(dá)式用于將Java表達(dá)式的運(yùn)行結(jié)果輸出在頁(yè)面中。
■ JSP腳本用于在JSP頁(yè)面中插入Java代碼。
■ JSP提供了很多動(dòng)作標(biāo)簽實(shí)現(xiàn)特定的功能。
練習(xí)
1. 下列關(guān)于JSP執(zhí)行過(guò)程的說(shuō)法正確的是______。(多選)
A. JSP在容器啟動(dòng)時(shí)會(huì)被翻譯成Servlet,并編譯為字節(jié)碼文件
B. JSP在第一次被請(qǐng)求時(shí)會(huì)被翻譯成Servlet,并編譯為字節(jié)碼文件
C. 在第二次請(qǐng)求時(shí),將不再執(zhí)行翻譯步驟
D. 如果JSP頁(yè)面有錯(cuò)誤,將不執(zhí)行翻譯步驟
2. 下列不屬于JSP構(gòu)成元素的是______。
A. 腳本
B. 聲明
C. 表達(dá)式
D. JavaScript
3. 下列注釋方式可以在JSP中使用并且客戶(hù)端無(wú)法查看到的是______。
A. <!-- 注釋 -->
B. <% 注釋 %>
C. <%-- 注釋 --%>
D. <%! 注釋 %>
4. 下列JSP表達(dá)式的寫(xiě)法正確的是______。(多選)
A. <%="abcdefg".length()%>
B. <%="abcdefg" + 123%>
C. <%=new java.util.Date()%>
D. <%=this%>
5. 在JSP頁(yè)面中有下述代碼,第二次訪問(wèn)此頁(yè)面的輸出是______。
<%! int x = 0; %> <% int y = 0; %> <%=x++%>,<%=y++%>
A. 0,0
B. 0,1
C. 1,0
D. 1,1
6. 找出下述代碼中的錯(cuò)誤。
<%! int x; int method1() { return x++; } %> <% int x = method1(); int y; %> <%=method1();%>
7. 編寫(xiě)JSP頁(yè)面,輸出100以?xún)?nèi)的質(zhì)數(shù)。
- 嵌入式軟件系統(tǒng)測(cè)試:基于形式化方法的自動(dòng)化測(cè)試解決方案
- 移動(dòng)UI設(shè)計(jì)(微課版)
- 人臉識(shí)別原理及算法:動(dòng)態(tài)人臉識(shí)別系統(tǒng)研究
- Java面向?qū)ο蟪绦蜷_(kāi)發(fā)及實(shí)戰(zhàn)
- Lua程序設(shè)計(jì)(第4版)
- AutoCAD VBA參數(shù)化繪圖程序開(kāi)發(fā)與實(shí)戰(zhàn)編碼
- 用Python實(shí)現(xiàn)深度學(xué)習(xí)框架
- Learning Hunk
- 青少年學(xué)Python(第1冊(cè))
- 數(shù)據(jù)結(jié)構(gòu)案例教程(C/C++版)
- SQL基礎(chǔ)教程(第2版)
- 軟件測(cè)試綜合技術(shù)
- Spring 5 Design Patterns
- Python Programming for Arduino
- Hacking Android