隨筆-17  評論-64  文章-79  trackbacks-1
          JSP Struts HTML 標簽庫詳解
          Struts 提供了五個標簽庫,即: HTML Bean Logic Template Nested
          ?標簽庫
          ?說明
          ?HTML 標簽
          ?用來創建能夠和Struts 框架和其他相應的HTML 標簽交互的HTML 輸入表單
          ?Bean 標簽
          ?在訪問JavaBeans 及其屬性,以及定義一個新的bean 時使用
          ?Logic 標簽
          ?管理條件產生的輸出和對象集產生的循環
          ?Template 標簽
          ?隨著Tiles框架包的出現,此標記已開始減少使用
          ?Nested 標簽
          ?增強對其他的Struts 標簽的嵌套使用的能力
          ?
          標簽的公共特征
          ?
          使用固定屬性名稱的 Struts 標簽:
          ?屬性
          ?說明
          ?id
          ?命名自定義標簽創建時的腳本變量名。
          ?name
          ?指出關鍵字值,在該關鍵字下可以找到一個存在的bean 。如果給出了scope屬性,則僅僅在scope中查找。否則,根據標準的順序在各種scope中查找:(page, request, session, or application)
          ?property
          ?指出bean 中的某個屬性,可以在其中檢索值。如果沒有標明,則使用對象本身的值。
          ?scope
          ?定義了Bean在哪個范圍(page, request, session, or application)中被查找。如果沒有標明按順序查找。腳本變量(id)將在相同的范圍中創建。
          ?
          Struts 標簽也支持嵌套引用,例如:
          Property="foo.bar.baz"

          這相當于進行下面的調用:
          getFoo().getBar().getBaz()


          或者做為 setter
          getFoo().getBar().setBaz(value)
          ?
          雖然 Struts 標簽的設計原意是為了避免使用 scriptlet scriptlet 的表達式還能夠提供給所有的 Struts 標簽使用。但請確保使用完整的表達式 :
          ?錯誤:
          ?<html:link href="'<%= "/" + name %>/index.jsp>'>
          ?
          ?
          正確:
          ?<html:link href="'<%= "/" + name + "/index.jsp" %>'>??? //
          表達式必須提供整個屬性值
          ?
          ?
          Html 標簽庫
          1.??????? <html> 標簽
          它有兩個屬性: locale xhtml ,兩者都不是必需的。
          ?<html:html?locale=\"true\">

          ?
          此行代碼解析后:
          ?<html?lang=\"en\">
          2.??????? 說明:生成的結果取決于 Struts 應用程序所位于的服務器的 locale 。如果你將應用程序部署到一個不同 locale 的服務器,你不需要改變代碼, Locale 會自動調整。
          3.??????? <base> 標簽:表示所包含頁面的絕對位置。這個標簽只有內嵌在 head 標簽中才有效。
          ?<html:base/>

          ?
          此行代碼解析后:
          ?<base?href=\"http://www.mymain.com/myStrutsApp/testing.jsp\">
          4.??????? <img> 標簽
          最重要的屬性 page :圖象文件的路徑,前面必須帶有一個斜線。
          其它屬性: heignt width alt
          ??<html:img?page=\"/logo.gif\"?height=\"50\"? width=\"200\"?alt=\"Web?Logo\"/>
          5.??????? <link> 標簽
          ?<html:link?page=\"/index.html\">Click?demo</html:link>

          ?
          此行代碼解析后:
          ??<a?href=\"/index.html\">Click?demo</a>
          6.??????? <errors> 標簽:通過一個簡單的 <html:errors/> 標簽,你就可以在一個 JSP 頁面上顯示完全自定義的錯誤信息。功能超強大!!
          說明:這個標簽在 Request 對象的屬性集合中查找 reserved?key 。如果它找到一個 reserved?key ,它就假設這個 key 是一個 String 、或是一個 String 數組 ??
          ????? ?
          (它包含在模塊的 MessageResources 中查找的 message?keys )、或是類型為 org.apache.struts.action.ActionErrors 的一個對象。
          ???????? ?
          如果在應用程序資源中存在相應的信息,那么就可以用下面這些可選的 message?keys ??
          ??????? ?·?errors.header??or? errors.prefix
          :相應的信息在錯誤信息的單獨列表前顯示。 ?
          ??????? ?·?errors.footer or? errors.suffix
          :相應的信息在錯誤信息的單獨列表后顯示。
          7.??????? <form> 標簽系列
          使用 <form> 標簽時必須遵循一些規則:
          1.?????? 標簽中必須包含一個 action 屬性,它是這個標簽中唯一必需的屬性。如果不具備該屬性則 JSP 頁面會拋出一個異常。之后你必須給這個 action 屬性指定一個有效值。一個有效值是指應用程序的 Struts 配置文件中元素里的任何一個子元素的訪問路徑。而且相應的元素中必須有一個 name 屬性,它的值是 form?bean 的名稱。
          ?<html:form?action=\"/login\"?>?

          ?
          如果你有上述一個標簽?,那么你的Struts配置文件的元素中必須有一個如下顯示為粗體的元素:?
          <action-mappings>?
          ?????<action?path=\"/login\"?
          ??????type=\"com.javapro.struts.LoginAction\"??
          ??????name=\"loginForm\"
          ??????scope=\"request\"
          ??????input=\"/login.jsp\">
          ??????<forward?name=\"success\"?path=\"/mainMenu.jsp\"/>
          ????</action>
          ????.
          ????.
          ????.
          </action-mappings>? //
          這就是說一個form標簽是和form?bean相關聯的。
          2.?????? ?
          3.?????? 任何包含在 <form> 中用來接收用戶輸入的標簽( <text> <password> <hidden> <textarea> <radio> <checkbox> <select> )必須在相關的 form?bean 中有一個指定的屬性值。比如,如果你有一個屬性值被指定為 “username” <text> 標簽,那么相關的 form?bean 中也必須有一個名為 “username” 的屬性。輸入 <text> 標簽中的值會被用于生成 form?bean userName 屬性。

          <form>
          標簽還有一些不是必須但很有用的 次要 屬性。
          比如,你可以用 focus 屬性來生成 JavaScript ,它會 定焦 focus )到該 form 所包含的一個元素上。使用 focus 屬性時你需要給它指定元素的名稱。
          ?<body>
          ?<html:form?action=\"/login\"?focus=\"password\">
          ?User?Name:?<html:text?property=\"userName\"/>
          ?<br>Password:?<html:text?property=\"password\"/>
          ?<br><html:submit/>
          ?</html:form>
          ?</body>

          ?
          代碼解析后:
          ?<body>
          ?<form?name=\"loginForm\"?method=\"post\"? action=\"/myStrutsApp/login.do\">
          ?User?Name:?<input?type=\"text\"?name=\"userName\"? value=\"\">
          ?<br>Password:?<input?type=\"text\"? name=\"password\"?value=\"\">
          ?<br><input?type=\"submit\"? ?value=\"Submit\">
          ?</form>
          ?<script?language=\"JavaScript\"? type=\"text/javascript\">
          ??<!--
          ? if?(document.forms[\"loginForm\"].elements[\"password\"].type?!=?\"hidden\")?
          ?????? document.forms[\"loginForm\"].elements[\"password\"].focus()
          ??//?-->
          ?</script>

          ?</body>
          有沒有看到這個標簽庫是如何建立 JavaScript 來定焦到 password 元素上的 ?? 這也是該庫讓人著迷的地方之一。你不用擔心如何在客戶端進行編程,它會幫你自動生成。
          還可以看到, <form> 標簽中 method 屬性的缺省值是 POST

          <text>
          標簽、 <hidden> 標簽、 <textarea> 標簽、 <radio> 標簽、 <checkbox> 標簽、 <submit> 標簽、 <reset> 標簽:
          都有一個 property 屬性,最后會被轉換成 HTML 中的 name 屬性,當然還有 name value 屬性。

          <password>
          標簽
          ??<html:password?property=\"password\"??redisplay=\"false\"/>
          該標簽中的一個很重要的屬性是 "redisplay" ,它用于重新顯示以前輸入到這個區域中的值。該屬性的缺省值為 true 。然而,為了使 password 不能被重新顯示,你或許希望將該屬性的值設為 false

          <select>
          標簽和 <option> 標簽: ?
          ?<html:select?property=\"color\"?size=\"3\">
          ??<html:option?value=\"r\">red</html:option>
          ??<html:option?value=?\"g\">green</html:option>
          ??<html:option?value=?\"b\">blue</html:option>
          ?</html:select>
          遺補 1.)<html:link> 標簽
          forward 屬性:鏈接到一個 global forward 上; action 屬性:鏈接到一個 action mapping 上;
          href
          屬性:這個鏈接會轉發給控制器,由控制器做決定; page 屬性:一個相對的鏈接。

          page 屬性鏈接到 action 上:
          ??<html:link page="/html-link.do">
          ?? Linking with the page attribute.
          ?</html:link>

          注意,上面的代碼中你不必指定 web 的關聯。相反的,如果你使用 href 屬性,你就必須像下面所示指出 web 的關聯 ( 這里的關聯就是 struts-exercise)
          ?<html:link href="/struts-exercise-taglib/html-link.do">
          ?? Using Href
          ?</html:link>

          很明顯,當你在相同的 web 應用程序中做鏈接是,它比 page 屬性更加好。你也能用 href 在不同的服務器上創建鏈接:
          ?<html:link href="http://otherserver/strutsTut/html-link.do">
          ? Using Href
          ?</html:link>

          另一種鏈接到 html-link.do 的方法是用 action 屬性:
          ?<html:link action="/html-link">
          ? Using Action attribute
          ?</html:link>

          你也可以以硬編碼的方式使用參數:
          ?<html:link page="/htmllink.do?doubleProp=3.3&amp;longProp=32">
          ?? Double and long via hard coded changes
          ?</html:link>

          或者使用 paramId, paramName, and paramProperty 屬性:
          ?<html:link page="/html-link.do" paramId="booleanProperty" paramName="testbean"
          ?? paramProperty="nested.booleanProperty">
          ?? Boolean via paramId, paramName, and paramValue
          </html:link>

          解析后的代碼:
          ?<a href="/struts-exercise-taglib/html-link.do?booleanProperty=false">
          ??? Boolean via paramId, paramName, and paramValue
          ?</a>

          另外,還能使用帶 name 屬性的 Map 來實現傳遞多個參數:
          ?<%
          java.util.HashMap newValues = new java.util.HashMap();
          newValues.put("floatProperty", new Float(444.0));
          newValues.put("intProperty", new Integer(555));
          newValues.put("stringArray", new String[]
          { "Value 1", "Value 2", "Value 3" });
          pageContext.setAttribute("newValues", newValues);
          %>
          ...
          ?<html:link action="/html-link" name="newValues">
          ??? Float, int, and stringArray via name (Map)
          ?</html:link>

          你也能夠鏈接到 Map 類型的 action 上,上面的代碼解析后的結果:
          ?<html:messages property="property2" message="true" id="msg" header="messages.header" footer="messages.footer">
          ?<tr><td><%= pageContext.getAttribute("msg") %></td></tr>
          ?</html:messages>
          2.) select option 標簽
          <html:select>
          的屬性: property -與 ActionForm 中的某個屬性對應; size -顯示 option 的數目; multiple -默認為 fales ,表示不能多選,當設定為 true 時, property 對應的 ActionForm 的屬性必須為數組。
          <html:select property="name" size=6 multiple="true">
          <html:option>
          的屬性: key local bundle -指定 Resource Bundle 中的內容。
          例如 <html:option value="color1">Orange</html:option>
          <html:option value="color1" bundle="htmlselect.Colors" key="htmlselect.red"/>
          它和配置文件中的 <message-resources> 元素的 key 屬性匹配 --> <message-resource parmeter="HtmlSelectColors" key="htmlselect.Colors"/>
          <message-resource>
          中配置的資源文件為 HtmlSelectColors.properties ,相關內容為 htmlselect.red=RED
          <html:options>
          標簽,提供了一組 <option> 元素,在 <html:select> 元素中可以包含多個 <html:options> 元素。非常靈活,可以取得集合或數組中的值。
          1 <html:options collection="coll" property="value" labelProperty="label" /> 這指在 coll 的集合中存放了 options value 指實際能被提交的值, label 是顯示給用戶的值。
          2 <html:options property="value" labelProperty="label" /> collection 屬性不被指定時,將使用表單相關的 form bean form bean value 屬性存放 option value label 屬性值顯示給用戶。
          3 <html:options name="valueBean" property="values" labelName="labelsBean" labelProperty="labels" /> 這個意思是 value 值存放在名為 valueBean bean vlaues 屬性中,它是一個 collection label 值也是同樣的意思。
          <html:optionsCollection>
          標簽,和 <html:options> 的用法很相似。
          例如 <html:select property="custId"><html:optionsCollection property="customers" label="name" value="custId" /></html:select>
          這個標簽和 org.apache.structs.util.LabelValueBean 結合的很好,如果把 label value 都放到這個對象中,可以很簡單的這樣應用:
          <html:select property="custId"><html:optionsCollection property="customers" /></html:select>
          ?
          ?
          JSP Struts Bean 標簽庫詳解
          Bean 標簽庫
          ??????? 此標簽庫和 Java Bean 有很強的關聯性,設計的本意是要在 JSP JavaBean 之間提供一個接口。 Struts 提供了一套小巧有用的標簽庫來操縱 JavaBean 和相關的對象: cookie ?header ?parameter ?define write message ?include page resource size struts
          1.??????? bean:cookie bean:header bean:parameter
          這三個標簽用來重新得到 cookie, request header request parameter
          bean:header
          bean:parameter 標簽定義了一個字符串; bean:cookie 標簽定義了一個 Cookie 對象。你可以使用 value 屬性做為默認值。如果找不到指定的值,且默認值沒有設定的話,會拋出一個 request time 異常。如果你期望返回多個值的話,可把 multiple 屬性設為 true
          ?<bean:cookie id="sessionID" name="JSESSIONID" value="JSESSIONID-ISUNDEFINED"/>
          ?//
          這段代碼定義了一個名為 sessionID 的腳本變量,如果找不到一個名為 JSESSIONID cookie ,那 sessionID
          ?//
          的值就被設置為 JSESSIONID-ISUNDEFINED
          2.???????
          下面代碼會輸出一些 Cookie 對象的一些屬性:
          ?<jsp:getProperty name="sessionID " property="comment"/> …
          ?<jsp:getProperty name="sessionID" property="domain"/> …
          ?<jsp:getProperty name="sessionID" property="maxAge"/> …
          ?<jsp:getProperty name="sessionID" property="path"/> …
          ?<jsp:getProperty name="sessionID" property="value"/> …
          ?<jsp:getProperty name="sessionID" property="version"/> …
          3.???????
          下面是在 request 中輸出所有 header 的例子:?
          ?<%
          ??????? java.util.Enumeration names =((HttpServletRequest) request).getHeaderNames();
          %>

          <%
          ??????? while (names.hasMoreElements()) {
          ??????? String name = (String) names.nextElement();
          %>
          <bean:header id="head" name="<%= name %>"/>
          … <%= name %>
          … <%= head %>

          <%
          ??????? }
          %>
          4.???????
          下面是 parameter 的例子:
          ?<bean:parameter id="param1" name="param1"/>
          ?<bean:parameter id="param2" name="param2" multiple="true"/>? //
          此處定義了一個 param2[]
          ?<bean:parameter id="param3" name="param3" value="UNKNOWN VALUE"/>
          5.???????
          于其它標簽結合使用:
          ?<bean:header id="browser" name="User-Agent"/>
          <P>You are viewing this page with: <bean:write name="browser"/></P>
          ----------------------------------------------------------------------------------------------------------------------------------
          <bean:cookie id="username" name="UserName" scope="session"
          value="New User" />
          <P>Welcome <bean:write name="username" property="value"/!</P>?
          ? //
          根據 cookie 創建一個新的 Bean ,如果用戶名稱已經存儲在 cookie 中,它就不顯示為一個新用戶。?
          6.??????? ?
          7.??????? bean:define :有三個用途。
          一是定義新字符串常量:
          ?<bean:define id="foo" value="This is a new String"/>
          ?<bean:define id="bar" value='<%= "Hello, " + user.getName() %>'/>
          ?<bean:define id="last" scope="session" value='<%= request.getRequestURI() %>'/>
          8.???????
          二是復制一個現有的 bean 給新的 bean
          ?<bean:define id="foo" name="bar"/>???
          ?<bean:define id="baz" name="bop" type="com.mycompany.MyClass"/>? //
          定義腳本變量的類型,默認為Object
          9.???????
          三是復制一個現有的 bean 的屬性給新的 bean
          ?<bean:define id="bop" name="user" property="role[3].name"/>
          ??<bean:define id="foo" name="bar" property="baz" scope="request"? toScope="session"/>?
          ??//toScope
          屬性指新 bean scope ,默認為 page???
          10.???? 上段代碼的意思是把名為 bar bean baz 屬性賦值給 foo foo 的類型為 String( 默認 )
          11.???? bean:include
          這個標簽和 bean:include 標簽和相似,不同點就是它定義了一個可以復用的腳本變量。用 id 屬性命名一個新的腳本變量,還支持 forward href page transaction. 屬性,和 html:link 中的屬性意義一樣。
          ?<bean:include id="footerSpacer"? page="/long/path/footerSpacer.jsp"/>?
          ?
          然后你能夠在多個地方 (scope page) 調用:
          ?<bean:write name="footerSpacer" />
          12.???? ?
          13.???? bean:message
          用來實現對國際化的支持的一個標簽,配合 java.util 數據包中定義的 Locale ResourceBundle 類來完成這個任務,用 java.text.MessageFormat 類配置消息的格式。
          ???
          首先要指定資源文件的名稱。這個文件會包含用默認語言編寫的在程序中會出現的所有消息,這些消息以 關鍵字 - 的形式存儲。文件需要存儲在類路徑下,路徑要作為初始化參數傳送給 ActionServlet
          ???
          實現國際化的規定:所有的資源文件必須都存儲在基本資源文件所在的目錄中。基本資源文件包含的是用默認地區語言 - 本地語言編寫的消息。如果基本資源文件的名稱是 ApplicationResources.properties ,那么用其他特定語言編寫的資源文件的名稱就應該是 ApplicationResources_xx.properties(xx ISO 編碼,如英語是 en) 。因此這些文件應包含相同的關鍵字,但關鍵字的值是用特定語言編寫的。
          ???
          然后, ActionServlet 的區域初始化參數必須與一個 true 值一起傳送,這樣 ActionServlet 就會在用戶會話中的 Action.LOCALE_KEY 關鍵字下存儲一個特定用戶計算機的區域對象。現在可以運行一個國際化的 web 站點,它可以根據用戶計算機上的設置的區域自動以相應的語言顯示。

          使用特定的字符串來替換部分消息:
          ?在資源文件中的定義:info.myKey = The numbers entered are {0},{1},{2},{3}
          ?
          標記的使用:<bean:message key="info.myKey" arg0="5" arg1="6" arg2="7" arg3="8"/>
          ?Jsp
          頁面的顯示:The numbers entered are 5,6,7,8? // 最多支持4個參數
          14.???? ?
          15.???? bean:page :把 Jsp 中的內部對象做為腳本變量。
          <bean:page id="requestObj" property="request"/>?
          16.???? ?
          17.???? bean:resource :獲得應用程序的資源,這個資源可以是一個 String 或從 java.io.InputStream 中讀入。使用 ServletContext.getResource()ServletContext.getResourceAsStream() 方法檢索 web 應用中的資源,如果在檢索資源時發生問題,就會產生一個 ruquest time 異常。?
          ?<bean:resource id="webxml" name="/WEB-INF/web.xml"/>
          18.???? 使用 input 屬性時,資源會做為一個 InputStream ,如果不指定就被當成一個 String
          19.???? bean:size :得到存儲在 array collection map 中的數目,類型為 java.lang.Integer
          ?<bean:size id="count" name="employees" />
          20.???? ?
          21.???? bean:struts :復制 Struct 對象 ( 三種類型 ) 給新的 bean scope page
          ?<bean:struts id="form" formBean="CustomerForm"/>???
          ?<bean:struts id="fwd" forward="success"/>
          ?<bean:struts id="map" mapping="/saveCustomer"/>
          22.???? ?
          23.???? bean:write :以字符串形式輸出 bean 的屬性值。
          filter
          屬性:設為 true 時,將 HTML 保留字轉換為實體 ("<" 轉換為 &lt);
          ignore
          屬性:如果對象不存在,不會拋出異常。
          ?<bean:write name="userRegistration" property="email" scope="request"/>
          posted on 2007-03-22 22:34 飛鳥 閱讀(590) 評論(0)  編輯  收藏 所屬分類: Struts
          主站蜘蛛池模板: 胶南市| 贞丰县| 武汉市| 临高县| 曲麻莱县| 错那县| 佳木斯市| 贺州市| 武胜县| 大同市| 荆门市| 潢川县| 原阳县| 乌拉特前旗| 阿尔山市| 潞城市| 通化市| 彩票| 桐梓县| 安达市| 突泉县| 龙州县| 固安县| 临湘市| 台北市| 河南省| 赤水市| 灵石县| 自治县| 温州市| 会理县| 永年县| 黄浦区| 商丘市| 修文县| 舟曲县| 德钦县| 扶风县| 北海市| 黎平县| 定边县|