有一日,幫外公翻騰出他箱底的照片進行數字化留存,已是耄耋之年的外公端 詳起那些記憶來,看到都是一同革命的熱情小伙,不時感慨:唉!好多人都不在 啦!
1. <s:action .../> 可以用來在 JSP 頁面直接調用 Action,用 name 指定 Action,executeResult(默認為 false) 指定是否包含那個 Action 轉向視 圖的內容;executeResult 會把視圖的所有內容輸出在標簽位置。 ignoreContextParams(默認為 false),是否將本頁的請求參數傳到那個 Action 。
2. <s:bean .../> 用來實例化 JavaBean,標簽內使用 <s:param name="" value=""/> 來指定屬性。在標簽內,bean 實例位於 ValueStack 頂 端,標簽結束則自動清除。如果指定的 id 屬性,還會把該實例放到 Stack Context 中。name 屬性必須,指定 Bean 類的全限名稱。不知道復雜的屬性該如 何用 <s:param .../> 或其他方式來指定。
3. <s:date .../> 用來格式化輸出日期,還可計算指定日期與當前的 時差。name 是必須的,指定要輸出的 Date 類型實例,format 指定格式。如果 指定了 nice(默認為false) 屬性為 true,則輸出指定日期與當前的時差(樣式: 92 days, 9 hours ago),即使指定了 format 屬性也如此。輸出日期時若未指定 format 屬性,則找資源文件中的 struts.date.format,不存在這個 key 就按 DateFormmat.MEDIUM 格式輸出了,Struts1 也是采用一樣的方式。
<% pageContext.setAttribute("now",new Date(107,12,23,13,23,24)); %>
<s:date name="#attr.now" format="yyyy年MM月dd日" nice="false"/>
再試試 <s:date name="#attr.now" format="yyyy年MM月dd日" nice="true"/> 的輸出。
4. <s:include .../> 用來包含一個資源,JSP 或 Servlet 等,用 value 屬性指定。標簽內用 <s:param .../> 指定要向被包含資源傳遞的 參數。
<s:include value="include-file.jsp">
<s:param name="name" value="Unmi"/>
</s:include>
對照<jsp:include page="include-file.jsp?name=Unmi"/> 和 <bean:include id="" page=""/>。想見一下,它們大概都是用 RequestDispatcher.include(request,response) 實現的?
5. <s:param .../> 是服務於外層標簽來指定參數的,如 bean、 include、url 等。<s:url .../> 用來生成一個 URL 地址,value 或 action 屬性來指定 url 地址值,用了 action 會在屬性後自動補上 .action, 並可用 method 來指定 Action 的方法。value 和 action 都未指定就相當於 "#" 了。includeParams 說明是否把當前頁面的參數也包含到這個 url 上。用例 子說明:
假如當前 url 是 http://localhost/TestStruts2/index.jsp?name=unmi,以 下不同寫法的輸出
1) <s:url value="Login.action">
<s:param name="pass">password</s:param>
</s:url>
2) <s:url value="/Login.action" includeParams="none">
<s:param name="pass">中國</s:param>
</s:url>
3) <s:url action="Login" includeContext="false" method="register">
<s:param name="pass">password</s:param>
</s:url>
...1) Login.action?name=unmi&pass=password
...2) /TestStruts2/Login.action?pass=%E4%B8%AD%E5%9B%BD
...3) /Login!register.action?name=unmi&pass=password
其實可能無論 encode 屬性是 true 或 false,都會對參數進行編碼的。對比 Struts1 的 <html:link>。
6. 數據標簽還有 <s:i18n name=""/> 用於指定國際化資源文件的 baseName;<s:text name=""/> 用於輸出國際化信息。
7. 下面要介入 UI 標簽的使用了,但事先不得不提到 Struts2 的主題和模板 。Struts2 所有的 UI 標簽都是基於主題和模板的,主題和模板是 Struts2 所有 UI 標簽的核心。模板是 UI 標簽的外在表現形式。例如,當我們使用 <s:select .../> 標簽時,Struts2 會根據對應 select 模板來生成一個 有模板特色的下位框。如果為所有的 UI 標簽提供了對應的模板,那麼這一系列 的模板就形成了一個主題。
8. 相較而言,Struts1 的 UI 標簽可沒這些東西,因為它們是直接與 HTML 相應元素掛勾的,所有的 UI 標簽的樣式要用 style 或 styleClass 來指定。
9. 因為模板是以主題的形式組織在一起的,所以為了界面的統一,我們應該 選擇特定主題,由主題來負責加責相應的模板,而不是強制要求使用某個模板來 表現一個 UI 標簽。
10. 設置主題的方法按優先級依次為:UI 標簽的 theme 屬性、外圍的 form 標簽的 theme 屬性、從 page/request/session/application 找 "theme" 的屬 性值、配置在 struts.properties 或 struts.xml 中指定的 struts.ui.theme 常量值(默認為 xhtml)。一個原則:表單的主題,設置 form 標簽的 theme;用 戶會話的主題,在 session 中設置 theme 變量;整個應用的主題,就用 struts.ui.theme 常量來實現。