2013-06-26 46 views
1

廣泛地說:我想在JSTL Core <c:when>標記中的測試返回false,如果:
- 一個變量不能被解析爲一個數字;或
- 將相同變量與數字文字進行比較是錯誤的。
我知道在某些情況下變量不會被解析爲數字;這不應該導致錯誤。使用-情況如何進行數字比較,但如果無法解析爲數字,則返回false?

詳細情況如下...

我見在WebSphere Portal V7服務器上的JSP文件如下。此JSP由配置爲使用IBM Web Content Manager JSP組件的Web Content portlet呈現。

<%@ page session="false" buffer="none" %> 
<%@ page trimDirectiveWhitespaces="true" %> 
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 
<%@ taglib uri="http://www.ibm.com/xmlns/prod/websphere/portal/v7.0/json" prefix="json" %> 
<%@ taglib uri="http://www.ibm.com/xmlns/prod/websphere/portal/v7.0/portal-fmt" prefix="portal-fmt" %> 
<%@ taglib uri="http://www.ibm.com/xmlns/prod/websphere/portal/v7.0/portal-core" prefix="portal-core" %> 
<%@ taglib uri="http://www.ibm.com/xmlns/prod/websphere/portal/v7.0/portal-navigation" prefix="portal-navigation" %> 
<%@ page import="com.isw.portal.theme.SideNav" %> <%! 
    SideNav iswSideNav=SideNav.getInstance(); 
%> 
<portal-navigation:navigation startLevel="${navTabsLevel}" stopLevel="${navTabsLevel+3}"> 
<%=iswSideNav.getNavHTML(wpsNavModel,wpsSelectionModel,request,response) %> 
</portal-navigation:navigation>

這可以在普通頁面瀏覽中始終如一地工作。
但是,當門戶搜索集合正在更新(每6小時自動發生一次,需要大約2分鐘)時,該JSP每秒會產生一些例外情況。
例外總是與以下重複的兩個例子相同。第二個異常總是包含一個堆棧跟蹤,除了指出NumberFormatException消息的行之外,我省略了它。

NavigationTag E com.ibm.wps.engine.tags.NavigationTag setStartLevel EJPEJ0027E: StartLevel less than 1 is ignored. 
NavigationTag E com.ibm.wps.engine.tags.NavigationTag setStartLevel EJPEJ0026E: StartLevel is not a valid number. 
    java.lang.NumberFormatException: For input string: ""

隨着似乎這些異常不會造成任何功能性問題,我想在<portal-navigation:navigation>元素緊裹<c:choose>元素中,使得導航呈現時navTabsLevel是可解析爲一個數字,這個數字是> = 1,否則顯示1行警告。
我該如何做到這一點,而不會導致「字符串不能解析爲數字」錯誤?

回答

2

可以使用<c:catch>

<c:catch var="exception"> 
    <portal-navigation:navigation startLevel="${navTabsLevel}" ... /> 
</c:catch> 
<c:if test="${not empty exception}"> 
    Handle fail. 
</c:if> 

或者,更好,創造custom EL functionmatches()isNumber()

<c:choose> 
    <c:when test="${my:isNumber(navTabsLevel)}"> 
     <portal-navigation:navigation startLevel="${navTabsLevel}" ... /> 
    </c:when> 
    <c:otherwise> 
     Handle fail. 
    </c:otherwise> 
</c:choose> 

有至少沒什麼可在standard JSTL functions集爲。

+0

謝謝。當我能夠測試它(在生產服務器上等待下班時間)時,我會標記爲已回答,但已提高了答案,因爲無論您是否增加了我的JSTL和EL知識。 –

+0

在鏈接問題和Google搜索之後,我使用TLD文件定義了自定義EL函數,如http://blog.idleworx.com/2010/04/custom-tags-and-custom-el-functions -in.html。我做了一個名爲parseDoubleDef的Java方法,它接受一個String和一個double。如果它可以將String解析爲double值,則返回該值,否則返回double參數。 –

相關問題