如何进行数字比较但如果无法解析为数字则返回false?

时间:2013-06-26 05:02:43

标签: jstl el websphere-portal

概括地说:我希望JSTL Core <c:when>标记中的测试返回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>

这在普通页面浏览量上始终如一 但是,当正在更新Portal Search集合时(每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可解析时呈现导航作为一个数字,该数字是&gt; = 1,否则显示一行警告 如何在不导致“字符串无法解析为数字”错误的情况下执行此操作?

1 个答案:

答案 0 :(得分: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 function,例如matches()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中至少没有可用的内容。