1. 前言
Apache的Struts2已經是很流行的MVC Web架構了,很多Web開發人員都是使用它做為Web架構。它是在 struts 和WebWork的技術基礎上進行了合并,全新的Struts 2架構。其全新的Struts 2的體系結構與Struts 1的體系結構的差别巨大。Struts 2以WebWork為核心,采用攔截器的機制來處理使用者的請求,這樣的設計也使得業務邏輯控制器能夠與Servlet API完全脫離開,是以Struts 2可以了解為WebWork的更新産品。因為Struts 2和Struts 1有着太大的變化,但是相對于WebWork,Struts 2隻有很小的變化。像Struts2的常用配置功能筆者就不在說了,在此結合作者的Web相關技術(Struts2、JSTL、EL……)使用經驗做個總結,希望與您有個共鳴。
2. 判斷标簽<s:if>
當在request域裡面的對象需要判斷的時候,可以選用<s:if>,當然Struts2的所有标簽都必須在一個Action轉向後才能使用的,直接通路一個JSP就使用Struts2的标簽,報錯。
例如:
<s:if test="%{#session.customer==null}"> <A class=buy-btn href="#" title="登入才能搶購">搶購</A> </s:if> <s:if test="%{#session.customer!=null}"> <A class=buy-btn href="proAction!buyProductBefor.action?products.id=${products.id}" title="登入才能搶購">搶購</A> </s:if> |
3. 在頁面中通路變量(#、%、$)
OGNL是通常要結合Struts 2的标志一起使用。主要是#、%和$這三個符号的使用。
一般使用JSP内置對象域的變量的時候(application、session、request、parameters)都需要使用Struts标簽+#來進行通路,一般用于通路Session裡面的變量。
例如:
<s:if test="%{#session.customer!=null}"> |
或者
<s:property value="%{#application.myApplicationAttribute}" /> <s:property value="%{#session.mySessionAttribute}" /> <s:property value="%{#request.myRequestAttribute}" /> <s:property value="%{#parameters.myParameter}" /> |
在Struts2标簽中通路内置對象的變量的時候前面得用%{}将變量括起來。
如果在Action中被注入的對象在ValueStack域中的時候,在頁面中可以直接采用el表達式來通路變量。
例如:
<TD><STRONG class=original>${products.sourcePrice}</STRONG></TD> |
如果變量顯示的在Action中直接指派(set)給了request、session域中後,在頁面也可以直接使用el表達式來進行通路,但是這裡僅僅隻是顯示,并不能在Struts2标簽中判斷、計算等。代碼如下。
你好,${session.customer.name}! |
一般Struts2标簽要配合OGNL表達式一齊使用,包括一些運算、判斷、取子字元串等等。在此引用别人部落格(http://www.iteye.com/problems/51144)上的一段話
“#”主要有三種用途: 1.通路OGNL上下文和Action上下文,#相當于ActionContext.getContext();下表有幾個ActionContext中有用的屬性: 名稱 作用 例子 parameters:包含目前HTTP請求參數的Map #parameters.id[0]作用相當于request.getParameter("id") Request:包含目前HttpServletRequest的屬性(attribute)的Map #request.userName相當于request.getAttribute("userName") Session:包含目前HttpSession的屬性(attribute)的Map #session.userName相當于session.getAttribute("userName") Application:包含目前應用的ServletContext的屬性(attribute)的Map #application.userName相當于application.getAttribute("userName") Attr:用于按request > session > application順序通路其屬性(attribute) #attr.userName相當于按順序在以上三個範圍(scope)内讀取userName屬性,直到找到為止 2.用于過濾和投影(projecting)集合,如books.{?#this.price<100}; 3.構造Map,如#{'foo1':'bar1', 'foo2':'bar2'}。 “%”符号的用途是在标志的屬性為字元串類型時,計算OGNL表達式的值。 “$”有兩個主要的用途,用于在國際化資源檔案中,引用OGNL表達式。在Struts 2配置檔案中,引用OGNL表達式。 |
4. JSTL格式化數字
一般用到整數、小數格式化的時候可以直接用JSTL來處理。
使用jstl的fmt标簽可以對頁面的值進行格式化、國際化顯示等功能。
引入标簽:<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
保留整數,小數後一位永遠是0
<fmt:formatNumber value="${(products.nowPrice/products.sourcePrice)*10}" pattern="#.0" />折 </STRONG> |
保留兩位小數
<!--保留2位小數點,格式化數字--> <STRONG>£¤<fmt:formatNumber value="${products.sourcePrice-products.nowPrice}" pattern="#.##" minFractionDigits="2" /></STRONG> |
讀取資源檔案
<fmt:message key="global.add" /> |
5. Struts2日期标簽格式化日期
代碼如下
<TD class=order-num> <s:date name="#orderProductListVar.orders.orderDate" format="yyyy-MM-dd HH:mm:ss" /> </TD> |
顯示出來得值就是2011-01-10 21:09:26
6. 利用Struts2錯誤标簽顯示Action中顯示發生的錯誤
<s:fielderror> <s:param>errorMessage</s:param> </s:fielderror> |
其中errorMessage是Action中錯誤域中的key。
7. 利用Struts2标簽得到字元串長度和截取子字元串
<!--判斷字元串長度--> <s:if test="%{#productsListVar.productMess.length()>=40}"> <s:property value="#productsListVar.productMess.substring(0,40)" />... </s:if> <s:else> <s:property value="#productsListVar.productMess" /> </s:else> |