(五)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 輸入表單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&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&myArray=str1&myArray=str2&myArray=str3”>將多個變數作為請求引數傳遞</html:link>
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>以上程式碼中,<nested:root>標籤的name屬性"PersonFrom",代表當前的PersonFormBean。 巢狀其中的<nested:nest>標籤的property屬性為"person",代表PersonForm Bean的person屬性。
template標籤
由於隨著Tiles框架包的出現,此標籤已經開始減少使用,就不再講解
具體示例
index.jsp
Html程式碼- <spanstyle="font-size: large;"><%@ page pageEncoding="UTF-8"%>
- <jsp:forwardpage="taglib.do"/>
- </span>
TaglibAction.java
Java程式碼- <span style="font-size: large;">package com.javacrazyer.web.action;
- import java.util.ArrayList;
- import java.util.Date;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import org.apache.struts.action.Action;
- import org.apache.struts.action.ActionForm;
- import org.apache.struts.action.ActionForward;
- import org.apache.struts.action.ActionMapping;
- import com.javacrazyer.domain.Account;
- /**
- * 業務控制器:控制業務處理的流程
- *
- */
- publicclass TaglibAction extends Action {
- //具體業務流程處理方法,由Struts框架回調
- public ActionForward execute(ActionMapping mapping, ActionForm form,
- HttpServletRequest request, HttpServletResponse response)
- throws Exception {
- request.setAttribute("name", "zs");
- request.setAttribute("money", 123.456);
- request.setAttribute("date", new Date());
- Account acc = new Account();
- acc.setLoginname("xkk");
- acc.setPwd("123456");
- acc.setStatus(100);
- Account acc2 = new Account();
- acc2.setLoginname("kkx");
- acc2.setPwd("654321");
- acc2.setStatus(-10);
- request.setAttribute("account", acc);
- List<String> strList = new ArrayList<String>();
- strList.add("xxxxxx");
- strList.add("yyyyy");
- strList.add("zzzzzzzzz");
- request.setAttribute("list", strList);
- Map<String, Account> accMap = new HashMap<String, Account>();
- accMap.put("xkk", acc);
- accMap.put("kkx", acc2);
- request.setAttribute("accountMap", accMap);
- return mapping.findForward("result");
- }
- }</span>
result.jsp
Java程式碼- <span style="font-size: large;"><%@ page pageEncoding="UTF-8"%>
- <%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %>
- <%@ taglib uri="http://struts.apache.org/tags-bean-el" prefix="bean-el" %>
- <%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
- <%@ taglib uri="http://struts.apache.org/tags-logic" prefix="logic" %>
- <%@ taglib uri="http://struts.apache.org/tags-logic-el" prefix="logic-el" %>
- <%@ taglib uri="http://struts.apache.org/tags-nested" prefix="nested" %>
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <html>
- <head>
- <title>Struts自定義標籤庫的使用示例</title>
- </head>
- <body>
- <h3>Struts常用標籤的使用示例</h3><hr/>
- <li>bean標籤庫的使用</li><br/><br/>
- name: <bean:write name="name" filter="false" ignore="true"/><br/><br/>
- money: <bean:write name="money" format="¥#,###.00" ignore="true"/><br/><br/>
- date: <bean:write name="date" format="yyyy-MM-dd HH:mm:ss" ignore="true"/><br/><br/>
- Account的loginname屬性: <bean:write name="account" property="loginname" scope="session" ignore="true" /><br/><br/>
- Account的pwd屬性: ${account.pwd}
- <li>html標籤庫的使用</li><br/><br/>
- <html:messages id="msg">
- <li><bean:write name="msg"/></li>
- </html:messages>
- <html:form action="login.do" method="post">
- 使用者名稱:<html:text property="loginname"/> <html:messages id="msg" property="loginname"><bean:write name="msg"/></html:messages><br/>
- 密碼:<html:password property="pwd" redisplay="false" /> <html:messages id="msg" property="pwd"><bean:write name="msg"/></html:messages><br/>
- <html:submit value="提交"/>
- </html:form>
- <li>logic標籤庫的使用</li><br/><br/>
- <logic:notEmpty name="date">
- <bean:write name="date" format="yyyy-MM-dd HH:mm:ss"/>
- </logic:notEmpty><br/>
- <logic:iterate name="list" id="zs">
- <bean:write name="zs"/><br/>
- </logic:iterate>
- <br/><br/>
- <logic:notEmpty name="accountMap">