如何检查消息键是否为空?

How to check if message-key is empty?

我的 .jsp 文件中有以下内容:

<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
...
<fmt:message key="mykey.${country}" />

对于某些国家/地区,此密钥存在并且消息按预期显示,对于其他国家/地区,它不存在。如果它不存在,我会得到以下输出:

???mykey.DE??? 

我不想要。如果密钥不存在,我希望没有输出。

mykey.${country} 解析为

我不知道它会是哪一个,但我需要检查它是否作为变量存在。

有没有办法检查这个或隐藏不需要的输出?


到目前为止我尝试了什么:

我试着用

包围它
<c:if test="$(not empty mykey.${country})">
  <fmt:message key="mykey.${country}" />
</c:if>

但它不起作用:消息永远不会显示,即使密钥存在。

我也试过先放到一个局部变量中:

<c:set var="localVar" value="mykey.${country}" />
<c:out value="${localVar}" /> <!-- this prints 'mykey.DE' correctly -->
<c:if test="!empty ${localVar}">
    <div style="padding-top:10px;">
    <fmt:message key="mykey.${country}" />
    </div>
</c:if>

但是检查没有按预期工作。

这是mykey.${country}这种格式正确吗?要么使其低于格式,要么首先将值输出到本地变量。

<c:if test="$(not empty mykey.country)">
  <fmt:message key="mykey.country" />

一些小技巧

如果你的参数存在/不为空:

<c:if test="${param.yourParam != null}"></c:if>

如果你的参数不存在/为空

<c:if test="${param.yourParam == null}"></c:if>

如果你的参数不为空(不是空字符串且不为空)

<c:if test="${!empty param.yourParam}"></c:if>

如果您的参数为空(空字符串或 null)

<c:if test="${empty param.yourParam}"></c:if>

你可以试试这个:

<c:set var="localvar"><fmt:message key="mykey.${country}" /></c:set>

<c:if test="${!fn:startsWith(localvar,'???')}">
   ${localvar}
</c:if>  

虽然不是很漂亮。另一种选择可能是编写自定义消息标记:

<%@ tag body-content="empty" %>
<%@ attribute name="key" required="true" %>
<%@ attribute name="defaultvalue" required="true"  %>

<%@ taglib prefix="c"   uri="http://java.sun.com/jsp/jstl/core"      %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"       %>
<%@ taglib prefix="fn"  uri="http://java.sun.com/jsp/jstl/functions" %>

<c:set var="msg"><fmt:message key="${key}" /></c:set>

<c:choose>

    <c:when test="${!fn:startsWith(msg,'???')}">
        ${msg}
    </c:when>    

    <c:otherwise>
        ${defaultvalue}
    </c:otherwise>

</c:choose>

然后使用如下:

<my:message key="mykey.${country}" defaultvalue=""/>