慎用fn:contains,使用c:forEach替代

来源:互联网 发布:c语言流程图规范 编辑:程序博客网 时间:2024/05/22 11:53

做的功能是在jsp页面,有一个list,如果页面中的某个值与list中的值相等,就怎样怎样,如果不相等就怎样怎样


开始用的是JSTL的fn:contains函数。

没注意,测试后发现,这个函数是“包含”,而不是equals相等

假如我的list中有一个数是21,我页面中有1,21,31,那么就会把1和21都选中。因为21包含了1。而我想做的是list中是21就只处理页面上为21的那个。


于是就用c:forEach替换。

if语句替换如下:

<c:if test="${fn:contains(existedWidgetId,item.objectId)}">处理要显示的内容</c:if>${item.name }

<c:forEach var="exist" items="${existedWidgetId }" begin="0" end="${fn:length(existedWidgetId)}"><c:if test="${exist == item.objectId }">处理要显示的内容</c:if></c:forEach>

if,else语句使用c:choose标签,替换如下:

<c:choose><c:when test="${fn:contains(existedWidgetId,item.objectId)}"><div class="box widget"  style="border:1px solid blue;"></c:when><c:otherwise><div class="box widget"  ></c:otherwise></c:choose>

<c:set var="contains" value="false" /><c:forEach var="exist" items="${existedWidgetId }" begin="0" end="${fn:length(existedWidgetId)}"><c:if test="${exist == item.objectId }"><c:set var="contains" value="true" /></c:if></c:forEach><c:choose><c:when test="${contains == true }"><div class="box widget" style="border:1px solid blue;"></c:when><c:otherwise><div class="box widget" ></c:otherwise></c:choose>

为什么我要用一个c:set呢?

是因为不用直接循环设值的话,你会发现页面这段代码循环了好几次,因为你每次foreach都要出一个结果。

所以用c:set,设置一个值来当作flag。


可以参考这个页面的说明:http://stackoverflow.com/questions/1490139/evaluate-list-contains-string-in-jstl


JSTL是没有break函数的。所以也不能跳出循环。


0 0