官术网_书友最值得收藏!

4.3 Struts 2常用標簽

Struts 2框架提供了豐富的標簽庫用來構建視圖組件。Struts 2標簽庫簡化了視圖頁面的開發,并且提高了視圖組件的可維護性。

在JSP頁面中使用Struts 2標簽,首先要在JSP頁面中使用標簽庫指令,引入Struts 2的標簽庫,格式如下。

    <%@ taglib uri="/struts-tags" prefix="s"%>

在本節中,只介紹最常用的幾種標簽,對于沒有涉及的標簽,在項目開發中若需要,可以查看Struts 2官方文檔。

4.3.1 Struts 2的通用標簽與應用案例

Struts 2的通用標簽主要有數據訪問、超鏈接等有關標簽,這里介紹最常用的幾種。

1.<s:property>標簽

該標簽用來輸出值棧中的指定對象及屬性的值,通常與OGNL結合使用。如下面的代碼所示。

    <s:property value="#request.name"/>    功能:顯示對象request中的屬性name的值

2.a標簽

該標簽實現超鏈接,例如,下面的語句是超鏈接Action(也可以超鏈接JSP頁面)。

    <s:a href="register.action">注冊</s:a>

3.<s:param>標簽

該標簽主要用于為其他標簽提供參數,格式如下。

    <s:param name="***" value="***"/>

其中,name用于指定需要設置參數的參數名;value用于指定需要設置參數的參數值。

注意:①無論在給出value值時有沒有使用%{}, Struts 2都會對它進行ognl求值。②如果要傳遞String類型的字符串作為參數值,必須用單引號括起來。③可以把value屬性的值寫在開始標簽和結束標簽之間,從而可以傳遞一個EL表達式的值。

4.<s:bean>標簽

該標簽將創建一個JavaBean對象,并把它壓入ContextMap中。在創建JavaBean實例時,可以使用<s:param>標簽為JavaBean實例傳入參數。格式如下。

    <s:bean name="類路徑" var="對象名稱">
      <s:param name="屬性名"value="屬性值"/>  //注意:若為字符串常量必須用單引號括起來
      ……………..
    </s:bean>

其中:name用于指定要實例化的JavaBean的實現類;var用于設置實例名稱。

例如,利用【例4-1】中的Person類,在JSP頁面中創建對象并顯示。其關鍵代碼如下。

    <s:bean name="com.edu.ognl.action.Person" var="s" >
      <s:param name="name" value="'zhangsan'"/>
    </s:bean>
    <s:property value="#s.name"/>

運行該JSP頁面時,顯示結果為zhangsan。

5.<s:set>標簽

set標簽用來在以下Map對象(ContextMap值棧,session、application和request等域對象)中創建一個鍵值對。其中ContextMap值棧為默認對象。其常用屬性如下。

● name:指定新變量的名稱,是必選項。

● scope:指定作用域request、response、session或application。默認值為default。

● value:為新變量賦值,可以是集合值。

(1)創建一個屬性并存儲

如下面的代碼所示。

    <s:set name="age" value="20" scope=" request" />

(2)創建一個對象并賦值

例如,利用【例4-1】中的Person類,在JSP頁面中創建一個Bean對象,然后再賦值給一個變量并顯示該變量的值。其關鍵代碼如下。

    <s:bean name="com.edu.ognl.action.Person" id="s" >
      <s:param name="name" value="'張三'"/>
    </s:bean>
    <s:set name="user" value="#s" scope="request"/>
    scope屬性值為request范圍:<s:property value="#request.user.name" />

運行該頁面時,首先形成對象s(保存在ContextMap子棧內),然后又形成對象user(保存在ContextMap子棧的request對象內),然后顯示對象user的值(name屬性值)。

(3)創建list集合并存儲,在訪問單個元素時,可以按其下標(下標從0開始訪問)。

如下面的代碼所示。

    <s:set name="list" value="{'a', 'b', 'c', 'd'}"></s:set>

(4)創建map集合并存儲

    Map集合的語法格式:#{key:value, key1:value1, key2:value2, .....}

利用該語法,可生成Map類型的集合,該Map對象中的每個key-value對象之間用英文的冒號隔開,多個元素之間用逗號分隔,若是字符串類型,用單引號括起來,如下面的代碼所示。

    <s:set name="map" value="#{'1':'laowang', '2':'老王', '3':'猩猩'}"></s:set

6.url標簽

url標簽用來動態地創建一個URL,其常用屬性如下。

● action:指定一個Action作為URL地址。

● method:指定使用Action的方法。

● var:指定壓入值棧Map的值。

● value:指定生成URL的地址,若缺省,則使用action屬性指定值作為URL地址。

● encode:指定編碼請求方法。

● names:指定名稱空間。

如下面的代碼所示。

    <s:set name="zhangsan1" value="'aaaa'"/>
    <s:set name="zhangsan2" value="'bbbb'"/>
    <s:url action="ognlTest" namespace="/test" var="add">
        <! -- 該格式對應于value,按OGNL解析求值-->
        <s:param name="username1" value="#zhangsan1"/>
      <! -- 單引號括起來,該格式對應于value,不解析,按字符串常量-->
        <s:param name="username2" value="'zhangsan2'"/>
        <s:param name="id">12</s:param>
    </s:url>
    <s:url value="/xyz/input.jsp" var="aaa"></s:url>
    <! --  使用該URL地址  -->
    ${add}<br>
    ${aaa}<br>
    <s:a href="%{add}">測試URL</s:a>

運行后顯示的結果如下(注意輸出格式)。

    /工程名/test/ognlTest.action? username1=aaaa&username2=zhangsan2&id=12
    /工程名/xyz/input.jsp
    測試URL(超鏈接地址)

7.<s:action>標簽

該標簽用于在頁面上執行一個Action,并且還將當前Action對象壓入ContextMap子棧。常用屬性如下。

● var:指定被調用Action的引用,是可選項。

● name:指定Action的名稱,是必選項。

● namespace:指定被調用Action所在的namespace,是可選項。

● executeResult:指定將Action處理結果包含到當前頁面中,默認值為false。

● ignoreContextParams:指定當前頁面的數據是否需要傳給被調用的Action,默認值為false,即默認將頁面中的參數傳給被調用的Action,是可選項。

例如,在【例4-2】中設計并配置的Action,可以在頁面中直接調用執行,語句如下。

    <s:action name="ognlTest" namespace="/test"></s:action>

8.<s:date>標簽

該標簽用于格式化輸出日期。該標簽有以下幾個屬性。

● format:若指定該屬性值(必須是java.text.SimpleDateFormat類中定義的日期/時間格式之一),將根據該屬性指定的格式來格式化日期。

● nice:指定是否輸出指定日期和當前時刻之間的時差。默認為false。

● name:屬性是必選的,指定要格式化的日期值。

● var:指定格式化后的字符串將被放入ContextMap中。

使用格式如下。

    1)按指定日期格式輸出:<s:date name="指定日期取值" format="日期格式"/>
    2)輸出時間差:<s:date name="指定日期取值" nice="true"/>
    3)默認格式輸出:<s:date name="指定日期取值"/>

例如,date標簽的使用(dateTag.jsp)。

    <s:bean name="java.util.Date" var="d">
      <s:param name="date" value="10"></s:param>
    </s:bean>
   (1)nice="false",且指定format="dd/MM/yyyy" <br>
    <s:date name="#d" format="dd/MM/yyyy" nice="false"/><br>
   (2)nice="true",且指定format="dd/MM/yyyy" <br>
    <s:date name="#d" format="dd/MM/yyyy" nice="true"/><br>
   (3)nice="false",沒有指定format屬性,指定了var <br>
    <s:date name="#d" nice="false" var="abc"/>
    ${requestScope.abc}= =<s:property value="#abc"/>

運行結果如下。

   (1)nice="false",且指定format="dd/MM/yyyy"
      10/09/2015
   (2)nice="true",且指定format="dd/MM/yyyy"
      10 days ago
   (3)nice="false",沒有指定format屬性,指定了var
      2015-9-10 20:42:08= =2015-9-10 20:42:08

9.actionerror和actionmessage標簽

actionerror和actionmessage這兩個標簽都是在頁面上輸出Action中方法添加的信息。其中,actionerror標簽輸出的是Action中addActinErrors()方法添加的信息;而actionmessage標簽輸出的是Action中AddActionMessage()方法添加的信息。

例4-4】在Action中,利用addActinErrors()方法添加信息;而在JSP中利用actionerror標簽和actionmessage標簽輸出Action中添加的信息。

1)設計添加信息的Action:ActionErrorActionMessage。

    package com.edu.ognl.action;
    import org.apache.struts2.convention.annotation.*;
    import com.opensymphony.xwork2.ActionSupport;
    @Namespace("/test")
    @ParentPackage("struts-default")
    @Results({ @Result(name = "success", location = "/showErrorActionMessage.jsp") })
    public class ActionErrorActionMessage extends ActionSupport {
        private static final long serialVersionUID = 1L;
        @Action("messageTest")
        public String execute() {
            // 使用addActionError()方法添加信息
            addActionError("使用ActionError添加錯誤信息!");
            addActionMessage("使用ActionMessage添加普通信息!");
            return SUCCESS;
        }
    }

2)設計JSP:showErrorActionMessage.jsp,輸出由Action中AddActionMessage()方法添加的信息。

    <%@page contentType="text/html" import="java.util.*" pageEncoding="UTF-8"%>
    <%@taglib prefix="s" uri="/struts-tags"%>
    <html>
        <head> <title>actionerror標簽和actionmessage標簽的使用</title> </head>
        <body>
          <s:actionerror/>
          <s:actionmessage/>
        </body>
    </html>

3)啟動服務器,在地址欄輸入如下請求。

    http://localhost:8080/c4_ognl_tag/test/messageTest

運行程序,在頁面上將顯示如下信息。

    使用ActionError添加錯誤信息!
    使用ActionMessage添加普通信息!

4.3.2 Struts 2的控制標簽與應用案例

控制標簽主要用來完成流程的控制,如條件分支、循環操作等,也可以實現對集合的排序和合并。

1.if、elseif和else標簽

這3個標簽是用來控制流程的,與Java語言中的if、elseif、else語句相似。在該標簽中,使用test屬性作為測試條件。例如下面的代碼,首先創建一個變量score,并賦值為86,然后利用判定標簽,顯示相應的信息。在這里,顯示“良好”。

    <s:set name="score" value="86"/>
    <s:if test="#score>=90">優秀</s:if>
    <s:elseif test="#score>=80">良好</s:elseif>
    <s:elseif test="#score>=70">中等</s:elseif>
    <s:elseif test="#score>=60">及格</s:elseif>
    <s:else>不及格</s:else>

2.iterator標簽

該標簽用于遍歷集合,可以遍歷一個數組、Collection(List、Set)或Map,并把這個可遍歷對象中的每一個元素依次壓入和彈出ValueStack棧。格式如下。

    <s:iterator value=""  var=""  status="">…</s:iterator>

其中,常用屬性如下。

● value:指定迭代輸出的集合對象,可以是OGNL,或通過Action返回的集合。

● var:指定集合中每個元素的引用變量(可選項)。

● status:指定集合中元素的status屬性(可選項),且該屬性的屬性值如表4-1所示。

表4-1 status屬性的屬性值

1)遍歷訪問List集合,如下面的代碼所示(注意代碼中給出的注釋說明)。

    <! -- 說明:設置set集合(創建list對象并存放到request中),給value賦值;-->
    <! -- 利用value="#request.list" 獲取集合對象,并指定迭代時的IteratorStatus實例,其中
      statu.odd返回當前被迭代元素的索引是否是奇數  -->
    <s:set name="list" value="{'a', 'b', 'c', 'd'}" scope="request">></s:set>
    <s:iterator var="ent" value="#request.list" status="st">
        <font color=<s:if test="#st.odd">red</s:if><s:else>blue</s:else>>
          <s:property value="#ent" />
      </font><br>
    </s:iterator>

2)遍歷訪問Map集合,如下面的代碼所示(注意代碼中給出的注釋說明)。

    <h3>Map集合</h3>
    <! --  說明:Map集合語法格式:#{key:value, key1:value1, key2:value2, .....} 該語法直接生成了一
        個Map類型的集合,該Map對象中的每個key-value對象之間用英文的冒號隔開,多個元
        素之間用逗號分隔。
      首先創建Map對象,然后對Map對象進行遍歷,并顯示其對應的“健”---“值”-->
    <s:set var="map" value="#{'1':'張三', '2':'李四', '3':'王五'}"></s:set>
    遍歷Map:<br />
    <s:iterator value="#map">
        <s:property value="key"/>  --對應于--  <s:property value="value"/><br/>
    </s:iterator>

3)對集合變量進行遍歷訪問。

例如,假設users是User的對象集合,并存儲在session對象內,age(年齡)是User中的一個屬性。

    <h3>遍歷集合</h3>
    <! -- 遍歷出年齡大于30的所有人員 -->
    <s:iterator var="user" value="#session.users">
      <s:if test="%{#user.age>30}">
          <s:property value="#user.age"/>
      </s:if>
    </s:iterator>
    <! --遍歷出年齡大于30的最后一名人員。
      注意,運算符“$”表示取出滿足條件的最后一個值 -->
    <s:iterator var="u" value="#session.users.{$(#this.age>30)}">
        <s:property value="#u.age"/>
    </s:iterator>

4.3.3 Struts 2的表單標簽與應用案例

Struts 2的表單標簽將在HTM文檔里被呈現為一個表單元素。使用Struts 2的表單標簽具有以下優點。

● 可以實現表單回顯,對于修改信息特別方便。

● 對頁面進行自動布局和排版。

●標簽的屬性可以被賦值為一個靜態的值或一個OGNL表達式,如果在賦值時使用了一個OGNL表達式并把它用%{}括起來,這個表達式將會被求值。

Struts 2中的大部分表單標簽和HTML表單元素一一對應,表4-2給出了常用的幾個標簽,表4-3給出了表單標簽的共同屬性。

表4-2 Struts 2常用的表單標簽

表4-3 表單標簽常用的共同屬性

1.form標簽

form標簽用來呈現HTML語言中的表單元素,其主要屬性如表4-4所示。

表4-4 form標簽的主要屬性

在默認情況下,form標簽將被呈現為一個表格形式的HTML表單,嵌套在form標簽里的輸入字段將被呈現為一個表格行,每個表格行由兩個字段組成,一個對應行標,一個對應輸入元素,提交按鈕將被呈現為一個橫跨兩列單元格的行。

2.textfield標簽、password標簽和hidden標簽

● textfield標簽:生成一個單行的文本輸入框。

● password標簽:生成一個密碼域。

● hidden標簽:生成一個隱藏域。

語法格式如下。

    <s:標簽名label="***"name="***"size="***"maxlength="***"/>

其中,label是文本框提示,size是文本框寬度,maxlength是最大字符數。對于password標簽有showPassword屬性,其屬性值是布爾型,默認值為false,決定著在表單回顯時是否顯示輸入的密碼。

3.textarea標簽:生成一個多行文本框

語法格式如下。

    <s:textarea label="***" name="***" cols= "***" rows="***"/>

4.checkbox標簽:復選框標簽

該復選框元素用于提交一個布爾值,如果該框被選中了,它的值將為true。

語法格式如下。

    <s:checkbox label="***" name="***" value="true"/>

5.checkboxlist標簽、select標簽和radio標簽

這3個標簽有3個非常重要的屬性:list、listKey和listValue。

可以將Map、Lits集合類型的對象賦給list屬性;同時可以把用來提供選項值的屬性賦給listKey屬性,把用來提供選項行標的屬性賦給listValue屬性(這兩個屬性相當于Map類型的鍵值對)。

1)checkboxlist標簽:形成多選復選框,如下面的代碼所示。

    <s:checkboxlist label="個人愛好" list="{'學習', '看電影', '編程序'}" name="love"/>

2)select標簽:生成一個下拉列表框,如下面的代碼所示。

    <s:select label="選擇星期" headerValue="---請選擇---" headerKey="1"
          list="{'星期一', '星期二', '星期三', '星期四', '星期五', '星期六', '星期日'}"/>

3)radio標簽:為一個單選框,如下面的代碼所示。

    <s: radio label="性別" list="{'男', '女'}" name="sex"></s: radio>

6.file標簽

用于在頁面上生成一個上傳文件的元素。

語法格式如下。

    <s:file name="***" label ="***"/>

7.標簽的主題

為了讓所有的UI標簽能夠產生同樣的視覺效果而歸集到一起的一組模板,即風格相近的模板被打包成一個主題。

1)主題類型:在Struts 2中給出了以下幾個主題。

● simple:把UI標簽翻譯成最簡單的HTML對應元素,而且會忽視行標屬性。

● xhtml:xhtml是默認的主題,使用一個布局表格提供了一種自動化的排版機制。

● css_xhtml:與xhtml主題里的模板很相似,但它們將使用css來進行布局和排版。

● ajax:以xhtml主題里的模板為基礎,但增加了Ajax功能。

2)修改主題:通常采用以下方法修改主題。

● 通過UI標簽的theme屬性。

● 在表單里,若沒有給出某個UI標簽的theme屬性,它將使用這個表單的主題。

●修改struts.properties文件中的struts.ui.theme屬性。

例4-5】 Struts 2的表單標簽應用示例。利用Struts 2的表單標簽設計下面的JSP頁面(在代碼中給出了相關的注釋),并與如圖4-5所示的運行界面對照,理解各標簽的使用格式與功能。

圖4-5 【例4-5】的運行頁面

1)設計界面:form.jsp,其主要代碼如下。

    <%@ taglib prefix="s" uri="/struts-tags"%>
    <html><head><title>表單設計演示</title></head>
    <body>
        <h3>FORM表單</h3>
        <s:form action="" name="test">
            <s:textfield label="用戶名" name="uname"/>
            <s:password label="密碼" name="upass"/>
            <s:file name="file" label="上傳文件"/>
            <s:hidden name="id" value="1"/>
          <! --  基于Map類型,設計列表框 -->
            <s:select list="#{'1':'博士', '2':'碩士'}" name="edu" label="學歷"
                listKey="key" listValue="value"></s:select>
          <! --  基于集合類型,設計列表框,其中,value值設置為默認選中項  -->
            <s:select  label="lanuage"list="{'java', '.net', ''}"value="{'.net'}"></s:select>
            <! --單選復選框的設計,必須有name -->
            <s:checkbox label="愛好 "name="checkboxFiled1"value="true"></s:checkbox>
            <! -- 基于數組類型實現多個checkbox,并指定默認選中項 -->
            <s:checkboxlist list="{'java', 'css', 'html', 'struts2'}" label="喜歡的編程語言1"
                  name="box" value="{'css', 'struts2'}"></s:checkboxlist>
            <! --  基于Map集合實現多選復選框,注意:前要加#,并指定默認選中項-->
            <s:checkboxlist
                  list="#{1:'java',2:'css',3:'html',4:'struts2',5:'spring'}"
                  label="喜歡的編程語言2" name="boxs" value="{1,2}"></s:checkboxlist>
            <! --radio標簽的使用,并模擬從后臺傳進選中的默認值 -->
            <%  //從服務器傳過來的值用于設置單選按鈕的默認值
                request.setAttribute("sex", "男");
                session.setAttribute("sex1", "1"); %>
            <s:radio label="性別1" list="{'男', '女'}" name="sex1" value="#request.sex"/>
            <s:radio label="性別2" list="#{'1':'男', '2':'女'}" name="sex2" listKey="key"
                listValue="value" value="#session.sex1"></s:radio>
            <! --  textarea標簽的使用  -->
            <s:textarea name="rmake" cols="40" rows="5" label="備注"/>
            <! -- 防止表單重復提交的方式 -->
            <s:token></s:token>
            <s:submit value="提交"></s:submit>
        </s:form>
    </body>
    </html>

2)運行界面如圖4-5所示。

主站蜘蛛池模板: 剑河县| 玉溪市| 兰西县| 和林格尔县| 河津市| 高陵县| 山丹县| 乌拉特后旗| 镇赉县| 耿马| 靖江市| 桦南县| 富锦市| 屯门区| 西充县| 桃江县| 定陶县| 金秀| 双江| 新丰县| 绥化市| 宁陕县| 淳安县| 平定县| 怀远县| 金乡县| 灯塔市| 渝中区| 全椒县| 遂宁市| 馆陶县| 上蔡县| 唐山市| 莱阳市| 项城市| 那曲县| 嫩江县| 依兰县| 梁河县| 南通市| 江北区|