天天看點

Struts2+Web常使用的功能經驗筆記第1季--1

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>