天天看點

Struts 2雜談(2):如何向标簽檔案中的Struts 2标簽傳遞參數值

本文為原創,如需轉載,請注明作者和出處,謝謝!

    标簽檔案是JSP自定義标簽中的一種,實作的方法在WEB-INF/tags目錄或子目錄中建立一個.tag檔案,如table.tag,并通過taglib指令來引用.tag檔案所在的目錄,代碼如下:

<%@ taglib prefix="t" tagdir="/WEB-INF/tags"%>

    如果在标簽檔案中使用Struts 2标簽,就會帶來一個問題。下面先看一個例子。

    在WEB-INF/tags目錄中建立一個table.tag檔案,代碼如下:

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

<%@ attribute name="index" type="java.lang.String" required="true" %>

<table border="1" style="font-size:25px">   

    <s:iterator var="row" value="${index}">

        <tr>

            <s:iterator var="cell" value="row"> 

                <td> 

                    <s:property value="cell" />

                </td>

        </s:iterator>

        </tr>

    </s:iterator>

</table>

    在上面的标簽檔案中使用了<s:iterator>和<s:property>标簽,<s:iterator>标簽 的value屬性值使用了EL,這在低版本的Struts 2中是沒有任何問題的,但在Struts 2.0.11及以後的版本中預設情況下并不能在Struts 2屬性值中使用EL和JSP表達式(也就是說,rtexprvalue參數預設值是false),而隻能使用Ognl表達式,而在這種情況下,上面的代碼 是無法正常執行的。一種解決方法是将Struts 2的發行包中相應标簽的某個屬性的rtexprvalue參數值設為true,但這種方法并不通用,因為它直接修改了Struts 2。

    另外一種方法是通過<s:set>标簽将相應的值儲存在ValueStack對象中,再使用Ognl表達式來讀取。使用這種方法可以将上面的代碼修改為如下的形式:

<table border="1" style="font-size:25px"> 

    <!--  使用Ognl表達式引用index  -->  

    <s:iterator var="row" value="index">

    下面的代碼調用了table标簽檔案,并傳遞了index參數值:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<!--  index參數值為grid1  -->

<s:set var="index" value="grid1" /> 

<t:table/> 

<!--  index參數值為grid2  -->

<s:set var="index" value="grid2" /> 

<t:table/>

    哪位讀者還有其他的方法傳遞index參數值(不能直接修改Struts2發行包,不使用請求參數),請跟貼!   

<a href="http://www.eoeandroid.com/forumdisplay.php?fid=4">國内最棒的Google Android技術社群(eoeandroid),歡迎通路!</a>