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

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

主站蜘蛛池模板: 陵川县| 梁平县| 和政县| 庐江县| 兴安县| 白河县| 台湾省| 新密市| 湘阴县| 耒阳市| 广饶县| 台安县| 湖北省| 淅川县| 梧州市| 内江市| 平邑县| 金坛市| 太原市| 临夏县| 南阳市| 滨海县| 伊金霍洛旗| 益阳市| 尚义县| 定安县| 盐边县| 海淀区| 夏津县| 疏附县| 濮阳市| 安宁市| 稷山县| 孝昌县| 甘洛县| 观塘区| 金门县| 普定县| 武山县| 余江县| 秀山|