JSP動作

在本章中,我們將討論JSP中的動作。這些操作使用XML語法中的結構來控制servlet引擎的行爲。我們可以動態插入文件,重新使用JavaBeans組件,將用戶轉發到另一個頁面或爲Java插件生成HTML。

爲了方便示例中的代碼運行的結果,我們使用Eclipse創建一個動態Web項目:JspActions 。這個項目的結構如下所示 -

JSP動作

動作元素只有一種語法,因爲它符合XML標準 -

<jsp:action_name attribute = "value" />

動作元素基本上是預定義的功能。下表列出了可用的JSP動作 -

編號

動作

描述

1

jsp:include

在請求頁面時包含一個文件。

2

jsp:useBean

查找或實例化一個JavaBean。

3

jsp:setProperty

設置JavaBean的屬性。

4

jsp:getProperty

將JavaBean的屬性插入輸出。

5

jsp:forward

將請求者轉發到新頁面。

6

jsp:plugin

生成針對Java插件創建OBJECTEMBED標記的特定於瀏覽器的代碼。

7

jsp:element

動態定義XML元素。

8

jsp:attribute

定義動態定義的XML元素屬性。

9

jsp:body

定義動態定義的XML元素的正文。

10

jsp:text

用於在JSP頁面和文檔中編寫模板文本。

共同屬性

所有動作元素共有兩個屬性:id屬性和scope屬性。

id屬性

id屬性唯一標識動作元素,並允許在JSP頁面內引用該操作。 如果動作創建了一個對象的實例,則id值可以用於通過隱式對象PageContext引用它。

scope屬性

scope屬性標識動作元素的生命週期。id屬性和scope屬性是直接相關的,因爲scope屬性決定了與id關聯的對象的使用壽命。scope屬性有四個可能的值:

  • page
  • request
  • session
  • application

1. jsp:include動作

此動作允許將文件插入到正在生成的頁面中。語法如下所示 -

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

與在將JSP頁面轉換爲servlet時將文件插入的include指令不同,此動作在請求頁面時插入該文件。

下表列出了與include動作相關聯的屬性 -

編號

屬性

描述

1

page

要包括的頁面的相對URL。

2

flush

布爾屬性確定包含的資源是否在包含其緩衝區之前被刷新。

示例

下面定義兩個文件date.jspindex.jsp,以下是date.jsp文件的內容 -

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<p>今天是: <%= (new java.util.Date()).toLocaleString()%></p>

以下是index.jsp文件的內容 -

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>include動作示例</title>
</head>
<body>
    <h2>include動作示例</h2>
    <jsp:include page="date.jsp" flush="true" />
</body>
</html>

現在將這些文件保存在根目錄下,並嘗試訪問index.jsp。將會看到以下輸出 -

JSP動作

2. jsp:useBean 動作

useBean動作是非常通用的。它首先使用idscope變量搜索現有對象。如果未找到對象,則會嘗試創建指定的對象。

加載bean的最簡單的方法如下 -

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

當加載了一個bean類,可以使用jsp:setPropertyjsp:getProperty操作來修改和檢索bean屬性。

下表列出了與useBean動作關聯的屬性 -

編號

屬性

描述

1

class

指定bean的完整包名稱。

2

type

指定將引用對象的變量的類型。

3

beanName

給出由java.beans.Beansinstantiate()方法指定的bean的名稱。

現在來看看jsp:setPropertyjsp:getProperty動作,然後再給出與這些操作相關的有效示例。

3. jsp:setProperty 動作

setProperty操作設置Bean的屬性。 在此操作之前,Bean先前已定義。 有兩種使用setProperty操作的基本方法 -

可以使用jsp:setProperty在之後,但是在jsp:useBean元素之外,如下所示:

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

在這種情況下,執行jsp:setProperty,無論是實例化新bean還是找到現有的bean

jsp:setProperty可以在jsp:useBean元素的正文內的上下文內出現,如下所示:

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

這裏,只有當一個新對象被實例化時,才執行jsp:setProperty,如果找到了一個現有的對象,則不執行。

下表列出了與setProperty動作相關聯的屬性 -

編號

屬性

描述

1

name

指定將設置其屬性的beanBean在先前就已經定義了。

2

property

表示要設置的屬性。值「*」表示名稱與bean屬性名稱匹配的所有請求參數將被傳遞給對應的setter方法。

3

value

要分配給給定屬性的值。參數的值爲null,或者參數不存在,則setProperty操作被忽略。

4

param

param屬性是屬性要接收的值的請求參數的名稱。不能同時使用值和參數,但是不允許使用。

4. jsp:getProperty動作

getProperty操作用於檢索給定屬性的值並將其轉換爲字符串,最後將其插入輸出。getProperty動作只有兩個屬性,這兩個屬性都是必需的。getProperty操作的語法如下:

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

下表列出了與getProperty動作相關聯的必需屬性 -

編號

動作

描述

1

name

要檢索的屬性的Bean名稱。 前提是Bean在先前已經定義了。

2

property

property屬性是要檢索的Bean屬性的名稱。

示例

下面定義一個Bean類:Message ,其代碼如下-

/* File: Message.java */
package com.yiibai;

public class Message {
   private String message = "No message specified";

   public String getMessage() {
      return(message);
   }
   public void setMessage(String message) {
      this.message = message;
   }
}

main.jsp文件中編寫以下代碼。這將加載bean並設置/獲取一個簡單的String參數 -

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<html>

<head>
<title>在JSP使用JavaBeans示例</title>
</head>

<body>
    <div style="margin:auto;text-align:center;">
        <h2>在JSP使用JavaBeans示例</h2>
        <hr/>
        <jsp:useBean id="msg" class="com.yiibai.Message" />
        <p>獲取默認設置的信息是:<jsp:getProperty name="msg" property="message" /></p>

        <jsp:setProperty name="msg" property="message" value="Hello JSP..." />
        <p>獲取設置的信息是:<jsp:getProperty name="msg" property="message" /></p>

    </div>
</body>
</html>

現在嘗試訪問main.jsp,它將顯示以下結果 -

JSP動作

5. jsp:forward動作

<jsp:forward>動作終止當前頁面的操作,並將請求轉發到另一個資源,例如靜態頁面,另一個JSP頁面或Java Servlet。

以下是<jsp:forward>動作的語法 -

<jsp:forward page = "Relative URL" />

下表列出了與<jsp:forward>動作相關聯的必需屬性 -

編號

動作

描述

1

page

應該包含另一個資源的相對URL,例如靜態頁面,另一個JSP頁面或Java Servlet。

示例

創建以下兩個文件:date.jspmain.jsp,分別如下 -

以下是date.jsp文件的內容 -

<p>Today's date: <%= (new java.util.Date()).toLocaleString()%></p>

以下是main.jsp文件的內容 -

現在將這些文件保存在根目錄下,並嘗試訪問main.jsp。這將顯示如下所示的結果。

在這裏,它從main.jsp丟棄了內容,並顯示了來自轉發目標頁面的內容。

6. jsp:plugin 動作

<jsp:plugin>動作用於將Java組件插入到JSP頁面中。它確定瀏覽器的類型,並根據需要插入<object><embed>標籤。

如果所需的插件不存在,它會下載插件,然後執行Java組件。Java組件可以是Applet或JavaBean。

<jsp:plugin>動作有幾個屬性對應於用於格式化Java組件的常用HTML標記。 <param>元素也可用於向AppletBean發送參數。

以下是使用<jsp:plugin>動作的典型語法 -

<jsp:plugin type = "applet" codebase = "dirname" code = "MyApplet.class"
   width = "60" height = "80">
   <jsp:param name = "fontcolor" value = "red" />
   <jsp:param name = "background" value = "black" />

   <jsp:fallback>
      Unable to initialize Java Plugin
   </jsp:fallback>

</jsp:plugin>

如果您有興趣,可以使用一些小程序嘗試此操作。新元素<fallback>元素可用於指定要發送給用戶的錯誤字符串,以防組件發生故障。

<jsp:element><jsp:attribute><jsp:body>動作用於動態定義XML元素。 這個詞動態是重要的,因爲這意味着XML元素可以在請求時生成,而不是在編譯時靜態生成。

以下是動態定義XML元素的簡單示例 -

<%@page language = "java" contentType = "text/html"%>
<html xmlns = "http://www.w3c.org/1999/xhtml"
   xmlns:jsp = "http://java.sun.com/JSP/Page">

   <head><title>Generate XML Element</title></head>

   <body>
      <jsp:element name = "xmlElement">
         <jsp:attribute name = "xmlElementAttr">
            Value for the attribute
         </jsp:attribute>

         <jsp:body>
            Body for XML element
         </jsp:body>

      </jsp:element>
   </body>
</html>

這將在運行時生成以下HTML代碼 -

<html xmlns = "http://www.w3c.org/1999/xhtml" xmlns:jsp = "http://java.sun.com/JSP/Page">
   <head><title>Generate XML Element</title></head>

   <body>
      <xmlElement xmlElementAttr = "Value for the attribute">
         Body for XML element
      </xmlElement>
   </body>
</html>

7. jsp:text動作

可以使用<jsp:text>操作將模板文本寫入JSP頁面和文檔。以下是此操作的簡單語法 -

<jsp:text>Template data</jsp:text>

模板的主體不能包含其他元素; 它只能包含文本和EL表達式(注 - EL表達式將在後續章節中進行說明)。 請注意,在XML文件中不能使用諸如${whatever> 0}的表達式,因爲大於符號是非法的。它是使用gt形式來代替,例如${whatever gt 0}或替代方法是將值嵌入到CDATA中。如下示例 -

<jsp:text><![CDATA[<br>]]></jsp:text>

如果需要包括DOCTYPE聲明,例如XHTML,還必須使用<jsp:text>元素,如下所示:

<jsp:text><![CDATA[<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
   "DTD/xhtml1-strict.dtd">]]></jsp:text>

   <head><title>jsp:text action</title></head>

   <body>
      <books><book><jsp:text>  
         Welcome to JSP Programming
      </jsp:text></book></books>
   </body>
</html>

嘗試以上示例,並使用<jsp:text>操作。