官术网_书友最值得收藏!

第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ù)。

主站蜘蛛池模板: 砚山县| 临猗县| 巴彦县| 呼玛县| 商丘市| 衡阳市| 万载县| 沙田区| 高州市| 仁寿县| 江西省| 紫阳县| 乐平市| 三江| 义马市| 横峰县| 伊金霍洛旗| 龙门县| 健康| 凤山市| 洛扎县| 临夏市| 剑河县| 双流县| 大同县| 文化| 环江| 怀安县| 安达市| 安福县| 许昌市| 新野县| 新田县| 通道| 左权县| 六盘水市| 灵丘县| 宜城市| 松江区| 林州市| 轮台县|