嵌套JSP标记之间的访问变量

时间:2010-04-03 00:18:30

标签: java jsp jsp-tags

我想在两个嵌套的JSP tagx工件之间交换信息。举个例子:

list.jspx

<myNs:table data="${myTableData}">
    <myNs:column property="firstName" label="First Name"/>
    <myNs:column property="lastName" label="Last Name"/>
</myNs:table>

现在,table.tagx应该显示嵌套列标记中定义的数据列。问题是如何从表标记访问嵌套列标记的属性值和标签属性。我尝试了jsp:directive.variable,但似乎只能在jsp和标签之间交换信息,而不是在嵌套标签之间交换信息。

注意,我想避免对表和列标记使用java后备对象。

我还想知道如何访问父标记定义的属性(在本例中我想从column.tagx访问table.tagx中data属性的内容)。

因此,归结为如何在嵌套的JSP标记之间访问变量,这些标记纯粹是通过标记定义本身实现的(不需要Java TagHandler实现)?

1 个答案:

答案 0 :(得分:2)

我们的想法是在请求范围内共享数据:

  1. 在myNs:table中创建一个请求范围的占位符变量来保存数据(在您的情况下,您将需要其中两个:一个用于属性,另一个用于标签):

    <c:set var="properties" scope="request" />
    <c:set var="labels" scope="request" />
    
  2. 然后通过<jsp:doBody />调用列标记,以便列可以填充占位符。
  3. 在myNs:列中填充占位符,请记住将它们保留在请求范围内:

    <c:choose>
      <c:when test="${empty properties}" scope="request">
        <c:set var="properties" value="${property}" scope="request" />
      </c:when>
      <c:otherwise>
        <c:set var="properties" value="${properties},${property}" scope="request" />
      </c:otherwise>
    </c:choose>
    
  4. 现在,在你的myNs:table中调用了<jsp:doBody />后,你得到了填充的值,你只需要用逗号分隔字符串作为分隔符,然后做你想做的任何事情:

    <table>
      <thead>
        <tr>
          <c:forTokens items="${labels}" delims="," var="label">
            <th><c:out value="${label}" /></th>
          </c:forTokens>
      </thead>
    </table>
    
  5. P.S。:积分归Spring Roo所有,看看他们的table.tagxcolumn.tagx