1. 程式人生 > 其它 >Java Web中JSP中6種動作概況知識點總結——每日一語法學習

Java Web中JSP中6種動作概況知識點總結——每日一語法學習

JSP動作利用XML語法格式的標記來控制Servlet引擎的行為。利用JSP動作可以動態地插入檔案、重用JavaBean元件、把使用者重定向到另外的頁面、為Java外掛生成HTML程式碼。

JSP動作包括:

jsp:include

在頁面被請求的時候引入一個檔案。

jsp:useBean

尋找或者例項化一個JavaBean。

jsp:setProperty

設定JavaBean的屬性。

jsp:getProperty

輸出某個JavaBean的屬性。

jsp:forward

把請求轉到一個新的頁面。

jsp:plugin

根據瀏覽器型別為Java外掛生成OBJECT或EMBED標記。

網路配圖

1、jsp:include動作

該動作把指定檔案插入正在生成的頁面。其語法如下:

<jsp:include page="relative URL" flush="true" />

include指令,它是在JSP檔案被轉換成Servlet的時候引入檔案,而這裡的jsp:include動作不同,插入檔案的時間是在頁面被請求的時候。jsp:include動作的檔案引入時間決定了它的效率要稍微差一點,而且被引用檔案不能包含某些JSP程式碼(例如不能設定HTTP頭),但它的靈活性卻要好得多。

例如,下面的JSP頁面把4則新聞摘要插入一個“What's New ?”頁面。改變新聞摘要時只需改變這四個檔案,而主JSP頁面卻可以不作修改:

WhatsNew.jsp

<html><head><title>What's New</title></head><body bgcolor="#FDF5E6" text="#000000" link="#0000EE" vlink="#551A8B" alink="#FF0000"><center><table border=5 bgcolor="#EF8429"><tr><th class="title">What's New at JspNews.com</table></center><P>Here is a summary of our four most recent news stories:<OL><li><jsp:include page="news/Item1.html" flush="true"/><li><jsp:include page="news/Item2.html" flush="true"/><li><jsp:include page="news/Item3.html" flush="true"/><li><jsp:include page="news/Item4.html" flush="true"/></ol></body></html>

2、jsp:useBean動作

jsp:useBean動作用來裝載一個將在JSP頁面中使用的JavaBean。這個功能非常有用,因為它使得我們既可以發揮Java元件重用的優勢,同時也避免了損失JSP區別於Servlet的方便性。jsp:useBean動作最簡單的語法為:

<jsp:useBean id="name" class="package.class" />

這行程式碼的含義是:“建立一個由class屬性指定的類的例項,然後把它繫結到其名字由id屬性給出的變數上”。不過,就象我們接下來會看到的,定義一個scope屬性可以讓Bean關聯到更多的頁面。此時,jsp:useBean動作只有在不存在同樣id和scope的Bean時才建立新的物件例項,同時,獲得現有Bean的引用就變得很有必要。

獲得Bean例項之後,要修改Bean的屬性既可以通過jsp:setProperty動作進行,也可以在Scriptlet中利用id屬性所命名的物件變數,通過呼叫該物件的方法顯式地修改其屬性。這使我們想起,當我們說“某個Bean有一個型別為X的屬性foo”時,就意味著“這個類有一個返回值型別為X的getFoo方法,還有一個setFoo方法以X型別的值為引數”。

有關jsp:setProperty動作的詳細情況在後面討論。但現在必須瞭解的是,我們既可以通過jsp:setProperty動作的value屬性直接提供一個值,也可以通過param屬性宣告Bean的屬性值來自指定的請求引數,還可以列出Bean屬性表明它的值應該來自請求引數中的同名變數。

在JSP表示式或Scriptlet中讀取Bean屬性通過呼叫相應的getXXX方法實現,或者更一般地,使用jsp:getProperty動作。

注意包含Bean的類檔案應該放到伺服器正式存放Java類的目錄下,而不是保留給修改後能夠自動裝載的類的目錄。例如,對於Java Web Server來說,Bean和所有Bean用到的類都應該放入classes目錄,或者封裝進jar檔案後放入lib目錄,但不應該放到servlets下。

下面是一個很簡單的例子,它的功能是裝載一個Bean,然後設定/讀取它的message屬性。

BeanTest.jsp

<html><head><title>Reusing JavaBeans in JSP</title></head><body><center><table border=5><tr><th class="title">Reusing JavaBeans in JSP</table></center><P><jsp:useBean id="test" class="hall.SimpleBean" /><jsp:setProperty name="test" property="message" value="Hello" /><h1>Message:<i><jsp:getProperty name="test" property="message" /></i></h1></body></html>

SimpleBean.java

BeanTest頁面用到了一個SimpleBean。SimpleBean的程式碼如下:

package hall;public class SimpleBean {private String message = "No message specified";public String getMessage() {return(message);}public void setMessage(String message) {this.message = message;}}

jsp:useBean動作使用Bean最簡單的方法是先用下面的程式碼裝載Bean:

<jsp:useBean id="name" class="package.class" />

然後通過jsp:setProperty和jsp:getProperty修改和提取Bean的屬性。不過有兩點必須注意。

第一,我們還可以用下面這種格式例項化Bean:

<jsp:useBean ...>Body</jsp:useBean>

它的意思是,只有當第一次例項化Bean時才執行Body部分,如果是利用現有的Bean例項則不執行Body部分。正如下面將要介紹的,jsp:useBean並非總是意味著建立一個新的Bean例項。

第二,除了id和class外,jsp:useBean還有其他三個屬性,即:scope,type,beanName。下表簡要說明這些屬性的用法。

屬性

描述

id

命名引用該Bean的變數。如果能夠找到id和scope相同的Bean例項,jsp:useBean動作將使用已有的Bean例項而不是建立新的例項。

class

指定Bean的完整包名。

scope

指定Bean在哪種上下文內可用,可以取下面的四個值之一:page,request,session和application。預設值是page,表示該Bean只在當前頁面內可用(儲存在當前頁面的PageContext內)。scope之所以很重要,是因為jsp:useBean只有在不存在具有相同id和scope的物件時才會例項化新的物件;如果已有id和scope都相同的物件則直接使用已有的物件,此時jsp:useBean開始標記和結束標記之間的任何內容都將被忽略。

request

表示該Bean在當前的客戶請求內有效(儲存在ServletRequest物件內)。session表示該Bean對當前HttpSession內的所有頁面都有效。最後,如果取值application,則表示該Bean對所有具有相同ServletContext的頁面都有效。

type

指定引用該物件的變數的型別,它必須是Bean類的名字、超類名字、該類所實現的介面名字之一。請記住變數的名字是由id屬性指定的。

beanName

指定Bean的名字。如果提供了type屬性和beanName屬性,允許省略class屬性。

網路配圖

3、jsp:setProperty動作

jsp:setProperty用來設定已經例項化的Bean物件的屬性,有兩種用法。首先,你可以在jsp:useBean元素的外面(後面)使用jsp:setProperty,如下所示:

<jsp:useBean id="myName" ... />...<jsp:setProperty name="myName" property="someProperty" ... />

此時,不管jsp:useBean是找到了一個現有的Bean,還是新建立了一個Bean例項,jsp:setProperty都會執行。第二種用法是把jsp:setProperty放入jsp:useBean元素的內部,如下所示:

<jsp:useBean id="myName" ... >...<jsp:setProperty name="myName" property="someProperty" ... /><jsp:useBean>

此時,jsp:setProperty只有在新建Bean例項時才會執行,如果是使用現有例項則不執行jsp:setProperty。

jsp:setProperty動作有下面四個屬性:

屬性

描述

name

name屬性是必需的。它表示要設定屬性的是哪個Bean。

property

property屬性是必需的。它表示要設定哪個屬性。有一個特殊用法:如果property的值是“*”,表示所有名字和Bean屬性名字匹配的請求引數都將被傳遞給相應的屬性set方法。

value

value屬性是可選的。該屬性用來指定Bean屬性的值。字串資料會在目標類中通過標準的valueOf方法自動轉換成數字、boolean、Boolean、byte、Byte、char、Character。例如,boolean和Boolean型別的屬性值(比如"true")通過Boolean.valueOf轉換,int和Integer型別的屬性值(比如"42")通過Integer.valueOf轉換。

param

param是可選的。它指定用哪個請求引數作為Bean屬性的值。如果當前請求沒有引數,則什麼事情也不做,系統不會把null傳遞給Bean屬性的set方法。因此,你可以讓Bean自己提供預設屬性值,只有當請求引數明確指定了新值時才修改預設屬性值。

注意:value和param不能同時使用,但可以使用其中任意一個。

例如,下面的程式碼片斷:

<jsp:setProperty name="orderBean" property="numberOfItems" param="numItems" />

表示如果存在numItems請求引數的話,把numberOfItems屬性的值設定為請求引數numItems的值;否則什麼也不做。如果同時省略value和param,其效果相當於提供一個param且其值等於property的值。進一步利用這種藉助請求引數和屬性名字相同進行自動賦值的思想,你還可以在property(Bean屬性的名字)中指定“*”,然後省略value和param。此時,伺服器會檢視所有的Bean屬性和請求引數,如果兩者名字相同則自動賦值。

下面是一個利用JavaBean計算素數的例子。

JspPrimes.jsp

<jsp:useBean id="primeTable" class="hall.NumberedPrimes" /><jsp:setProperty name="primeTable" property="numDigits" /><jsp:setProperty name="primeTable" property="numPrimes" />Some:<jsp:getProperty name="primeTable" property="numDigits" />digit primes:<jsp:getProperty name="primeTable" property="numberedList" />

如果請求中有一個numDigits引數,則該值被傳遞給Bean的numDigits屬性;numPrimes也類似。注:NumberedPrimes的程式碼略。

4、jsp:getProperty動作

提取指定Bean屬性的值,轉換成字串,然後輸出。jsp:getProperty有兩個必需的屬性,即:name,表示Bean的名字;property,表示要提取哪個屬性的值。下面是一個例子,更多的例子可以在前文找到。

<jsp:useBean id="itemBean" ... />...<UL><LI>Number of items:<jsp:getProperty name="itemBean" property="numItems" /><LI>Cost of each:<jsp:getProperty name="itemBean" property="unitCost" /></UL>

網路配圖

5、jsp:forward動作

jsp:forward動作把請求轉到另外的頁面。jsp:forward標記只有一個屬性page。page屬性包含的是一個相對URL。page的值既可以直接給出,也可以在請求的時候動態計算,如下面的例子所示:

<jsp:forward page="/utils/errorReporter.jsp" /><jsp:forward page="<%= someJavaExpression %>" />

6、 jsp:plugin動作

jsp:plugin動作用來根據瀏覽器的型別,插入通過Java外掛 執行Java Applet所必需的OBJECT或EMBED元素。