Как использовать spring: сообщение в цикле forEach - PullRequest
0 голосов
/ 11 февраля 2019

Я работал над системой, которая обеспечивает двуязычную поддержку веб-сайта из базы данных, используя библиотеку тегов <spring:message />.

Я могу читать / записывать файлы свойств приложений en / fr.Когда я жестко закодирую новый ключ <spring:message />, он будет отображаться правильно.Пример) <spring:message code="f12345' /> отобразит «данные теста».

У меня возникли проблемы с использованием динамической клавиши.Независимо от того, как я пытаюсь прикрепить ключ, он не работает.

Вот методы, которые я пробовал группировать по конечному результату.

500 error org.apache.jasper.JasperException: (line: [104], столбец: [29]) Ожидается символ [цитата / равно]

  • <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. "

Я обнаружил один сайт онлайн, который, кажется, делал то же самое.

<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>

Iнашли второй пример , где у них есть динамический ключ с сообщением пружины, используемым в цикле forEach.Ищите spring:message и его 14 / 17.

 <c:forEach items="${errors.allErrors}" var="error">
            <spring:message code="${error.code}" text="${error.code}"/><br/>
        </c:forEach>

Я нашел третий пример .

В трех найденных мной примерах 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; Как использовать spring: сообщение, когда ключ является динамическим на странице jsp.

1 Ответ

0 голосов
/ 13 февраля 2019

Я, наконец, понял, в чем проблема.

Краткий ответ: инверсия контроля стала причиной того, что все происходит сейчас, как я и ожидал.Я пытался получить доступ к функции или члену, и он продолжал пытаться использовать его версию get.Так как у меня не было специального метода getmember () для доступа к переменной, он делал странные и неправильные вещи.

Внедряя public String getspring_name() {return spring_name;}, внезапно <spring:message code="${CLUObject.spring_name}" /> работает.

Длинный ответ: В другом разделе моего кода я обнаружил то, что, как мне показалось, было закрытым строковым членом, доступ к которому осуществлялся на странице jsp.После значительного тестирования других типов и функций частных переменных моя первоначальная мысль о том, что я получаю доступ к закрытому члену, была опровергнута.Тем не менее, этот конкретный был доступен.После дополнительного тестирования я обнаружил, что когда у меня была функция get в очень специфическом соглашении об именах, это поведение было воспроизводимым.Таким образом, в этом случае у меня было закрытое String CLU_Name, и мне посчастливилось создать функцию get как getCLU_Name ().Назвав другие функции get, такие как getCountDelete () для Count_Delete, не позволил мне воспроизвести поведение для THEM , потому что они не соответствовали шаблону именования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...