如何在forEach循环中使用spring:message

时间:2019-02-11 18:06:40

标签: java spring spring-mvc

我一直在研究使用<spring:message />标签库从数据库为网站提供双语支持的系统。

我可以读取/写入应用程序的en / fr属性文件。当我进行硬编码时,新的密钥<spring:message />将正确显示。例如)<spring:message code="f12345' />将显示“测试数据”。

我遇到的问题是使用动态密钥。无论我如何尝试附加密钥,它都会失败。

这是我尝试按最终结果分组的方法。

500错误org.apache.jasper.JasperException:(行:[104],列:[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都使用相同的代码和文本属性。

我看不到输出,也无法确定不会显示其text参数。

这是控制器块

 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。

1 个答案:

答案 0 :(得分:0)

我终于弄清楚了问题所在。

简短的回答:现在,控制反转导致事情按我的预期发生。我试图访问一个函数或成员,并且一直尝试使用它的获取版本。由于我没有专门的getmember()访问变量,因此它在做奇怪而错误的事情。

突然引入public String getspring_name() {return spring_name;}即可<spring:message code="${CLUObject.spring_name}" />

长答案:在代码的另一部分中,我发现我认为是在jsp页面中访问的私有字符串成员。在对其他私有变量类型和函数进行了大量测试之后,我最初的想法是我获得了私有成员的访问权。但是,正在访问此特定对象。经过更多测试后,我发现当我在非常特定的命名约定中具有get函数时,此行为是可重现的。因此,在这种情况下,我有一个私有字符串CLU_Name,并且很幸运能够将get函数创建为getCLU_Name()。为Count_Delete命名了诸如getCountDelete()之类的其他get函数,这使我无法重现 THEM 的行为,因为它们不符合命名模式。