1

概括地说:我希望 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>元素内,以便在可解析为数字且该数字 >= 1 时呈现导航navTabsLevel,否则显示 1 行警告。
如何在不导致“字符串无法解析为数字”错误的情况下执行此操作?

4

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>

或者,更好的是,创建一个自定义 EL 函数,如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>

在为此设置的标准 JSTL 函数中至少没有可用的东西。

于 2013-06-26T15:36:08.770 回答