【发布时间】:2019-02-11 18:06:39
【问题描述】:
我一直在开发一个系统,该系统使用<spring:message /> 标签库从数据库中为网站提供双语支持。
我可以读/写应用程序的 en/fr 属性文件。当我硬编码新键<spring:message /> 时,它会正确显示。例如)<spring:message code="f12345' /> 将显示“测试数据”。
我遇到的问题是使用动态密钥。无论我如何尝试附加密钥,它都会失败。
以下是我尝试过的按最终结果分组的方法。
500 错误 org.apache.jasper.JasperException: (line: [104], column: [29]) [quote/equal] 符号预期
<spring:message var><c:out value="${CLUObject.SpringKey_name()}" /></spring:message><spring:message var='<c:out value=\"${CLUObject.SpringKey_name()}\" />" text="wrong" /><spring:message code="<c:out value="${CLUObject.SpringKey_name()}" />" text="${CLUObject.SpringKey_name()}" /><spring:message code=<c:out value="${CLUObject.SpringKey_name()}" /> text="${CLUObject.SpringKey_name()}" /><spring:message code= <c:out value="${CLUObject.SpringKey_name()}" /> />
接下来我们会遇到非服务器崩溃,这只会导致表格无法显示
<spring:message var='<c:out value="application.message" />' arguments="${CLUObject.SpringKey_name()}" /><spring:message var='<c:out value="${CLUObject.SpringKey_name()}" />' text="wrong" /><spring:message code="<c:out value=\"${CLUObject.SpringKey_name()}\" />" /><spring:message code="${CLUObject.SpringKey_name()}" /><spring:message code="messageCode" arguments="$value1}" /><c:set var="temp" > <c:out value="${CLUObject.SpringKey_name()}" /> </c:set><td><spring:message code="messageCode" arguments="${temp}" htmlEscape="false" /></td>
我设法做到的最好的方法是简单地显示键的文本而不是值。这已经可以使用<spring:message text="${CLUObject.SpringKey_name()}" />'完成了
在 applicationResources 文件中
messageCode=Test message for {0}.
然后在jsp页面里面
<c:set var="temp" > <c:out value="${CLUObject.SpringKey_name()}" /> </c:set>
显示“CLUVALUE.C1111 的测试消息。”
我在网上找到了one site,它似乎在做同样的事情。
<form:select path="${path}">
<c:forEach var="i" items="${items}">
<form:option value="${i[itemValue]}">
<c:choose>
<c:when test="${localize}">
<spring:message code="${i[itemLabel]}" text="${i[itemLabel]}"/>
</c:when>
<c:otherwise>
<c:out value="${i[itemLabel]}"/>
</c:otherwise>
</c:choose>
</form:option>
我找到了一个second example,其中有一个动态键,其中在 forEach 循环中使用了 spring 消息。搜索 spring:message 及其 14/17。
<c:forEach items="${errors.allErrors}" var="error">
<spring:message code="${error.code}" text="${error.code}"/><br/>
</c:forEach>
我找到了third example。
在我找到的三个示例中,spring:message 都使用相同的代码和文本属性。
我看不到输出,我不能确定他们的文本参数没有被显示。
这里是控制器块
List<CLU_STRUT> myCLUs = cluService.BuildCLUs();
model.addAttribute("CommonLookUp", myCLUs);
这里是 JSP
<c:forEach var="CLUObject" items="${CommonLookUp}" varStatus="vs">
<tr>
<c:set var="temp" > <c:out value="${CLUObject.SpringKey_name()}" /> </c:set>
<td><spring:message code="messageCode" arguments="${temp}" htmlEscape="false" /></td>
<td><c:if test="${CLUObject.getCountNew() gt 0}"> <a href='drillview?drillvalue=${CLUObject.SpringKey_name()}&mode=drill&drilltype=I'><c:out value="${CLUObject.getCountNew()}" /></a></c:if><c:if test="${CLUObject.getCountNew() eq 0}">0</c:if></td>
<td><c:if test="${CLUObject.getCountMod() gt 0}"> <a href='drillview?drillvalue=${CLUObject.SpringKey_name()}&mode=drill&drilltype=U'><c:out value="${CLUObject.getCountMod()}" /></a></c:if><c:if test="${CLUObject.getCountMod() eq 0}">0</c:if></td>
<td><c:if test="${CLUObject.getCountDelete() gt 0}"> <a href='drillview?drillvalue=${CLUObject.SpringKey_name()}&mode=drill&drilltype=D'><c:out value="${CLUObject.getCountDelete()}" /></a></c:if><c:if test="${CLUObject.getCountDelete() eq 0}">0</c:if></td>
<td><c:out value="${CLUObject.getCountTotal()}" /></td>
</tr>
</c:forEach>
TLDR;如何在jsp页面中使用spring:message,其中key是动态的。
【问题讨论】:
-
为什么key是动态的?那应该是实际上是静态的部分。
-
@M.Deinum 键是动态的,因为列表是从数据库中填充的。
-
但是为什么呢?如果这是一个编辑屏幕,你就不应该使用
spring:message如果不是,你不应该使用动态键。 -
@M.Deinum 在这种情况下,单位的名称将同时具有 En 和 Fr 名称,因此我认为使用 spring 消息会简单明了,而不必自己执行检查以查看设置的语言。 SM 位于一个长度不断变化的环内。我还计划在通用钻取页面上使用 SM。
-
键不应该不同。
标签: java spring spring-mvc