JSP頁面的基本結構
在傳統的html頁面檔案中加入Java程式片和JSP標記就構成了一個JSP頁面,一個JSP頁面可由5種元素構成:
- 普通的HTML標記和JavaScript標記
- JSP標記,如指令標記、動作標記
- 變數和方法的宣告
- Java程式片
- Java運算式
執行程序
當Tomcat服務器上的一個JSP頁面被第一次請求執行時,Tomcat服務器首先將JSP頁面檔案轉譯成一個Java檔案,再將這個Java檔案編譯生成位元組碼檔案,然后通過執行位元組碼檔案回應用戶的請求,
位元組碼檔案的任務:
- 將JSP頁面中的HTML標記和JavaScript標記交給用戶端瀏覽器執行顯示
- JSP標記、方法的定義、Java程式片由服務器處理和執行,將需要顯示的結果發給用戶端瀏覽器
宣告變數和定義方法
在<%!和%>標記符號之間宣告變數和定義方法,
書寫位置
<%!和%>標記符號習慣上放在JSP頁面指令之后,<HTML>之前,也就是放在JSP頁面的前面,但是<%!和%>標記符號在整個JSP頁面都有效,與書寫位置無關,因此也可以寫在<HTML>和</HTML>之間,
特性
<%!和%>標記符號之間宣告的變數作為類的成員變數被每個用戶執行緒共享,因此任何一個用戶對JSP頁面成員變數的操作都會影響其他用戶,
Java程式片
可以在<%和%>之間插入Java程式片,一個JSP頁面可以有多個Java程式片,這些程式片將被Tomcat按順序執行,程式片中定義的變數為JSP頁面的區域變數,
書寫位置
可以寫在<HTML>之前,也可以寫在<HTML>之間,也可以寫在<HTML>之后,
特性
- 操作成員變數:任何一個執行緒對JSP頁面成員變數操作的結果,都會影響其他執行緒
- 操作區域變數:Java程式片運行在不同的執行緒中,區域變數互不影響,程式片執行完畢即釋放區域變數
synchronized修飾:當一個執行緒在執行Java程式片期間呼叫synchronized方法時,其他執行緒在呼叫這個synchronized方法就必須等待,(比如當操作成員變數的時候不希望其他用戶同時操作成員變數,例如計數器)- Java程式片可以分割成幾個程式片,然后再這些程式片之間插入其他標記元素
eg.
...
<%
int number = 7 + (int)(Math.random()*13);
if(number <= 13){
%>
<center><h2>顯示小學生圖片</h2>
<% }
else{
%>
<center><h2>顯示中學生圖片</h2>
<% }
%>
...
Java運算式
可以在<%=和%>之間插入一個可求值的運算式
注意:不可插入陳述句
運算式的值由服務器負責計算,并將計算結果用字串的形式發送到客戶端顯示,
書寫位置
可以寫在<HTML>之前,也可以寫在<HTML>之間,也可以寫在<HTML>之后,
使用舉例
<%= x>y %>
<%= Math.sqrt(x-y) %>
JSP中的注釋
注釋可以增強JSP頁面的可讀性,使之更易于維護,
JSP頁面中的注釋分為兩種:
HTML注釋
在<!--和-->中加入注釋內容
<!-- 注釋內容 -->
JSP注釋
在標記符號<%--和%>之間加入注釋內容
<%-- 注釋內容 --%>
Tomcat服務器會在編譯時忽略JSP注釋,
另注
如果你想要在java代碼片中添加注釋,那么需要按照java注釋來寫
JSP指令標記
page指令標記
page屬性用來定義整個JSP頁面的一些屬性和這些屬性的值,屬性值用單引號或雙引號括起來,可以使用多個page指令分別為每個屬性指定值:
<%@ page 屬性1 = "屬性1的值" %>
<%@ page 屬性2 = "屬性2的值" %>
<%@ page 屬性n = "屬性n的值" %>
也可以用一個page屬性指定多個屬性的值:
<%@ page 屬性1 = "屬性1的值" 屬性2 = "屬性2的值"
eg.
<% @ page contentType="text/html" pageEncoding = "utf-8" %>
書寫位置
對整個JSP界面都有效,與書寫位置無關,但習慣上寫在最前面,
contentType屬性
Tomcat服務器要通知用戶的瀏覽器用怎樣的方式來處理接收到的資訊,這就要求JSP頁面必須設定回應的MIME型別,即設定contentType的值,
如果我們希望用戶的瀏覽器啟動HTML決議器來決議執行所接收到的資訊,那么可以按照如下方式(如果不指定,也是此默認值):
<% @ page contentType = "text/html" %>
如果希望用戶的瀏覽器啟動本地的MS-Word應用程式來決議執行所接收到的資訊,那么可以按照如下方式:
<% @ page contentType = "application/msword" %>
但是注意,JSP不允許兩次使用page指令給contentType屬性指定不同的屬性值,例如以下做法是錯誤的:
<% @ page contentType = "text/html" %>
<% @ page contentType = "application/msword" %>
用page指令為contentType指定一個值的同時,也可以為contentType的附加屬性charset制定一個值(默認是iso-8859-1),例如:
<% @ page contentType = "text/html;charset=gb2312" %>
charset的值是通知用戶瀏覽器用怎樣的編碼決議收到的字符,
當JSP頁面用page指定了JSP的頁面本身的編碼,例如:
<% @ page pageEncoding="UTF-8" %>
此時,charset編碼與JSP頁面編碼保持一致,為utf-8,因此一般不需要再指定charset的值,使其和JSP頁面編碼保持一致即可,
pageEncoding屬性
pageEncoding屬性的默認值是UTF-8,
需要注意的是,與contentType的附加屬性charset的值意義不同,pageEncoding屬性值是定義JSP頁面使用的編碼,是告訴Tomcat服務的決議器用怎樣的編碼決議JSP頁面中的字符,
保存JSP頁面應當將編碼選擇為UTF-8,因為Tomcat服務器是根據UTF=8編碼來決議JSP頁面中的字符資料的,
JSP頁面使用page指令只能為pageEncoding指定一個值不允許兩處使用page指令給pageEncoding指定相同或不同的值,
language屬性
language屬性定義JSP頁面使用的腳本語言,該屬性的值目前只能取java,
<% @ page language = "java" %>
如果不寫,那么JSP也有默認上述指令,
import屬性
該屬性的作用是為JSP引入java運行環境所提供的包中的類,
可以為該屬性指定多個值,該屬性的值可以是某包中的所有類或者一個具體的類,
<% @ page import = "java.io.*","java.time.LocalDate" %>
JSP頁面默認import屬性已經有如下的值:
"java.lang.*"
"javax.servlet.*"
"javax.servlet.jsp.*"
"javax.servlet.http.*"
session屬性
session屬性設定是否需要使用內置的session物件,屬性值可以是true或者false,默認值是true,
buffer屬性
buffer屬性用來指定out設定的緩沖區大小或者不使用緩沖區,
<% @ page buffer = "24kb" %>
autoFlush屬性
autoFlush屬性指定out的緩沖區被填滿時,緩沖區是否自動重繪,屬性值可以是true或者false,默認值是true,
當buffer的值是none時,autoFlush的值就不能設定成false,
isThreadSafe屬性
isThereadSafe屬性用來設定訪問JSP頁面是否是執行緒安全的,屬性值可以是true或者false,默認值是true,
當值為true時,JSP頁面可以同時回應多個用戶的請求,當值為false時,JSP頁面同一時刻只能回應一個用戶的請求,其他用戶須排隊等待,
info屬性
info屬性是一個字串,其目的是為JSP頁面準備一個常用但可能要經常修改的字串,如:
<% page info = "we are students" %>
可以在JSP頁面中使用方法:
getServletInfo()
include指令標記
如果需要在JSP頁面內某處整體嵌入一個檔案,就可以考慮使用include指令標記:
<% @ include file = "檔案的Url" %>
include指令標記的作用是在JSP頁面出現該指令的位置處,靜態嵌入一個檔案,
- 該檔案的編碼必須與當前JSP頁面一致,
- 該檔案必須是可以訪問或者可以使用的,
靜態嵌入是指當前JSP頁面與嵌入的檔案合并成一個新的JSP頁面,然后Tomcat服務器再將這個新的JSP頁面轉譯成Java檔案,因此,嵌入檔案后,必須保證新合并成的JSP頁面符合JSP語法規則,即能夠成為一個新的JSP頁面檔案,
eg.被嵌入檔案是一個JSP檔案,該JSP頁面使用了page指令為contentType設定了值:
<% @ page contentType = "application/msword" %>
那么,合并后的JSP就兩次使用page指令為contentType屬性設定了不同的屬性值,導致語法錯誤,
注意:允許被嵌入檔案使用page指令指定contentType屬性的值,但指定的值必須與被嵌入頁面JSP中指定的值相同
JSP動作標記
動作標記是一種特殊的標記,它影響JSP運行時的功能,
include動作標記
語法格式
<jsp:include page="檔案的URL"/>
或
<jsp:include page="檔案的URL">
param子標記
</jsp:include>
需要注意的是,當include動作標記不需要param子標記時,必須使用第一種形式,
include動作標記告訴JSP頁面動態包含一個檔案,即JSP頁面運行時才將檔案加入,
include指令標記:靜態包含,先合并再編譯,
include動作標記:動態包含,生成Java檔案時不合并,當JSP運行(Java檔案的位元組碼檔案被加載執行)時才被包含進來,如果包含的是文本檔案就直接發到用戶端,如果是JSP檔案就先由Tomcat執行再將結果發到用戶端,
對比
| 處理時間 | 執行速度 | 靈活性 | |
|---|---|---|---|
| include指令標記 | 編譯階段處理 | 快 | 被處理的檔案邏輯和語法依賴當前JSP頁面 |
| include動作標記 | JSP頁面運行時處理 | 慢 | 被處理的檔案邏輯和語法獨立于當前JSP頁面,可以使用param子標記 |
param動作標記
param標記以名字-值對的形式為其他標記提供附加資訊,不能獨立使用,必須作為jsp:include、jsp:forward標記的子標記來使用,
語法格式
<jsp:param name="引數" value="https://www.cnblogs.com/Syhang/archive/2022/11/18/引數的值" />
當標記與jsp:include動作標記一起使用時,可以將param標記中的引數的值傳到include動作標記要加載的檔案中去,被加載的JSP檔案可以用Tomcat服務器所提供的的request內置物件獲取引數的值,
eg.
<!-- exam1.jsp -->
<jsp:include page = "exam2.jsp">
<jsp:param name="msg" value="https://www.cnblogs.com/Syhang/archive/2022/11/18/Hello,world!"/>
</jsp:include>
<% -- exam2.jsp -- %>
request.getParameter("msg");
forward動作標記
語法格式
<jsp:forward page = "要轉向的頁面" />
或
<jsp:forward page = "要轉向的頁面">
param子標記
</jsp:forward>
該指令的作用是,從該指令處停止當前頁面的執行,而轉向執行page屬性指定的JSP頁面,
注意:當沒有param子標記時必須采用第一種形式
forward標記可以使用param動作標記作為子標記向轉向的頁面傳送資訊,接收方法同include也是利用request.getParameter()獲取,
需要注意的是,當前頁面使用forward動作標記轉向后,盡管看到的效果是轉向后的頁面效果,但是瀏覽器地址欄顯示的依然是轉向前的JSP頁面的URL地址,因此,如果重繪瀏覽器的顯示,將再次執行當前瀏覽器地址欄中顯示的JSP頁面,
比如,當前頁面是生成一個0-1亂數,如果亂數的值為1那么則轉向a.jsp,否則轉向b.jsp,那么你在重繪這個頁面的時候,地址欄顯示都是此頁面的url,但是顯示效果可能有時是a.jsp頁面,有時是b.jsp頁面,
useBean
useBean標記用來創建并使用一個JavaBean,是非常重要的一個動作標記,
Sun公司倡導JavaBean負責存盤資料,JSP頁面顯示JavaBean中的資料,servlet負責管理JavaBean中的資料,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/536092.html
標籤:其他
