摘要:下面我們再打開對應的文件,我們會看到如下部分內容靜態測試調用我是文件,我被文件調用了我們發現,在該包含文件被引入處那條語句被執行了。
在上一節中我們學習了如何搭建一個簡單的Web應用,并且已經知曉了一個JSP頁面主要由靜態的HTML內容和動態的Java腳本共同組成。JSP的基本語法共有JSP注釋、JSP聲明、輸出JSP表達式與JSP程序片段四種,用來控制動態向頁面輸出內容的。現在我們就一起來學習JSP的這幾種基本語法。
(一)JSP的基本語法 1.JSP注釋語句JSP注釋用于標注在程序開發過程中的開發提示,不會輸出到客戶端。
JSP注釋的格式如下:
<%--我是JSP注釋的內容--%>
其實我們可以發現JSP的注釋與HTML的注釋十分類似,下面是HTML的注釋格式:
下面我們通過一個例子來體會一下這二者在JSP頁面中的區別:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>注釋實例 下面的是JSP注釋:
<%--我是JSP注釋--%>
下面的是HTML注釋:
在瀏覽器中瀏覽該頁面,并且右擊查看網頁源代碼,我們會看到JSP注釋消失了,如下圖所示:
這表明JSP注釋只在服務器端有效,但是并不會作為HTML代碼的一部分發送到客戶端。
2.JSP腳本語句 (1)JSP聲明JSP聲明用于聲明Servlet類的成員變量和方法
JSP的聲明格式如下:
<%! 聲明內容 %>
下面來看一個使用JSP聲明的示例頁面:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>JSP聲明 <%! public int count; public String sayHello(){ return "hello"; } %> <% //這行代碼的意思是向屏幕輸出count的值后再加1 out.println(count++); %>
<% //這行代碼的意思是輸出sayHello方法的返回值 out.println(sayHello()); %>
當我們在瀏覽器中查看時,可以看到count的值與字符hello的輸出。
對于JSP聲明有下列三點需要注意:
可以一次性聲明多個變量和方法,前提是符合Java語法。
一個聲明僅在一個頁面中有效
聲明的變量為全局變量,所有執行此JSP頁面的用戶會共享此變量。
在JSP聲明中聲明方法似乎不需要任何類作為載體而獨立存在,事實上并不是這樣。根據我們學過的知識我們知道JSP實質 就是Servlet,JSP會被轉化為一個Servlet實例。而我們在JSP頁面中聲明的內容會被轉換為對應Servlet實例的成員變量和成員方法。
下面我們打開F:TomcatworkCatalinalocalhostmyThreeProjectorgapachejsp下的.java文件,我們會看到如下的java代碼:
* generation to assist with modification tracking. */ package org.apache.jsp; import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.jsp.*; public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase implements org.apache.jasper.runtime.JspSourceDependent, org.apache.jasper.runtime.JspSourceImports { public int count; public String sayHello(){ return "hello"; } ... }
以上就是由JSP頁面轉換成的的Servlet類,我們可以看到count變量與sayHello方法是這個類的成員。
由于JSP聲明的變量與方法會轉換為對應Servlet實例的成員變量與成員方法,所以我們可以對JSP聲明部分定義的變量和方法使用private和public等訪問控制符,也可以使用static,但是不能使用abstract修飾聲明部分的方法,因為抽象方法將導致JSP對應的Servlet變成抽象類,從而導致無法實例化。
(2)輸出JSP表達式JSP提供了如下方式的輸出表達式語法:
<%=JSP表達式%>
值得注意的是JSP表達式后面不能有分號。
下面來看一個實例:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>輸出JSP表達式 <%! public int count; public String sayHello(){ return "hello"; } %> <%=count++%>
<%=sayHello()%>
可以看到這個頁面與前一個頁面的區別僅僅是把out.println輸出語句替換成了"=",這兩個頁面的執行效果是一致的。其實,JSP/Servlet引擎在解釋執行JSP頁面時會把"="替換成Servlet實例類中的out輸出語句。
(3)JSP程序片段JSP腳本中可以包含任何可執行性代碼
JSP程序片段簡稱Scriptlet,就是腳本小部件的意思。我們可以通過Scriptlet把代碼嵌入到靜態HTML頁面中去,JSP的核心代碼也都是寫在這里面的。同樣,它的內容也是包裹在"<%%>"中,如下所示:
<% 代碼 %>
下面我們來看一個例子:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>JSP腳本 <% String name = "Jom"; if (name.equals("Jom")){ %> He is Jom. <% } else { %> He is not Jom. <% } %>
輸出結果為:
He is Jom.
下面我們打開此項目生成的.java文件
public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response) throws java.io.IOException, javax.servlet.ServletException { ... try { ... out.write(" "); out.write(" "); out.write(" "); out.write(" "); out.write("JSP腳本 "); out.write(" "); String name = "Jom"; if (name.equals("Jom")){ out.write(" "); out.write(" He is Jom. "); out.write(" "); } else { out.write(" "); out.write(" He is not Jom. "); out.write(" "); } out.write(" "); out.write(" "); out.write(""); } ... }"); out.write(" "); out.write(" "); out.write("
我們可以看出,JSP腳本與靜態的HTML內容已經全部被轉換為_jspService方法的可執行代碼。由此我們可以得出兩個結論:
我們可以在JSP腳本中聲明變量,只是聲明的只是局部變量。
JSP腳本中不能定義方法,因為按照java語法,方法中不能定義方法。
(二)JSP編譯指令JSP編譯指令用于提供整個JSP網頁的相關信息、設定JSP網頁的相關屬性,例如網頁的編碼方式、語法等。JSP編譯指令語法如下:
<%@ 指令名 屬性1="屬性值1" 屬性2="屬性值2" ... %>
編譯指令都有默認值,所以我們無需為每個指令設置值。常見的編譯指令有page、include、taglib三個,下面主要介紹page、include兩個指令,關于taglib指令在后續章節中會詳細學習。
1.page指令page指令定義了JSP文件的全局屬性,可以指定所使用的的腳本語言、JSP對應的Servlet所實現的接口等。
page指令的語法格式如下:
<%@ page 屬性1="屬性值1" 屬性2="屬性值2" ... %>
page指令常用的屬性見下圖(圖片來源于網絡):
值得注意的是,contentType的charset屬性和pageEncoding屬性都涉及JSP網頁的編碼方式,但是兩者有所區別。contentType的charset屬性是指服務器發送給客戶端時的內容編碼方式,pageEncoding是JSP文件本身的編碼方式。另外,errorPage屬性實質是JSP的異常處理機制,JSP腳本不要求強制處理異常,包括checked異常。
使用page指令需要注意一下幾點:
page指令作用于整個頁面,包括靜態的包含文件,不包括動態的包含文件。
page指令在一個頁面中可以出現多次,除了import屬性外,其他屬性只能出現一次。
為了JSP程序的可讀性,我們一般將page指令置于頂部
2.include指令使用include指令可以將外部文件包含進當前JSP頁面,這個外部文件可以是JSP文件、HTML文件或者文本文件。
include指令的語法格式如下:
<%@ include 屬性1="屬性值1" 屬性2="屬性值2" ... %>
這種包含是靜態包含,即將被包含文件插入到JSP指定的位置,解析這個頁面,同時把目標文件的其他編譯指令也包含進來。
下面來看一個使用靜態導入的示例:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>靜態include測試 <%@include file="text.jsp" %>
在這個JSP頁面里包含了當前路徑下的text.jsp文件,該文件里只有一條JSP輸出語句:
<% out.println("我是text.jsp文件,我被index.jsp文件調用了!"); %>
下面我們啟動這個項目,在瀏覽器中我們會看到如下的輸出:
我們發現text.jsp文件里的內容在index.jsp文件里被成功執行了。下面我們再打開對應的.java文件,我們會看到如下部分內容:
out.write(" "); out.write(" "); out.write(" "); out.write("靜態include測試itle> "); out.write(" "); out.write(" "); out.write(" "); out.write(" "); out.write(" "); out.write(" "); out.write(" "); out.write("JSP-include調用 "); out.write(" "); out.write(" "); out.write(" "); out.write(" "); out.write(" "); out.println("我是text.jsp文件,我被index.jsp文件調用了!"); out.write(" "); out.write(" "); out.write(""); out.write(" "); out.write(" "); out.write("");
我們發現,在該包含文件被引入處那條語句被執行了。所以,我們得出結論:include指令將包含的頁面與本頁面融合成一個了頁面。
鑒于此,如果多數JSP網頁包含相同的內容,我們可以將這些相同的內容多帶帶放在一個文件中,其他JSP頁面通過include指令將這個文件包含。這樣做不僅可以提高開發效率還有利于網站的維護。
下面以下圖總結本次學習內容(圖片來源于網絡):
以上就是本次學習內容,下次我們將學習JSP的動作指令。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/66818.html
摘要:當后繼請求相同的頁面時,容器加載之前生成的類,并且通知去執行已經存在的字節碼,從而省去了轉換的過程,這也是第一次執行頁面時間較長的原因。 以往學習的時候大多是看完書或者看完視頻,動手實踐一下就OK了。然而過了一段時間我發現東西都忘差不多了,需要復習才能重新掌握。現在開始學習JavaWeb了,我將在這里記錄自己的學習的一點一滴,不僅便于自己以后回顧知識點,也希望能對JavaWeb初學者有...
摘要:系列文章請查看超詳細的面試題總結一之基礎知識篇超詳細的面試題總結二之基礎知識篇超詳細的面試題總結三之集合篇常見問題下面的都是自己之前在學習的時候總結的,對于鞏固的基礎知識應該有很大幫助。注意多線程的并發的讀寫類屬性會導致數據不同步。 系列文章請查看: 超詳細的Java面試題總結(一)之Java基礎知識篇 超詳細的Java面試題總結(二)之Java基礎知識篇 超詳細的Java面試題總結(...
摘要:出現的目的同一樣也是要提到頁面中的腳本代碼。標準標準標簽庫有個子庫,但隨著發展,目前常使用的是他的核心庫標簽庫標簽庫的前綴下載與導入下載從的網站下載的包。 一、JSP技術1.jsp腳本和注釋jsp腳本:1) ----- 內部的java代碼翻譯到service方法的內部2) ----- 會被翻譯成service方法內部out.print()3) ---- 會被翻譯成servlet的成員的...
閱讀 3948·2021-09-22 10:02
閱讀 3372·2019-08-30 15:52
閱讀 3067·2019-08-30 12:51
閱讀 763·2019-08-30 11:08
閱讀 2070·2019-08-29 15:18
閱讀 3110·2019-08-29 12:13
閱讀 3601·2019-08-29 11:29
閱讀 1877·2019-08-29 11:13