本文就bboss标簽庫與jstl标簽庫中的幾個常用标簽做個簡單的對比:
邏輯标簽和資料展示标簽
1.導入的tld檔案
使用bboss标簽庫,jsp頭部需要導入:
<%@ taglib uri="/WEB-INF/pager-taglib.tld" prefix="pg"%>
jstl标簽庫,jsp頭部導入:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
2.邏輯判斷标簽對比
分别使用bboss和jstl來實作邏輯或條件判斷功能:menuType的值為 'item'或者'module'或者'subSystem'時為真:
先看jstl
<c:if test="${menuType eq 'item' or menuType eq 'module' or menuType eq 'subSystem'}">
do somthing.
</c:if>
再看bboss,可以通過in标簽和true标簽來實作上述功能(使用in标簽是不是比if标簽要更簡單和直覺一些呢?):
<pg:in actual="${menuType}" scope="item,module,subSystem">
do somthing.
</pg:in>
bboss的true标簽實作上述功能(true比if的語義更加明确):
<pg:true actual="${menuType eq 'item' or menuType eq 'module' or menuType eq 'subSystem'}">
do somthing.
</pg:true>
if-else對比
<c:choose>
<c:when test="${param.newFlag== '1' || param.newFlag== '2' ||param.newFlag== '3'}">
<th>作品名稱<font color="Red">*</font>:</th>
</c:when>
<c:otherwise>
<th>班級<font color="Red">*</font>:</th>
</c:otherwise>
</c:choose>
再看bboss:
<pg:true actual="${param.newFlag== '1' || param.newFlag== '2' ||param.newFlag== '3'}" evalbody="true">
<pg:yes>
<th>作品名稱<font color="Red">*</font>:</th>
</pg:yes>
<pg:no>
<th>班級<font color="Red">*</font>:</th>
</pg:no>
</pg:true>
再看看bboss的if-elseif-else:
<pg:case actual="${count}">
<pg:equal value="1">
yes,1!
</pg:equal>
<pg:equal value="2">
yes,2!
</pg:equal>
<pg:other>
yes,other!!
</pg:other>
</pg:case>
bboss的邏輯标簽比較豐富,功能豐富,語義明确,除了true和in,還有相對應的false和notin标簽,他們可以嵌套組合實作if/else等各種各樣的邏輯判斷操作,更加詳細的資訊可參考文檔
《bbossgroups标簽庫使用大全(續)》;jstl的if等邏輯标簽功能也非常豐富,但是語義不明确,看起來比較費勁。
3.集合展示标簽對比
主要是collection/數組/map的展示标簽,先看看jstl如何來展示一個collection集合:
<c:forEach var="subSys" items="${subSystems}">
<fieldset>
<legend>${subSys.value.name}</legend>
<table>
<tr>
<td width="124" height="28" class="detailtitle">
id:
</td>
<td class="detailcontent">
${subSys.value.id}
</td>
</tr>
<tr>
<td width="124" height="28" class="detailtitle">
name:
</td>
<td class="detailcontent">
<c:forEach var="name" items="${subSys.value.localeNames}" varStatus="status">
${name.key}:${name.value}${status.index != fn:length(subSys.value.localeNames)-1 ? "," : ""}
</c:forEach>
</td>
</tr>
<tr>
<td width="124" height="28" class="detailtitle">
baseuri:
</td>
<td class="detailcontent">
${subSys.value.baseuri}
</td>
</tr>
</table>
</fieldset>
</c:forEach>
再來看看bboss的list标簽如何展示上述功能:
<pg:list actual="${subSystems}">
<fieldset>
<legend><pg:cell colName="name"/></legend>
<table>
<tr>
<td width="124" height="28" class="detailtitle">
id:
</td>
<td class="detailcontent">
<pg:cell colName="id"/>
</td>
</tr>
<tr>
<td width="124" height="28" class="detailtitle">
name:
</td>
<td class="detailcontent">
<pg:map colName="localeNames" >
<pg:mapkey />:<pg:cell /><pg:equal expression="{rowcount}-1" expressionValue="{rowid}"> ","</pg:equal>
</pg:map>
</td>
</tr>
<tr>
<td width="124" height="28" class="detailtitle">
baseuri:
</td>
<td class="detailcontent">
<pg:cell colName="baseuri"/>
</td>
</tr>
</table>
</fieldset>
</pg:list>
jstl的foreach和bboss的list标簽都可以很好地展示collection、數組、set中的資料,也能夠嵌套使用,bboss有專門的map标簽來展示map資料。jstl為了展示資料會定義一個資料變量和狀态變量,并且擷取集合長度還要反複調用fn标簽;而bboss無需定義這兩個變量,不僅内置了rowcount标簽和rowid标簽,而且在equal等邏輯标簽的expression和expressionValue表達式屬性中還可以使用以下内置變量:
rowid:周遊集合的目前行号(從0開始)
offset :分頁标簽中目前頁的第一條記錄在總記錄中所處的位置
rowcount :總記錄數
pagesize :目前頁或者目前清單擷取到的記錄數
mapkey :map中目前記錄的key
currentcell:map中目前記錄的值
如果上述的list展示内容較多,我們可以精簡一下:
bboss
<pg:list actual="${subSystems}">
<pg:cell colName="name"/>//對象中的name屬性
<pg:cell colName="id"/>//對象中的id屬性
</pg:list>
jstl實作相同的功能:
<c:forEach var="subSys" items="${subSystems}">
${subSys.value.name}
${subSys.value.id}
</c:forEach>
呵呵,再看看一個精簡的map資料的展示功能:
<pg:map actual="${publicItem.workspacecontentExtendAttribute}">
<pg:mapkey />
<pg:cell/>
</pg:map>
jstl
<c:forEach var="attribute" items="${publicItem.workspacecontentExtendAttribute}">
${attribute.key} ${attribute.value}
</c:forEach>
複雜一點的:
<pg:map actual="${publicItem.localeHeadimgs}" > <pg:notequal expression="{rowid}" value="0">,</pg:notequal><pg:mapkey/>:<pg:cell/>
</pg:map>
<c:forEach var="headimg" items="${publicItem.localeHeadimgs}" varStatus="status"> ${headimg.key}:${headimg.value}${status.index != fn:length(publicItem.localeHeadimgs)-1 ? "," : ""} </c:forEach>
bboss的資料展示标簽的詳細使用,請參考文檔
《bbossgroups标簽庫使用大全 》。
4.總結
通過本文幾個簡單的功能對比,可以看出jstl和bboss的基本功能都非常豐富,從對比中可以看出bboss标簽展示資料和實作邏輯判斷等功能時語義更加明确,代碼更加通俗易懂。(本文觀點僅代表作者本人觀點,歡迎大家讨論交流)