2009-09-01

java jsp

JSP動作包括:
jsp:include:在頁面被請求的時候引入一個檔。
jsp:useBean:尋找或者實例化一個JavaBean。
jsp:setProperty:設置JavaBean的屬性。
jsp:getProperty:輸出某個JavaBean的屬性。
jsp:forward:把請求轉到一個新的頁面。
jsp:plugin:根據流覽器類型為Java插件生成OBJECT或EMBED標記。
JSP動作利用XML語法格式的標記來控制Servlet引擎的行為。利用JSP動作可以動態地插入檔、重用JavaBean元件、把用戶重定向到另外的頁面、為Java插件生成HTML代碼。

13.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

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<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>
   13.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

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<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 WWW" />
<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;
}
}
   13.3 關於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實例而不是創建新的實例。
scope 指定Bean在哪種上下文內可用,可以取下面的四個值之一:page,request,session和application。
預設值是page,表示該Bean只在當前頁面內可用(保存在當前頁面的PageContext內)。

request表示該Bean在當前的客戶請求內有效(保存在ServletRequest物件內)。
session表示該Bean對當前HttpSession內的所有頁面都有效。

最後,如果取值application,則表示該Bean對所有具有相同ServletContext的頁面都有效。

scope之所以很重要,是因為jsp:useBean只有在不存在具有相同id和scope的物件時才會實例化新的物件;如果已有id和scope都相同的物件則直接使用已有的物件,此時jsp:useBean開始標記和結束標記之間的任何內容都將被忽略。
type 指定引用該物件的變數的類型,它必須是Bean類的名字、超類名字、該類所實現的介面名字之一。請記住變數的名字是由id屬性指定的。

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

0 留言: