DisplayTag
DisplayTag在表格數據顯示,排序,生成報表,分頁,包括數據的格式化有著強大的功能。使用DisplayTag可以使得程序的前臺開發更容易,更方便。很多的功能可以通過官方網站來獲得相關的信息。
因為自從DisplayTag在去年發布以后,到現在沒有新的版本,所以在程序的開發過程中,有一些限制,好在都有相關的方法進行替代。
Multiple Parameters:
一般的程序在DisplayTag構造link,都需要傳遞多個參數,當使用Decorator的時候,未免會給程序的維護帶來很大的困難,DisplayTag在使用 paramId在傳遞參數的時候只能傳遞一個參數,這給大多數的程序處理帶來了不便,可以通過修改Column類中的private Href getColumnHref(String columnContent) throws ObjectLookupException方法來達到目的,很多人已經提出相關的解決方案,見http://jira.codehaus.org/browse/DISPL-120
但是畢竟沒有官方的release版本,這樣同樣對以后的維護帶來不便。最快也是最簡潔的辦法就是通過JSTL來構造link,這種方法不再限制只能傳遞一個參數,給程序的處理帶來了方便。使用Struts2 , JSTL和DisplayTag結合,構造link會使程序更易維護。下面是簡短的JSTL和DisplayTag結合在一起的方法。
<display:table name="jobz" class="simple" id="row" >
<display:column titleKey="label.global.actions" >
<c:url var="viewurl" value="/viewJobDetail.action">
<c:param name="name" value="${row.name}"/>
<c:param name="groupName" value="${row.group}"/>
</c:url>
<c:url var="exeurl" value="/viewJobDetail.action">
<c:param name="name" value="${row.name}"/>
<c:param name="groupName" value="${row.group}"/>
<c:param name="executeJobAction" value="execute"/>
</c:url>
<c:url var="editurl" value="/viewJobDetail.action">
<c:param name="name" value="${row.name}"/>
<c:param name="groupName" value="${row.group}"/>
<c:param name="editAction" value="edit"/>
</c:url>
<a href='<c:out value="${viewurl}"/>'><fmt:message key="label.global.view"/></a> |
<a href='<c:out value="${editurl}"/>'><fmt:message key="label.global.edit"/></a> |
<a href='<c:out value="${exeurl}"/>'><fmt:message key="label.global.execute"/></a>
</display:column>
<display:column property="group" titleKey="label.job.group" sortable="true" />
<display:column property="name" titleKey="label.job.name" sortable="true" />
<display:column property="description" titleKey="label.job.description" />
<display:column property="jobClass" titleKey="label.job.jobClass" sortable="true" />
</display:table>
通過TableID,我們可以或得相關的數據的值,并動態的生成相關的連接,
<display:table id="hello" requestURI="hello.action" pagesize="10">
<display:column title="Entity">
<c:url var="exeurl" value="/other.action">
<c:param name="entityName" value="${hello.entity}" />
</c:url>
<a onclick="highlightElem(this,'hello')" target="myFrame" class="linkBlue" href='<c:out value="${exeurl}"/>'><c:out value="${hello.entity}"/>
</a>
</display:column>
<display:table/>
DisplayTag 分頁
DisplayTag在分頁的時候,Url會出現諸如d-8271310-p=3這樣的參數,d-8271310-p是通過Encode tableID(一個String型的常量)產生的。如果我們需要維護頁面的page的狀態,這一點很重要。下面是相關的代碼。
HttpServletRequest request=(HttpServletRequest)ActionContext.getContext().get(ServletActionContext.HTTP_REQUEST);
String pageNo=request.getParameter((new org.displaytag.util.ParamEncoder(tableID).encodeParameterName(org.displaytag.tags.TableTagParameters.PARAMETER_PAGE)));
我們就可以獲得pageNo 3了, new org.displaytag.util.ParamEncoder(tableID).encodeParameterName(org.displaytag.tags.TableTagParameters.PARAMETER_PAGE))會生成像d-8271310-p這樣的參數.