JSF ясно показывает условный текст

<h:panelGroup rendered="#{Account.Status eq 'FAILED' }">
            <h:outputText value="# {msg['account/failed']}" escape="false" />
</h:panelGroup>

<h:panelGroup rendered="#{Account.Status eq 'SUCCESS' }">
            <h:outputText value="# {msg['account/success']}" escape="false" />
</h:panelGroup>

...more panelgroup messages like this for all different Status types,
 and different messages to be shown..

В моем приложении Glassfish Jee6 я показываю свои сообщения в зависимости от состояния учетной записи, я храню свои строки в текстовом файле и получаю доступ со страницы JSF, как указано выше {msg['account/failed']}

Теперь эти условия состояния if-else становятся все больше для разных типов сообщений и делают страницу JSF беспорядком, как я могу сделать то же самое из кода Java?

Я могу установить значение сообщения и поместить условие if else в свой код Java, но как тогда я получу доступ к моему текстовому файлу, в котором я храню свои строки? или любой другой чистый способ JSF сделать это?


person Spring    schedule 06.06.2013    source источник


Ответы (3)


Предполагая, что статус учетной записи является перечислением, я бы опубликовал метод

public static String toString(Enum<?> e) {
    ResourceBundle bundle = FacesContext.getCurrentInstance().getApplication().getResourceBundle("messages");
    return bundle.getString(e.getClass().getSimpleName() + "/" + e.name());
}

как EL-функция и используйте ее как

#{e:toString(Account.status)}

(код не проверен, так как у меня нет затмения под рукой, но общая идея должна быть разумной)

person meriton    schedule 06.06.2013
comment
tnx выглядит так, как будто это может мне помочь, но, поскольку я очень мало знаю JSF, я не знаю, как я могу использовать эту идею. Я думаю, это только для того, чтобы получить доступ к внешнему текстовому файлу? может быть, вы могли бы отредактировать вопрос, чтобы немного объяснить, как это выглядит в файлах xhtml и java? - person Spring; 06.06.2013
comment
и зачем использовать el-функцию вместо вызова этого метода, как обычный метод, например #{bean.toString(Account.status)}? - person Spring; 07.06.2013
comment
Для краткости и удобочитаемости выражения el. Конечно, вы можете написать #{enumFormatter.toString(Account.status)}, но это несколько длинно. - person meriton; 07.06.2013

Просто сделайте значение перечисления частью ключа пакета. Например.

<c:set var="key" value="account.status.#{account.status}" />
<h:outputText value="#{msg[key]}" escape="false" />

(я только заменил / на . и перевел имена экземпляров/свойств в нижний регистр в соответствии со стандартными соглашениями)

с участием

account.status.FAILED = Failed
account.status.SUCCESS = Success

В качестве альтернативы сделайте ключ свойством перечисления. См. также среди прочего:

person BalusC    schedule 07.06.2013
comment
+1: Какой хороший способ обойти отсутствие оператора конкатенации строк в el. - person meriton; 07.06.2013

вы можете использовать теги JSTL ... Я работал с JSF, и иногда вам нужно попробовать несколько вещей. ты можешь использовать ,

   <c:if test="condition">
   <h:outputText value="# {msg['account/success']}" escape="false" />
  </c:if>

или использовать

    <c:choose>
          <c:when test="${param.enter=='1'}">
  <h:outputText value="# {msg['account/success']}" escape="false" />
          </c:when>

          <c:otherwise>
         <h:outputText value="# {msg['account/failed']}" escape="false" />
          </c:otherwise>
    </c:choose>
person grepit    schedule 06.06.2013
comment
Теги JSTL и JSF — это большое нет! Это может вызвать сильные головные боли при смешивании с фейслетами! - person Jonathan S. Fisher; 06.06.2013
comment
Я с уважением не согласен с вами. Существуют обстоятельства, при которых вы можете захотеть использовать JSTL с JSF с учетом того, чего вы хотите достичь. - person grepit; 06.06.2013
comment
Это может быть так, но так ли это? Не зная, меняется ли статус учетной записи в течение жизненного цикла представления, совет использовать JSTL, а не отображаемый атрибут, может быть довольно опасным - и я не вижу каких-либо неоспоримых преимуществ, которые JSTL может предложить здесь? - person meriton; 06.06.2013
comment
@meriton Я думаю, что ваше решение, безусловно, лучший подход, но я просто хотел упомянуть и об этом на всякий случай, чтобы дать ему / ей другой вариант. - person grepit; 06.06.2013
comment
@ user717630 JSTL следует использовать только для полного вырезания дерева компонентов из представления. Есть несколько случаев, когда это может быть допустимым использованием, но приведенное выше не является одним из них. Если в его представлении есть какие-либо f:ajax, JSTL вызовет различные проблемы. <ui:fragment> здесь было бы куда уместнее. - person Jonathan S. Fisher; 07.06.2013