天天看點

bboss标簽庫與jstl标簽庫功能對比

本文就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 ? "," : ""}&nbsp;
										</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>&nbsp;
										</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/>&nbsp;
</pg:map>      
<c:forEach var="headimg" items="${publicItem.localeHeadimgs}" varStatus="status">	${headimg.key}:${headimg.value}${status.index != fn:length(publicItem.localeHeadimgs)-1 ? "," : ""}&nbsp;			</c:forEach>      

bboss的資料展示标簽的詳細使用,請參考文檔

《bbossgroups标簽庫使用大全 》

4.總結

通過本文幾個簡單的功能對比,可以看出jstl和bboss的基本功能都非常豐富,從對比中可以看出bboss标簽展示資料和實作邏輯判斷等功能時語義更加明确,代碼更加通俗易懂。(本文觀點僅代表作者本人觀點,歡迎大家讨論交流)