1. 程式人生 > >(五)struts之taglib標籤

(五)struts之taglib標籤

關於taglib的標籤使用,我倒是不太喜歡,本人更傾向於使用JSTL的標籤,不過struts標籤一點好處就是:struts標籤 能夠和struts-config.xml, ActionForm等特有的物件進行互動既然struts自帶這麼多標籤,我還是要說一下的

struts的標籤大致分為,struts html標籤,Bean標籤,Logic標籤,Nested標籤,template標籤

Struts提供了五個標籤庫,即:HTML、Bean、Logic、Template和Nested。 HTML 標籤:         用來建立能夠和Struts 框架和其他相應的HTML 標籤互動的HTML 輸入表單
Bean 標籤:         在訪問JavaBeans 及其屬性,以及定義一個新的bean 時使用 Logic 標籤:          管理條件產生的輸出和物件集產生的迴圈 Template 標籤:   隨著Tiles框架包的出現,此標記已開始減少使用 Nested 標籤:       增強對其他的Struts 標籤的巢狀使用的能力

  html標籤

HTML標籤庫主要用來顯示HTML元素,如果不用這種方法,你就必須用HTML標籤來指定它們。從表面上看,這個標籤庫很簡單。但是通過深入研究,我們就會發現它很強大。例如,它可以為我們在HTML表單的一個特定輸入元素中放置重點內容生成JavaScript,或為客戶端輸入驗證生成指令碼。而且,你可以用它通過一行程式碼來處理錯誤。然而,在將這個標籤庫用於你的Struts應用程式前,你需要做些簡單的準備工作。

Struts標籤大致分為以下幾類:

1)用於生成基本的HTML元素的標籤;

2)用於生成HTML表單的標籤;

3)顯示錯誤或正常訊息的標籤;

一、 用於生成基本的HTML元素的標籤:

1.<html:html>標籤:

用於在網頁的開頭生成HTML的<html>元素。該標籤有一個lang屬性,用於顯示使用者使用的語言:<html:html lang=”true”>。如果客戶瀏覽器使用中文語言,那麼以上程式碼在執行時將被解析為普通的HTML程式碼:<html lang=”zh-CN”>。

當lang屬性為“true”時,<html:html>標籤將先根據儲存在當前HttpSession中的Locale物件來輸出網頁使用的語言,如果不存在HttpSession或HttpSession中沒有Locale物件,就根據客戶瀏覽器提交的HTTP請求頭中的Accept-Language屬性來輸出語言,如果HTTP請求頭中沒有Accept-Language屬性,就根據預設的Locale來輸出語言。

2. <html:base>標籤:

<html:base>標籤在網頁的<head>部分生成HTML<base>元素。HTML<base>元素用於生成當前網頁的絕對URL路徑。如果在網頁中使用了<html:base>標籤,當該網頁引用同一個應用的其他網頁時,只需給出相對於當前網頁的相對URL路徑即可。

3.<html:link>標籤:

<html:link>標籤用於生成HTML<a>元素。它有兩個優點:

1)允許在URL中以多種方式包含請求引數;

2)當用戶瀏覽器關閉Cookie時,會自動重寫URL,將SessionID作為請求引數包含在URL中,用於跟蹤使用者的SessoinID狀態。

<html:link>標籤有以下重要屬性:

1)  forward:指定全域性轉發連結(在Struts配置檔案中配置<global-forwards>的子元素<forward>);

2) href:指定完整的URL連結(如果Web應用需要連結到其他站點);

3)page:指定相對於當前網頁的URL(如果從一個網頁連結到同一個應用中的另一個網頁),page屬性用於指定相對於當前應用的URI;

<html:link>標籤的使用:

1)在URL或URI中包含請求引數:如果要在URL或URIk 包含請求引數,只要把請求引數加在URL或URI的末尾即可。例如:<html:link page=”/action.do?param1=value1&amp;param2=value2”>連結文字</html:link>。

2) 在URL或URI中包含單個請求變數:如果要在URL中包含一個請求引數,而這個引數的值存在於當前網頁可訪問的一個變數中,可按以下方式實現:首先在網頁中建立可訪問變數,如:

           <%

           //建立一個字串型別的變數

           String strBean = “value to pass on URL”;

           pageContext.setAttribute(“strBean”,strBean);

           %>

           //建立一個JavaBean

           <jsp:useBean id=”user” scope=”page” class=”beans.userBean” />

           <jsp:setProperty name=”user” property=”name” value=”name1” />

           接著,把這兩個變數作為請求引數加入到URL或URI中:

           <html:link page=”/action.do” paramId=”param1” paramName=”strBean”>

           把字串變數作為請求引數進行傳遞</html:link>

           <html:link page=”/action.do” paramId=”param2” paramName=”user” paramProperty=”name” >將JavaBean的屬性值作為請求引數進行傳遞</html:link>

           其中,paramId屬性指定請求引數名,paramName屬性指定變數的名字,paramProperty屬性指定JavaBean的屬性。

    在URL或URI中包含多個請求變數:

如果在URL或URI中包含多個請求引數,而這些引數的值來自於多個變數,需要先定義一個Map型別的Java類,用它來存放請求變數。例如:

<%

java.util.Map myMap = new java.util.HashMap();

myMap.put(“myString”,new String(“string value”));

myMap.put(“myArray”,new String[]{“str1”,”str2”,”str3”});

pageContext.setAttribute(“map”,myMap);

%>

將HashMap作為請求引數,加入到URL或URI中:

<html:link page=”/action.do” name=”map” >將多個變數作為請求引數傳遞</html:link>

以上程式碼將生成如下HTML程式碼:

<a href=”/應用程式名/action.do?myString=string+value&amp;myArray=str1&amp;myArray=str2&amp;myArray=str3”>將多個變數作為請求引數傳遞</html:link&gt; 

4.<html:rewrite>標籤:

用於輸出超連結中的URI部分,但它並不生成HTML<a>元素。URI指的是URL中協議、主機和埠以後的內容。URI用於指定具體的請求資源。它的使用方法和<html:link>保持一致。

5.<html:img>標籤:

用於在HTML頁中嵌入圖片。此外,它還允許包含請求變數,以便動態控制圖片的輸出。

1)生成基本的HTML<img>元素:<html:img page=”/圖片相對於當前頁面的URI” />,page屬性指定相對於當前頁面的URI;

2)生成包含單個請求變數的HTML<img>元素:其用法和<html:link>標籤相似。

<html:img src=”/圖片完整的URI” paramId=”引數名” paramName=”變數名” />

3) 生成包含多個請求變數的HTML<img>元素:用法和<html:link>標籤相似。

<html:img page=”/圖片相對於當前頁面的URI” name=”Map集合物件在作用域物件中的key值” />

二、 基本的表單標籤:

1. <html:form>標籤:

該標籤用於建立表單,例如:<html:form action=”formBasic.do”>,action屬性用來指定當使用者提交表單後,處理使用者請求的元件。以上程式碼生成如下的HTML內容:<form action=”/應用程式名/formBasic.do” name=”formBasicForm” method=”post”>。

2. <html:text>標籤:

該標籤在表單上建立HTML文字框欄位。<html:text property=”屬性名” />。property屬性指定了欄位的名字,它和ActionForm Bean中的一個屬性匹配。

3.  <html:cancel>標籤:

該標籤在表單中生成取消按鈕。當用戶按下取消按鈕時,將產生一個取消事件,這個事件由Action類來捕獲,至於如何處理這個事件,可以在Action類的execute()方法中程式設計來實現。使用者選擇取消按鈕的情形為:使用者已經按下了提交按鈕,在等待伺服器響應結果的過程中忽然改變主意,想取消操作,就會按下取消按鈕。因此,在Action類中處理取消事件時,可以執行一些清除操作,取消已經執行的響應使用者請求的部分操作。

<html:cancel>Cancel</html:cancel>,以上程式碼生成如下HTML內容:<input type=”submit” name=”org.apache.struts.taglib.html.CANCEL” value=”Cancel”>。

Action類的isCancelled(request)方法用來判斷取消事件有沒有發生,如果這個方法返回true,就表示取消事件發生了,可以在程式中進行相關的操作。

4. <html:reset>標籤:

該標籤生成表單的復位按鈕。<html:reset>Reset</html:reset>,生成如下HTML內容:<input type=”reset” name=”reset” value=”Reset” />。

5. <html:submit>標籤:

該標籤用於生成表單的提交按鈕。<html:submit>Submit</html:submit>,生成如下HTML內容:<input type=”submit” name=”submit” value=”Submit” />。

6.  <html:hidden>標籤:

該標籤在表單上生成隱藏欄位。用於在表單上存放不希望使用者看到或不允許修改的資訊。使用方式有兩種:

1)<html:hidden property=”hiddenValue” />:生成相應的HTML內容為<input type=”hidden” name=”hiddenValue” value=”網頁中hiddenValue元素的值” />;

2)<html:hidden property=”hiddenValue” write=”true” />:生成相應的HTML內容為<input type=”hidden” name=”hiddenValue” value=”網頁中hiddenValue元素的值” />網頁中hiddenValue元素的值;這種方式可以把隱藏欄位的值顯示在網頁上,如果需要在表單上顯示某個值,但不希望使用者改變這個值,就可以使用這種方法。

三、 檢查框和單選按鈕標籤:

1.      <html:checkbox>標籤:

在表單上生成標準的HTML檢查框。假如ActionForm Bean中的某個屬性只有兩種可選值(如true和false),就可以在表單中使用該標籤,它只能和ActionForm Bean中的boolean型別的屬性對應。<html:checkbox property=”checkbox1” />,生成相應的HTML內容為:<input type=”checkbox” name=”checkbox1” value=”true” />。

<html:checkbox>有一個value屬性,用來設定使用者選中檢查框時的值,value預設值為true。如果把value屬性設定為false,則表示如果使用者選擇了這個檢查框,就把相應的ActionForm Bean中的屬性值設定為false。這個規則很容易讓人混淆,使用時應小心。

注:為了使檢查框能正常工作,必須在ActionForm Bean的reset()方法中對其復位。

2. <html:multibox>標籤:

在表單上生成標準的HTML檢查框。如果應用中有多個checkbox,並且希望在ActoinForm Bean中用單個數組來表示它們,就可以採用該標籤。使用方法如下:

1)在ActionForm Bean中定義一個數組,來存放所有CheckBox的值;

2)在表單中加入<html:multibox>元素,通過設定property屬性來把它和ActionForm Bean中的陣列關聯;

3)對於每個<html:multibox>元素,設定它的初始值,有兩種方式:<html:multibox property=”屬性陣列名” value=”陣列元素的值”/>或<html:multibox property=”屬性陣列名”>陣列元素的值</html:multibox>。

當用戶提交表單時,所有被選中的複選框的值都會被存放到ActionForm Bean中的相應陣列中,如果某個複選框沒有被選中,那麼陣列的就不會包含它的值。

3. <html:radio>標籤:

提供表單中的HTML<input type=”radio”>元素,表示單選按鈕。多個<html:radio>標籤可以成組使用。例如:

<html:radio property=”radioVal” value=”value1” />

<html:radio property=”radioVal” value=”value2” />

將標籤的property屬性設定為相同,而僅僅是value不同。在同一時刻,只允許使用者選擇一個按鈕,如果兩個按鈕都沒有選中,則ActionForm Bean中的radioVal屬性將被設為空字串。

四、 下拉列表和多選列表標籤:

1.<html:select>標籤:

用於生成HTML<select>元素。它可以在表單上建立下拉列表或多選列表。可以包含多個<html:option>、<html:options>和<html:optionsCollection>標籤。其基本形式為:

<html:select property=”propertyName” multiple=”true|false” size=”count”>

    [1 or more <html:option>,<html:options>,<html:optionsCollection> tags]

</html:select>

1) size屬性:指定每次在網頁上顯示的可選項的數目;

2) multiple屬性:指定是否支援多項選擇,如果設定為true,就表示多選列表,否則表示下拉列表。預設值為false。

3)property屬性:與ActionForm Bean中的某個屬性對應,這個屬性用來存放使用者在列表上選中選項的值。在單項選擇的情況下,ActionForm Bean中的對應屬性應該定義為簡單型別(不能為陣列);在多項選擇的情況下,ActionForm Bean中的對應屬性應該定義為陣列型別。

2.      <html:option>標籤:

用於生成HTML<option>元素。這個標籤被巢狀在<html:select>標籤中,代表列表中的一個可選項。可選項的Label值有兩個來源:

1)在<html:option>和</html:option>之間的文字內容;

2)由<html:option>標籤的key、locale和bundle屬性指定的Resource Bundle中的內容。bundle屬性指定Resource Bundle,它和Struts配置檔案中<message-resources>元素的key屬性匹配;key屬性和資原始檔中的訊息key匹配。

3. <html:options>標籤:

提供一組HTML<option>元素。在<html:select>中可以包含多個<html:options>元素。  其主要屬性為:

1)collection屬性:指定存放可選項的集合(可以是HashMap集合,或者包含JavaBean物件的List集合);

2) property屬性:指定集合中可選項的實際值;

3) labelProperty屬性:指定集合中可選項的顯示值;

4. <html:optionsCollection>標籤:

用於提供一組HTML<option>元素。在<html:select>元素中可以包含多個<html:optionsCollection>元素。其主要屬性為:

1) property屬性:指定可選項的集合(和ActionForm Bean的一個集合屬性相關聯);

2)value屬性:指定集合中可選項的實際值;

3)label屬性:指定集合中可選項的顯示值;

4)name屬性:指定可選項的集合(可以是HashMap集合,或者包含JavaBean物件的List集合);

五、 在表單中上傳檔案標籤:

檔案上傳指的是使用者通過瀏覽器把使用者本地的檔案上傳到Web伺服器端。<html:file>標籤生成HTML<input type=”file”>元素,提供從HTML表單中上傳檔案的功能。

1. <html:file>標籤:可以方便地實現檔案上傳功能,例如:

<html:form action=”action.do” method=”Post” enctype=”multipart/form-data”>

    <html:file property=”屬性名” />

</html:form>

使用<html:file>標籤需要注意以下幾點:

1) <html:file>標籤必須巢狀在<html:form>標籤中;

2)<html:form>標籤的method屬性必須設定為”post”;

3) <html:form>標籤的編碼型別enctype屬性必須設定為“multipart/form-data”;

4)<html:file>標籤必須設定property屬性,這個屬性和ActionForm Bean中的FormFile型別的屬性相對應。

2. 在ActionForm Bean中設定FormFile屬性:

與JSP檔案中的<html:file property=”propertyName” />,在ActionForm Bean中必須定義一個名為”propertyName”的屬性。這個屬性必須為“org.apache.struts.upload.FormFile”型別。

3. 在Action類中處理檔案上傳:

檔案上傳比傳遞HTTP表單的其他資料要複雜,Struts框架提供了這方面的功能,如果要處理實際的檔案上傳和儲存操作,可以採用以下程式碼:

//確定上傳檔案在伺服器上的儲存目錄

String dir = servlet.getServletContext().getRealPath(“/upload”);

//獲得ActionForm Bean的例項

HtmlFileForm hff = (HtmlFileForm)form;

FormFile file = hff.getFile();

if(file == null)

{

  return mapping.findForward(“success”);

}

//獲得檔名和檔案大小

String fileName = file.getFileName();

String size = Integer.toString(file.getFileSize()) + “bytes”;

//獲取讀取使用者上傳檔案的InputStream物件

InputStream streamIn = file.getInputStream();

//建立將上傳資料寫到目標檔案中的OutputStream物件

OutputStream streamOut = new FileOutputStream(dir + “/” + fileName);

//讀取InputStream的內容,再將讀取內容通過OutputStream物件寫到目標檔案中

int bytesRead = 0;

byte[] buffer = new byte[1024];

while((bytesRead=streamIn.read(buffer,0,1024)) != -1)

{

streamOut.write(buffer,0,bytesRead);

}

streamOut.close();

streamIn.close();

六、 <html:errors>標籤:

用於輸出錯誤訊息。

1.錯誤訊息的來源:

<html:errors>標籤在request和session範圍內尋找ActionMessages(或其子類ActionErrors)集合物件,再從ActionMessages集合物件中讀取ActionMessage物件,把ActionMessage物件包含的訊息文字顯示到網頁上。

在ActionForm Bean和Action類中都可以生成ActionMessages物件:ActionForm Bean的validate()方法執行表單驗證,返回ActionErrors物件,Struts控制器元件RequestProcessor把ActionErrors物件存放在request範圍內,存放時的屬性key為Globals.ERROR_KEY;在Action類的execute()方法可以進行資料邏輯驗證,如果驗證失敗,將生成ActionMessages物件(建立ActionMessages物件;向ActionMessages物件中新增ActionMessage物件;呼叫saveErrors(HttpServletRequest,ActionMessages)方法把ActionMessages物件儲存在request範圍內)。

2. 格式化地顯示錯誤訊息:

<html:errors>標籤能夠格式化地顯示ActionMessage物件包含的訊息文字,而這些訊息文字預先存放在Resource Bundle中。<html:errors>標籤能夠識別錯誤訊息文字中的HTML元素(如:<li>元素、<hr>元素等)。另:errors.header和errors.footer分別可以生成訊息主體的頁頭和頁尾。

3.<html:errors>標籤的用法:

<html:errors>標籤可以放在網頁的任何地方,既可以位於HTML表單內,也可以位於HTML表單之外。<html:errors>標籤具有以下重要屬性:

1)name:指定ActionMessages物件存放在request或session範圍內的屬性key,預設值為Global.ERROR_KEY。

2)property:指定訊息屬性。如果此項沒有設定,將顯示ActionMessages物件中所有的ActionMessage。

3)bundle:指定Resource Bundle。如果此項沒有設定,將從應用預設的Resource Bundle中獲取訊息文字。

注:ActionMessages的add(String property,ActionMessage message)方法的porperty引數用於設定訊息屬性。同一訊息屬性可以對應多條訊息,例如:

errors.add(ActionMessages.GLOBAL_MESSAGE,new ActionMessage(“error.err1”));

errors.add(ActionMessages.GLOBAL_MESSAGE,new ActionMessage(“error.err2”));

<html:errors>標籤的property屬性和以上ActionMessages的add()方法的property屬性匹配。

<html:errors>的三種使用方法:

1)顯示全域性訊息:全域性訊息是指不和特定表單欄位關係的訊息,訊息屬性為ActionMessages.GLOBAL_MESSAGE。ActionMessages.GLOBAL_MESSAGE是一個常量,它的值為“org.apache.struts.action.GLOBAL_MESSAGE”,它代表全域性訊息。

2)顯示所有訊息:如果在<html:errors>標籤中沒有設定property屬性,將顯示ActionMessages物件中所有的訊息。

3)顯示和特定表單欄位關聯的訊息:例如:在ActionForm Bean的validate()方法中有如下程式碼:errors.add(“txtUserName”,new ActionMessage(“errors.user”));而在相應的JSP頁面中顯示該錯誤訊息的程式碼為:<html:errors property=”txtUserName” />。

七、 <html:messages>標籤:

<html:messages>標籤和<html:errors>標籤有些相似,也能夠在網頁上輸出訊息,不過兩者的使用方法有些差別。例如在JSP頁面中顯示正常訊息的程式碼如下:

<html:messages id=”message” message=”true”>

  <bean:write name=”message” />

</html:messages>

該標籤的重要屬性為:

1)name屬性:指定ActionMessages物件存放在request或session範圍內的屬性key。

2)message屬性:指定訊息來源。如果為true,則從request或session範圍內檢索出屬性為key為Globals.MESSAGE_KEY的ActionMessages物件,此時name屬性無效;如果為false,則根據name屬性來檢索ActionMessages物件,如果此時沒有設定name屬性,將採用預設值Globals.ERROR_KEY。message屬性的預設值為false。

3)id屬性:用來命名從訊息集合中檢索出的每個ActionMessage物件,它和<bean:write>標籤的name屬性匹配。在上例中,<html:messages>標籤的處理類每次從訊息集合中取出一個ActionMessage物件,就把它命名為“message”,<bean:write>標籤接著把這個名為“message”的ActionMessage物件的訊息輸出到網頁上。

注:在Action類的execute()方法中處理邏輯時,如果需要新增訊息,然後在轉發的JSP頁面中輸出這些訊息,則先建立ActionMessages物件,然後呼叫它的add(String property, ActionMessage message)方法將一條正常的訊息儲存在ActionMessages集合物件中,接著再呼叫saveMessages(HttpServletRequest,ActionMessages)方法,把ActionMessages集合存放到request範圍內。

  bean標籤

Struts Bean標籤庫的功能大致分為三類:

1)用於訪問HTTP請求資訊或JSP隱式物件的Bean標籤;

2)用於訪問Web應用資源的Bean標籤;

3)用於定義或輸出JavaBean的Bean標籤;

一、訪問HTTP請求資訊或JSP隱式物件:

1. <bean:header>標籤:

用於檢索HTTP請求中的Header資訊,它具有的屬性:

1)id屬性:定義一個String型別的變數名稱,這個變數存放在page範圍內;

2)name屬性:指定需要檢索的Header資訊;

例如:<bean:header id=”lang” name=”Accept-Language” />,該標籤執行的操作          

等價於:<%

      String value = request.getHeader(“Accept-Language”);

      pageContext.setAttribute(“lang”,value);

      %>

可以通過<bean:write name=”lang” />標籤輸出lang變數的值。

2.<bean:parameter>標籤:

用於檢索HTTP請求引數,它具有的屬性:

1)id屬性:定義一個String型別的變數名稱,這個變數存放在page範圍內;

2)name屬性:指定請求引數的名稱;

3)value屬性:指定請求引數的預設值;

4)multiple屬性:可以設定為任意一個字串(如:yes),則檢索出所有和引數名匹配的請求引數,此時id屬性定義的變數不再是String型別,而是String[]陣列,用於存放所有和name屬性匹配的請求引數值。

3. <bean:cookie>標籤:

檢索儲存在瀏覽器中的Cookie。它具有以下屬性:

1)id屬性:定義一個javax.servlet.http.Cookie型別的變數,這個變數被存放在page範圍內;

2)name屬性:指定Cookie的名字;

3)value屬性:指定Cookie的預設值。如果由name屬性指定的Cookie不存在,就使用value屬性指定的預設值。

4. <bean:page>標籤:

用於檢索JSP隱式物件。它具有以下屬性:

1) id屬性:定義一個引用隱式物件的變數,這個變數存放在page範圍內;

2)property屬性:指定隱式物件的名字,可選值包括application、config、request、response和session。

二、訪問Web應用資源:

1. <bean:message>標籤:

用於輸出Resource Bundle中的一條訊息。bundle屬性指定Resource Bundle,它和Struts配置檔案的<message-resources>元素的key屬性匹配。如果沒有設定bundle屬性,就採用預設的Resource Bundle。在<bean:message>標籤中指定訊息key有三種方式:

1)<bean:message>標籤的key屬性直接指定訊息key;

2)<bean:message>標籤的name屬性指定一個可以轉化為字串的變數,這個變數的字串值為訊息key;

3)同時指定<bean:message>標籤的name屬性和property屬性,name屬性指定一個JavaBean,property屬性指定JavaBean的一個屬性,這個JavaBean的屬性值就是訊息key。

注:對於帶引數的複合訊息,可以使用<bean:message>標籤的arg0、arg1、arg2、arg3和arg4屬性來設定引數值。

2.<bean:resource>標籤:

用於檢索Web資源的內容。它具有以下屬性:

1)id屬性:定義一個代表Web資源的變數;

2)name屬性:指定Web資源的路徑;

3)input屬性:如果沒有設定input屬性,則id屬性定義的變數為字串型別;如果給input屬性設定了值(可以是任意字串),則id屬性定義的變數為java.io.InputStream型別。

3.<bean:struts>標籤:

用於檢索Struts框架內在的物件,如ActionForm Bean、ActionForward或ActionMapping。<bean:struts>標籤的id屬性定義一個page範圍內的變數,用來引用Struts框架的內在物件。必須設定formbean、forward或mapping屬性中的一個屬性,來指定被引用的Struts內在物件:

1)formbean屬性:指定ActionForm Bean物件,和Struts配置檔案的<form-bean>元素匹配;

2)forward屬性:指定ActionForward物件,和Struts配置檔案的<global-forward>元素的<forward>子元素匹配;

3)mapping屬性:指定ActionMapping物件,和Struts配置檔案的<action>元素匹配;

4.<bean:include>標籤:

與標準的JSP標籤<jsp:include>很相似,都可以用來包含其他Web資源的內容,區別在於<bean:include>標籤把其他Web資源的內容存放在一個變數中,而不是直接顯示到網頁上。<bean:include>標籤的id屬性定義一個代表其他Web資源的變數。

可以通過<bean:include>標籤的forward、page或href屬性來指定其他Web資源:

3)forward屬性:指定全域性轉發路徑,和Struts配置檔案的<global-forward>元素中<forward>子元素匹配;

4)page屬性:指定相對於當前應用的URI,以“/”開頭;

5)href屬性:指定完整的URL。

三、定義或輸出JavaBean:

1. <bean:define>標籤:

用於定義一個變數。id屬性指定變數名字,toScope屬性指定這個變數的存放範圍,如果沒有指定toScope屬性,則這個變數存放在page範圍內。給變數賦值的方式有三種:

1)設定value屬性:此時id屬性定義的變數為字串型別,value屬性代表這個變數的字串值。

2) 同時設定name和property屬性:name屬性指定一個已經存在的Bean。property屬性指定已經存在的Bean的某個屬性。id屬性定義的變數的值由property屬性決定。

3)同時設定name屬性和type屬性:name屬性指定已經存在的JavaBean,type屬性指定這個JavaBean的完整類名。id屬性定義的變數引用這個已經存在的JavaBean。

注:對於由name屬性指定的已經存在的JavaBean,在預設情況下,<bean:define>標籤會依次在page、request、session和application範圍內尋找這個JavaBean。此外,也可以設定<bean:write>標籤的scope屬性,明確指定這個JavaBean的範圍。

2. <bean:size>標籤:

用於獲得Map、Collection或陣列的長度。<bean:size>標籤的id屬性定義一個Integer型別的變數。name屬性指定已經存在的Map、Collection或陣列變數。

3.  <bean:write>標籤:

用於在網頁上輸出某個Bean或它的屬性的內容。它具有以下屬性:

1) name屬性:指定已經存在的變數。如果<bean:write>只設置了name屬性,<bean:write>標籤處理類會呼叫name屬性指定的變數的toString()方法獲得字串。

2) property屬性:指定Bean的屬性。如果希望輸出Bean的某個屬性值,應該同時設定<bean:write>標籤的name屬性和property屬性。

3)format屬性:設定輸出資料的格式。

filter屬性:預設值為true,表示將把輸出內容中的特殊HTML符號作為普通字串來顯示;如果filter屬性為false,表示不會把輸出內容中的特殊HTML符號轉化為普通字串

  Logic標籤

一、進行比較運算的Logic標籤

比較運算標籤比較結果為true的條件: 比較運算標籤 比較結果為true的條件 

<logic:equal> 變數等於指定常量 

<logic:notEqual> 變數不等於指定常量 

<logic:lessThan> 變數小於指定常量 

<logic:lessEqual> 變數小於或等於指定常量 

<logic:greaterThan> 變數大於指定常量 

<logic:greaterEqual> 變數大於或等於指定常量 

比較運算標籤的value屬性指定常量值,可以通過以下方式來設定變數:

1)設定cookie屬性,此時變數為cookie屬性指定的Cookie的值;

2) 設定header屬性,此時變數為header屬性指定的HTTP請求中的Header資訊;

3)設定parameter屬性,此時變數為parameter屬性指定的請求引數的值;

4) 設定name屬性,此時name屬性指定被比較的變數;

5) 同時設定namet屬性和property屬性,此時name屬性指定已經存在的JavaBean,property屬性指定JavaBean的屬性,被比較的變數為這個屬性的值;

注:如果兩個字串都可以成功地轉化為數字,就比較數字的大小,否則就進行字串比較。

二、進行字串匹配的Logic標籤:

所有的字串匹配標籤都判斷一個變數中是否包含指定的常量字串。字串匹配標籤判斷結果為true的條件:

字串匹配標籤 判斷結果為true的條件 

<logic:match> 變數中包含指定的常量字串 

<logic:notMatch> 變數中不包含指定的常量字串 

字串匹配標籤的value屬性指定常量值,可以通過cookie、header、parameter、name和property屬性來設定變數,它們的用法和比較運算標籤的相應屬性相同。

字串匹配標籤的location屬性指定子字串的起始位置,可選值包括:

1)start:子字串位於母字串的起始位置;

2) end:子字串位於母字串的結尾;

如果沒有指定location屬性,子字串可以位於母字串的任何位置。

三、判斷指定內容是否存在的Logic標籤:

1. <logic:empty>和<logic:notEmpty>標籤:

判斷指定的變數是否為null或空字串。可以通過設定name屬性,或者同時設定name屬性和property屬性,來指定變數。

2.<logic:present>和<logic:notPresent>標籤:

判斷指定的物件是否存在。具有以下屬性,分別用於判斷某種型別的物件是否存在:

1)cookie屬性:判斷指定的cookie是否存在;

2)header屬性:判斷指定的HTTP請求Header是否存在;

3)role屬性:判斷當前通過許可權驗證的使用者是否具有指定的安全形色,多個安全形色之間以逗號分隔,例:<logic:present role=”role1,role2,role3”>code..</logic:present>;

1)user屬性:判斷當前通過許可權驗證的使用者是否擁有指定的使用者名稱;

2) parameter屬性:判斷指定的請求引數是否存在;

3)name屬性:判斷指定的JavaBean是否存在;

4)同時設定name屬性和property屬性:name屬性指定JavaBean,property屬性指定JavaBean的某個屬性,判斷這個屬性是否存在並且是否為null。

1.  <logic:messagesPresent>和<logic:messagesNotPresent>標籤:

判斷是否在request範圍內存在指定的ActionMessages(或其子類ActionErrors)物件,以及在ActionMessages物件中是否存在特定的訊息。具有以下屬性:

屬性 說明 

name 指定在request範圍內檢索ActionMessages物件的屬性key 

message 如果為true,則從request範圍內檢索屬性key為Globals.MESSAGE_KEY的ActionMessages物件,此時name屬性指定的值無效;

如果為false,則根據name屬性指定的屬性key,從request範圍內檢索ActionMessages物件,如果此時沒有設定name屬性,則預設的屬性key為Globals.ERROR_KEY;

該屬性的預設值為false。 

property 指定從ActionMessages物件中檢索某條訊息的訊息key 

四、進行迴圈遍歷的Logic標籤:

<logic:iterate>是Logic標籤庫中最複雜的標籤,也是應用最廣泛的標籤,它能夠在一個迴圈中遍歷陣列、Collection、Enumeration、Iterator或Map中的所有元素。

1.遍歷集合:

<logic:iterator>標籤的name屬性指定需要進行遍歷的集合物件,它每次從集合中檢索出一個元素,然後把它存放在page範圍內,並以id屬性指定的字串來命名這個元素。

length屬性指定需要遍歷的元素的數目。offset屬性指定開始遍歷的起始位置,預設值為“0”,表示從集合的第一個元素開始遍歷。indexId屬性定義一個代表當前被遍歷元素的序號的變數,這個變數被存放在page範圍內。

2. 遍歷Map:

例:<%

  HashMap months = new HashMap();

  months.put(“Jan.”,”January”);

  months.put(“Feb.”,”February”);

  months.put(“Mar.”,”March”);

  request.setAttribute(“months”,months);

  %>

  <logic:iterate id=”element” indexed=”index” name=”months”>

      <bean:write name=”index” />.

      <bean:write name=”element” property=”key” />:

      <bean:write name=”element” property=”value” /><br />

  </logic:iterate>

3. 設定被遍歷的變數:

可以通過以下方式來設定需要遍歷的變數:

1)設定name屬性,name屬性指定需要遍歷的集合、陣列或Map;

2)設定name屬性和property屬性,name屬性指定一個JavaBean,property屬性指定JavaBean的一個屬性,這個屬性為需要遍歷的集合或Map;

3)設定collection屬性,collection屬性指定一個執行時表示式,表示式的運算結果為需要遍歷的集合或Map;

五、進行請求轉發或重定向的Logic標籤;

1.<logic:forward>標籤:

用於請求轉發,它的name屬性指定轉發目標,與Struts配置檔案中的<global-forwards>元素中的<forward>子元素匹配。

2. <logic:redirect>標籤:

用於請求重定向。它的forward、href和page屬性指定重定向目標,這幾個重要屬性的用法和<html:link>標籤中的屬性用法很相似。

 nested標籤

Struts Nested 標籤庫的一部分標籤用於表達 JavaBean 之間的巢狀關係,還有一部分標籤在特定的級別提供和其他Struts標籤庫的標籤相同的功能。其中最主要的兩個標籤為:"<nested:root>"和"<nested:nest>"。

1.<nested:nest>: 定義一個新的巢狀級別。<nested:nest> 標籤可以表達JavaBean之間的巢狀關係。<html:form action="/showPerson"> < nested:nest property="person"> LastName: < nested:text property="lastName"> < /nested:nest> < /html:form >以上的<nested:nest>標籤的上層JavaBean為與<html:form>表單標籤對應的PersonForm Bean 。<nested:nest>標籤的property屬性為"person" ,代表PersonForm Bean 的person屬性。這個person屬性代表Person Bean , 因此巢狀在<nested:nest> 標籤內部的Nested標籤都相對於這個Person Bean.

2.<nested:root>: 用來顯示的指定頂層級別的JavaBean。 <nest:root> 標籤的name屬性指定JavaBean的名字。巢狀在<nested:root>標籤中的<nested:nest>標籤的property屬性為這個JavaBean的某個屬性。<nested:root name="PersonForm"><nested:nest property="person"><nested:write property="lastName"/></nested:nest></nested:root>以上程式碼中,&lt;nested:root>標籤的name屬性"PersonFrom",代表當前的PersonFormBean。 巢狀其中的<nested:nest>標籤的property屬性為"person",代表PersonForm Bean的person屬性。

 template標籤

由於隨著Tiles框架包的出現,此標籤已經開始減少使用,就不再講解

具體示例

index.jsp

Html程式碼  收藏程式碼
  1. <spanstyle="font-size: large;"><%@ page pageEncoding="UTF-8"%>
  2. <jsp:forwardpage="taglib.do"/>
  3. </span>

 TaglibAction.java

Java程式碼  收藏程式碼
  1. <span style="font-size: large;">package com.javacrazyer.web.action;  
  2. import java.util.ArrayList;  
  3. import java.util.Date;  
  4. import java.util.HashMap;  
  5. import java.util.List;  
  6. import java.util.Map;  
  7. import javax.servlet.http.HttpServletRequest;  
  8. import javax.servlet.http.HttpServletResponse;  
  9. import org.apache.struts.action.Action;  
  10. import org.apache.struts.action.ActionForm;  
  11. import org.apache.struts.action.ActionForward;  
  12. import org.apache.struts.action.ActionMapping;  
  13. import com.javacrazyer.domain.Account;  
  14. /** 
  15.  * 業務控制器:控制業務處理的流程 
  16.  *  
  17.  */
  18. publicclass TaglibAction extends Action {  
  19.     //具體業務流程處理方法,由Struts框架回調
  20.     public ActionForward execute(ActionMapping mapping, ActionForm form,  
  21.             HttpServletRequest request, HttpServletResponse response)  
  22.             throws Exception {  
  23.         request.setAttribute("name""zs");  
  24.         request.setAttribute("money"123.456);  
  25.         request.setAttribute("date"new Date());  
  26.         Account acc = new Account();  
  27.         acc.setLoginname("xkk");  
  28.         acc.setPwd("123456");  
  29.         acc.setStatus(100);  
  30.         Account acc2 = new Account();  
  31.         acc2.setLoginname("kkx");  
  32.         acc2.setPwd("654321");  
  33.         acc2.setStatus(-10);  
  34.         request.setAttribute("account", acc);  
  35.         List<String> strList = new ArrayList<String>();  
  36.         strList.add("xxxxxx");  
  37.         strList.add("yyyyy");  
  38.         strList.add("zzzzzzzzz");  
  39.         request.setAttribute("list", strList);  
  40.         Map<String, Account> accMap = new HashMap<String, Account>();  
  41.         accMap.put("xkk", acc);  
  42.         accMap.put("kkx", acc2);  
  43.         request.setAttribute("accountMap", accMap);  
  44.         return mapping.findForward("result");  
  45.     }  
  46. }</span>  

 result.jsp

Java程式碼  收藏程式碼
  1. <span style="font-size: large;"><%@ page pageEncoding="UTF-8"%>  
  2. <%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %>  
  3. <%@ taglib uri="http://struts.apache.org/tags-bean-el" prefix="bean-el" %>  
  4. <%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>  
  5. <%@ taglib uri="http://struts.apache.org/tags-logic" prefix="logic" %>  
  6. <%@ taglib uri="http://struts.apache.org/tags-logic-el" prefix="logic-el" %>  
  7. <%@ taglib uri="http://struts.apache.org/tags-nested" prefix="nested" %>  
  8. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
  9. <html>  
  10.   <head>  
  11.     <title>Struts自定義標籤庫的使用示例</title>  
  12.   </head>  
  13.   <body>  
  14.     <h3>Struts常用標籤的使用示例</h3><hr/>  
  15.     <li>bean標籤庫的使用</li><br/><br/>  
  16.     name: <bean:write name="name" filter="false" ignore="true"/><br/><br/>  
  17.     money: <bean:write name="money" format="¥#,###.00" ignore="true"/><br/><br/>  
  18.     date: <bean:write name="date" format="yyyy-MM-dd HH:mm:ss" ignore="true"/><br/><br/>  
  19.     Account的loginname屬性: <bean:write name="account" property="loginname" scope="session"  ignore="true" /><br/><br/>  
  20.     Account的pwd屬性: ${account.pwd}  
  21.     <li>html標籤庫的使用</li><br/><br/>  
  22.     <html:messages id="msg">  
  23.         <li><bean:write name="msg"/></li>  
  24.     </html:messages>  
  25.     <html:form action="login.do" method="post">  
  26.         使用者名稱:<html:text property="loginname"/>&nbsp;<html:messages id="msg" property="loginname"><bean:write name="msg"/></html:messages><br/>  
  27.         密碼:<html:password property="pwd" redisplay="false" />&nbsp;<html:messages id="msg" property="pwd"><bean:write name="msg"/></html:messages><br/>  
  28.         <html:submit value="提交"/>  
  29.     </html:form>  
  30.     <li>logic標籤庫的使用</li><br/><br/>  
  31.     <logic:notEmpty name="date">  
  32.         <bean:write name="date" format="yyyy-MM-dd HH:mm:ss"/>  
  33.     </logic:notEmpty><br/>  
  34.         <logic:iterate name="list" id="zs">  
  35.             <bean:write name="zs"/><br/>  
  36.         </logic:iterate>  
  37.     <br/><br/>  
  38.     <logic:notEmpty name="accountMap">  
  39.