原作者為 RioTian@cnblogs, 本作品采用 CC 4.0 BY 進行許可,轉載請注明出處。
本篇學習自:C語言中文網,部分內容轉載僅供學習使用。
JSP 動作利用 XML 語法格式的標記來控制服務器的行為,完成各種通用的 JSP 頁面功能,也可以實現一些處理復雜業務邏輯的專用功能。如利用 JSP 動作可以動態地插入文件、重用 JavaBean
組件、把用戶重定向到另外的頁面、為 Java 插件生成 HTML 代碼。
JSP 動作與 JSP 指令的不同之處是,JSP 頁面被執行時首先進入翻譯階段,程序會先查找頁面中的 JSP 指令標識;並將它們轉換成 Servlet
,所以,這些指令標識會首先被執行,從而設置了整個 JSP 頁面,所以,JSP 指令是在頁面轉換時期被編譯執行的,且編譯一次;而 JSP 動作是在客戶端請求時按照在頁面中出現的順序被執行的,它們只有被執行的時候才會去實現自己所具有的功能,且基本上是客戶每請求一次,動作標識就會執行一次。
JSP 動作的通用格式如下:
<jsp:動作名 屬性1="屬性值1"...屬性n="屬性值n" />
或者
<jsp:動作名; 屬性1="屬性值1"...屬性n="屬性值n">相關內容</jsp:動作名>
JSP 中常用的動作包括 <jsp:include>、<jsp:param>、<jsp:forward>、<jsp:plugin>、<jsp:useBean>、<jsp:setProperty>、<jsp:getProperty>。在后文中,將依次介紹這幾個動作。
JSP include動作
include
動作用於把另外一個文件的輸出內容插入當前 JSP 頁面的輸出內容中,這種在 JSP 頁面執行時引入的方式稱為動態引入,這樣,主頁面程序與被包含文件是彼此獨立的,互不影響。被包含的文件可以是一個動態文件(JSP 文件),也可以是一個靜態文件(如文本文件)。
其語法格式如下:
<jsp:include page="ralativeURL | <%=expressicry%>" />
說明:page 屬性指定了被包含文件的路徑,其值可以是一個代表相對路徑的表達式。當路徑以“/”開頭時,將在當前應用程序的根目錄下查找文件;如果是以文件名或文件夾名開頭,將在當前頁面的目錄下查找文件。書寫此動作標記時,“jsp
”和“:”以及“include
”三者之間不要有空格,否則會出錯。
include
動作對包含的動態文件和靜態文件的處理方式是不同的。
- 如果包含的是一個靜態文件,被包含文件的內容將直接嵌入 JSP 文件中存放 <jsp:include> 動作的位置,而且當靜態文件改變時,必須將 JSP 文件重新保存(重新轉譯),然后才能訪問變化了的文件。
- 如果包含的是一個動態文件,則由 Web 服務器負責執行,把執行后的結果傳回包含它的 JSP 頁面中,若動態文件被修改,則重新運行 JSP 文件時就會同步發生變化。
【例 1】在 JSP 文件中使用 <jsp:include> 動作包含靜態文件。
- 創建靜態文件 Hello.txt,輸入以下代碼:注意編碼格式使用(ANSI 或 UTF-8)防止亂碼
<font color="blue" size="3">
<br>這是靜態文件 Hello.txt 的內容
</font>
- 創建主頁面文件 index.jsp,具體代碼如下:
<%@ page contentType="text/html;iso-8859-1" pageEncoding="utf-8" %>
<!DOCTYPE html>
<html>
<body>
使用 <jsp:include> 動作標記將靜態文件包含到JSP文件中!
</hr>
<jsp:include page="Hello.txt"/>
</body>
</html>
- 運行 index.jsp,運行結果如圖 1 所示。
要注意,<jsp:indude> 動作與前面講解的 include 指令作用類似,現將它們之間的差異總結如下。
-
屬性不同
include 指令通過 file 屬性來指定被包含的頁面,該屬性不支持任何表達式。如果在 file 屬性值中應用了 JSP 表達式,會拋出異常。例如下面的代碼:
<% String fpath="fir.jsp";%>
<%@ include file="<%=fpath%>" %>
該用法將會拋出如下異常:
File "/<%=fpath%>" not fount
<jsp:include> 動作是通過 page 屬性來指定被包含頁面的,該屬性支持 JSP 表達式。
-
處理方式不同
使用 include 指令包含文件時,被包含文件的內容會原封不動地插入到包含頁中使用該指令的位置,然后 JSP 編譯器再對這個合成的文件進行翻譯,所以最終編譯后的文件只有一個。
而使用 <jsp:include> 動作包含文件時,只有當該標記被執行時,程序才會將請求轉發到(注意是轉發,而不是請求重定向)被包含的頁面,再將其執行結果輸出到瀏覽器中,然后重新返回到包含頁來繼續執行后面的代碼。因為服務器執行的是兩個文件,所以 JSP 編器將對這兩個文件分別進行編譯。
-
包含方式不同
include 指令的包含過程為靜態包含,因為在使用 include 指令包含文件時,服務器最終執行的是將兩個文件合成后由 JSP 編譯器編譯成的一個 Class 文件,所以被包含文件的內容應是固定不變的,若改變了被包含的文件,則主文件的代碼就發生了改變,因此服務器會重新編譯主文件。
<jsp:include> 動作的包含過程為動態包含,通常用來包含那些經常需要改動的文件。
-
對被包含文件的約定不同
使用 include 指令包含文件時,因為 JSP 編譯器是對主文件和被包含文件進行合成后再翻譯,所以對被包含文件有約定。例如,被包含的文件中不能使用 <html></html>、<body></body> 標記;被包含文件要避免變量和方法在命名上與主文件沖突的問題。
提示:
如果在 JSP 頁面中需要顯示大量的文本文字,可以將文字寫入靜態文件中(如記事本),然后通過 include
指令或動作標記包含進來,以提高代碼的可讀性。
JSP param動作
當使用 <jsp:include> 動作標記引入的是一個能動態執行的程序時,如 Servlet 或 JSP 頁面,可以通過使用 <jsp:param> 動作標記向這個程序傳遞參數信息。
其語法格式如下:
<jsp:include page="relativeURL | <%=expression%>" />
<jsp:param name="pName1" value="pValue1 | <%=expreesion1%>“ />
<jsp:param name="pName2" value="pValue2 | <%=expreesion2%>” />
...
</jsp:include>
說明:<jsp:param> 動作的 name 屬性用於指定參數名,value 屬性用於指定參數值。在 <jsp:include> 動作標記中,可以使用多個 <jsp:param> 傳遞參數。另外,<jsp:forward> 和 <jsp:plugin> 動作標記中都可以利用 <jsp:param> 傳遞參數。
【例1】使用 <jsp:param> 動作標記向被包含文件傳遞參數。
- 創建主頁面 index.jsp,用 <jsp:include> 包含用於對三個數進行排序的頁面 order.jsp,並且使用 <jsp:param> 向其傳遞 3 個參數。具體代碼如下:
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
<title> JSP - param 動作標記實例 </title>
</head>
<body>
使用<jsp:include>包含用於對三個數進行排序的頁面order.jsp,<br>
並利用<jsp:param>把等排序的三個數8,3,5傳給order,jsp后,<br>
並得結果如下:
<hr/>
<jsp:include page="order.jsp">
<jsp:param name="num1" value="8"/>
<jsp:param name="num2" value="3"/>
<jsp:param name="num3" value="5"/>
</jsp:include>
</body>
</html>
- 創建用於對三個數進行排序的頁面 order.jsp,具體代碼如下:
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
<title>JSP - Hello World</title>
</head>
<body>
<%
String str1=request.getParameter("num1");
int m1 = Integer.parseInt(str1);
String str2=request.getParameter("num2");
int m2 = Integer.parseInt(str2);
String str3=request.getParameter("num3");
int m3 = Integer.parseInt(str3);
int tmp;
if(m1 > m2) {
tmp = m1;
m1 = m2;
m2 = tmp;
}
if(m2 > m3){
tmp = m2;
m2 = m3;
m3 = tmp;
}
if(m1 > m3){
tmp = m1;
m1 = m3;
m3 = tmp;
}
%>
<font color="blue" size="4">
這三個數從小到大的順序為:<%=m1%>、<%=m2%>、<%=m3%>
</font>
</body>
</html>
- 運行 index.jsp,運行結果如圖所示。
JSP forward動作
在大多數的網絡應用程序中,都有這樣的情況:在用戶成功登錄后轉向歡迎頁面,此處的“轉向”,就是跳轉。<jsp:forward> 動作標記就可以實現頁面的跳轉,用來將請求轉到另外一個 JSP、HTML 或相關的資源文件中。
當 <jsp:forward> 動作標記被執行后,當前的頁面將不再被執行,而是去執行該標記指定的目標頁面,但是,用戶此時在地址欄中看到的仍然是當前網頁的地址,而內容卻已經是轉向的目標頁面了。(超鏈接的概念)
其語法格式如下:
<jsp:forward page="relativeURL" | "<%=expression %>" />
如果轉向的目標是一個動態文件,還可以向該文件傳遞參數,使用格式如下:
<jsp:forward page="relativeURL" | "<%=expression %>" />
<jsp:param name="pName1" value="pValue1 | <%=expression1 %>" />
<jsp:param name="pName2" value="pValue2 | <%=expression2 %>" />
說明如下:
- page 屬性用於指定要跳轉到的目標文件的相對路徑,也可以通過執行一個表達式來獲得。如果該值以“/”開頭,表示在當前應用的根目錄下查找目標文件,否則,就在當前路徑下查找目標文件。請求被轉向到的目標文件必須是內部的資源,即當前應用中的資源。如果想通過 forward 動作轉發到外部的文件中,將出現資源不存在的錯誤信息。
- forward 動作執行后,當前頁面將不再被執行,而是去執行指定的目標頁面。
- 轉向到的文件可以是 HTML 文件、JSP 文件、程序段,或者其他能夠處理 request 對象的文件。
- forward 動作實現的是請求的轉發操作,而不是請求重定向。它們之間的一個區別就是:進行請求轉發時,存儲在 request 對象中的信息會被保留並被帶到目標頁面中;而請求重定向是重新生成一個 request 請求,然后將該請求重定向到指定的 URL,所以,事先儲存在 request 對象中的信息都不存在了。
【例1】使用 <jsp:forward> 動作標記實現網頁跳轉。
- 創建主頁面 index.jsp,通過表單輸入用戶名和密碼,單擊“登錄”按鈕,利用 <jsp:forward> 動作標記跳轉到頁面 target.jsp。具體代碼如下:
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
<title>JSP - Hello World</title>
</head>
<body>
<form action=" " method="post" name="Form"> <!--提交給本頁處理-->
用戶名: <input name="UserName" type="text" /> <br/>
密 碼: <input name="UserPwd" type="password" /> <br/>
<input type="submit" value="登錄" />
</form>
<%
//當單擊“登錄”按鈕時,調用Form1.submit()方法提交表單至本文件,
//用戶名和密碼均不為空時,跳轉到targe.jsp,並且把用戶名和密碼以參數形式傳遞
String s1 = null,s2 = null;
s1 = request.getParameter("UserName");
s2 = request.getParameter("UserPwd");
if(s1 != null && s2 != null){
%>
<jsp:forward page="target.jsp">
<jsp:param name="Name" value="<%=s1%>" />
<jsp:param name="Pwd" value="<%=s2%>" />
</jsp:forward>
<%
}
%>
</body>
</html>
- 創建所轉向的目標文件 target.jsp,具體代碼如下:
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
<title>JSP - Hello World</title>
</head>
<body>
<%
String strName =request.getParameter("UserName"),strPwd=request.getParameter("UserPwd");
out.println(strName + "您好,您的密碼是: " + strPwd);
%>
</body>
</html>
- 運行即可,在輸入用戶名和密碼之后會自動跳轉顯示結果
JSP plugin動作
<jsp:plugin> 動作可以在頁面中插入 Java Applet 小程序或 JavaBean,它們能夠在客戶端運行,但此時,需要在 IE 瀏覽器中安裝 Java 插件。當 JSP 文件被編譯並送往瀏覽器時,<jsp:plugin> 動作將會根據瀏覽器的版本,替換成 <object> 或者 <embed> 頁面 HTML 兀素。
注意,<object> 用於 HTML 4.0,<embed> 用於 HTML 3.2。
通常,<jsp:plugin> 元素會指定對象是 Applet 還是 Bean,同樣也會指定 class 的名字以及位置。另外,還會指定將從哪里下載 Java 插件。該動作的語法格式如下:
<jsp:plugin
type="bean|applet" code="ClassFi1eName"
codebase="classFileDirectoryName"
[name="instanceName"]
[archive="URIToArchive,..."]
[align="bottom|top|middle|left|right"]
[height="displayPixels"]
[width="displayPixels"]
[hspace="leftRightPixels"]
[vspace="topBottomPixels"]
[jreversion="JREVersionNumber|1.1"]
[nspluginurl="URLToPlugin"]
[iepluginurl="URLToPlugin"] >
[<jsp:params>
<jsp:param name="parameterName"
value="{parameterValue|<%=expression %>" />
</jsp:params>]
[<jsp:fallback>text message for user</jsp:fallback>]
</jsp:plugin>
參數說明如下:
- type 屬性的作用是定義插入對象的類型,對象類型有兩個值,分別是 bean 或者 applet。(必須定義的屬性)
- code 屬性定義插入對象的類名,該類必須保存在 codebase 屬性指定的目錄內。(必須定義的屬性)
- codebase 屬性定義對象的保存目錄。(必須定義的屬性)
- name 屬性定義 bean 或 Applet 的名字。
- archive 屬性定義 Applet 運行時需要的類包文件。
- align 屬性定義 Applet 的顯示方式。
- height 屬性定義 Applet 的高度。
- width 屬性定義 Applet 的長度。
- hspace 屬性定義 Applet 的水平空間。
- vspace 屬性定義 Applet 的垂直空間。
- jreversion 屬性定義 Applet 運行時所需要的 JRE 版本,缺省值是 1.1。
- nspluginurl 屬性定義 Netscape Navigator 用戶在沒有定義 JRE 運行環境時下載 JRE 的地址。
- iepluginurl 屬性定義 IE 用戶在沒有定義 JRE 運行環境時下載 JRE 的地址。
- jsp:params 標識的作用是定義 Applet 的傳入參數。
- jsp:fallback 標識的作用是當對象不能正確顯示時傳給用戶的信息。
【例1】使用 <jsp:plugin> 動作標記在 JSP 中加載 Java Applet 小程序。
- 創建 index.jsp 頁面,使用 <jsp:plugin> 動作標記加載:
<%@ page contentType="text/html; charset=utf-8" %>
<html>
<body>
加載MyApplet.class文件的結果如下: <hr/>
<jsp:plugin type="applet" code="MyApplet.class" codebase="."
jreversion="1.2" width="400" heigh="80">
<jsp:fallback>
加載Java Applet小程序失敗!
</jsp:fallback>
</jsp:plugin>
</body>
</html>
- 其中插件所執行的類 MyApplet.class 的源文件為 MyApplet.java,代碼如下:
import java.applet.*;
import java.awt.*;
public class MyApplet extends Applet
{
public void paint(Graphics g)
{
g.setColor(Color.red);
g.drawString("您好!我就是 Applet 小程序!",5,10);
g.setColor(Color.green);
g.drawString("我是通過應用<jsp:plugin>動作標記",5,30);
g.setColor(Color.blue);
g.drawString("將 Applet 小程序嵌入到 JSP 文件中",5,50);
}
}
將 index.jsp 及 MyApplet.java 文件經過 Java 編譯器編譯成功后,生成的 MyApplet.class 字節文件都存放在同目錄下。
重新啟動 Tomcat 后,在瀏覽器的地址欄中輸入 http://localhost:8080/demo_war_exploded/index.jsp,按 Enter 鍵后,若客戶機上沒有安裝 JYM(Java 虛擬機),將會訪問 Sun 公司的網站,並且彈出下載 Java plugin 的界面。
下載完畢后,將會出現 Java plugin 插件的安裝界面,可以按照向導提示,逐步完成安裝過程。然后,就可以使用 JVM 而不是 IE 瀏覽器自帶的 JVM 來加載執行 MyApplet.class 字節碼文件了,最終得到的運行結果如圖所示。
關於 JSP useBean、setProperty 和 getProperty 動作等之后學完 JavaBean 再來補充