instanceof проверка на языке выражения EL

Есть ли способ выполнить проверку instanceof в EL?

Например

  #{errorMessage1}   #{errorMessage2}  

Вы можете сравнить Class#getName() или, может быть, лучше, Class#getSimpleName() в String .

  #{errorMessage1}   #{errorMessage2}  

Обратите внимание на важность указания Object#getClass() с нотной привязкой ['class'] поскольку class является зарезервированным Java-литералом, который в противном случае выбрал бы исключение EL в EL 2.2+.

Альтернативой безопасному типу является добавление некоторого public enum Type { A, B } вместе с public abstract Type getType() в общий базовый class модели.

  #{errorMessage1}   #{errorMessage2}  

Любые недопустимые значения приведут к исключению EL во время выполнения в EL 2.2+.

Если вы используете OmniFaces , начиная с версии 3.0, вы можете использовать #{of:isInstance()} .

  #{errorMessage1}   #{errorMessage2}  

Это не работает в EL . Для этого используйте бэкбон:

 public class MyBean { public boolean getIsClassA() { if(model instanceof ClassA) { return true; } return false; } } 

И затем выполните проверку, вызвав бэк-файл:

  #{errorMessage}  

оно работает:

 rendered="#{node.getClass().getSimpleName() == 'Logt_anno'}" 

Определите статическую функцию, например:

 public boolean isInstanceOf( Object obj, Class targetClass) { return targetClass.isInstance(obj); } 

Определите для него пользовательскую функцию EL и используйте ее. Мы могли бы также передать имя строки и сделать forName() внутри метода.

Есть способ, см.

JSF EL: экземпляр зарезервирован, но еще не реализован?

Однако оператор instanceof все еще не реализован, по крайней мере, в Mojarra 2.1. Пожалуйста, проголосуйте за ошибку здесь:

http://java.net/jira/browse/JSP_SPEC_PUBLIC-113

Лучшим решением в настоящее время является, вероятно, сохранение имени classа в бэк-получателе бэкэнда вместо создания логического метода тестирования для каждого classа:

 public String getSelectedNodeClassName() { return selectedNode.getClass().getSimpleName(); } 

Таким образом, это будет сочетание решений BalusC и flash. Однако в JSF было бы гораздо более читаемым, чем BalusC, и это в значительной степени напоминает будущий instanceof использования оператора:

 rendered="#{nodeManager.selectedNodeClassName eq 'ChapterNode'}" 

Это не будет производить один метод для каждого теста classа на бэк-компоненте, как предложено флэш-памятью. Это может быть медленнее, чем вспышка.

Не очень элегантный, поскольку он смешивает JSP EL и более ранний синтаксис выражений , но не требует дополнительного кода Java :

 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>    <%-- Your logic here. --%>  

Вы можете использовать вспомогательный компонент для этого:

 @ManagedBean public class Helper { public boolean isInstance(Object bean, String fullyQualifiedClassName) { return Class.forName(fullyQualifiedClassName).isInstance(bean); } } 

Применение:

  #{errorMessage1}  

Это имеет то преимущество, что наследование учитывается, и вы можете проверить classы, которые вы не можете изменить (оба недостатка решений BalusC).

Если вам нравится использовать простое имя classа (и не бойтесь конфликтов имен), вы можете использовать карту поиска, которую вы заполняете вручную или с помощью сканера маршрутов classа, например org.reflections :

 @ManagedBean @ApplicationScoped public class Helper { private Map> classes = new Reflections("myrootpackage").getSubTypesOf(MyBaseClass.class).stream() .collect(Collectors.toMap(Class::getSimpleName, Function.identity())); public boolean isInstance(Object bean, String simpleClassName) { final Class c = this.classes.get(simpleClassName); return c != null && c.isInstance(bean); } } 

Вы даже можете переместить вспомогательную функцию в ELResolver:

 public class InstanceOfELResolver extends ELResolver { public Object invoke(final ELContext context, final Object base, final Object method, final Class[] paramTypes, final Object[] params) { if ("isInstanceOf".equals(method) && params.length == 1) { context.setPropertyResolved(true); try { return params[0] != null && Class.forName(params[0].toString()).isInstance(base); } catch (final ClassNotFoundException e) { return false; } } return null; } // ... All other methods with default implementation ... } 

Применение:

  #{errorMessage1}  
  • Почему JSF сохраняет состояние компонентов пользовательского интерфейса на сервере?
  • Как я могу получить строку пакета сообщений из управляемого управляемого компонента?
  • Почему атрибут «немедленного» был добавлен в EditableValueHolders?
  • Чтение свойств пакета ресурсов в управляемом компоненте
  • Как перемещаться в JSF? Как сделать URL-адрес текущей страницы (а не предыдущей)
  • Как отображать ошибки моего приложения в JSF?
  • Храните PDF в течение ограниченного времени на сервере приложений и делайте его доступным для загрузки
  • Как обрабатывать завершение сеанса и ViewExpiredException в JSF 2?
  • Есть ли простой способ предварительной обработки и перенаправления запросов GET?
  • Field.get (obj) возвращает все значения NULL для инъецированных управляемых бинов CDI, тогда как ручные вызовы getters возвращают правильные значения
  • Как реализовать фильтр входа в JSF?
  • Interesting Posts

    Ошибка java.lang.StackOverFlow. Подозревали слишком много просмотров?

    Что такое фабрика classов?

    Есть ли в Entity Framework 4 Code First поддержка генераторов идентификаторов, таких как NHibernate?

    Программно вернуться к предыдущему fragmentу в стопке

    Спящий режим не может одновременно извлекать несколько пакетов

    Как мне показать только базовый каталог в моем терминале Ubuntu?

    Почему мой компьютер переходит «Новое USB-устройство» каждый раз, когда я подключаю его к другому порту?

    Как я могу заставить свой 64-битный компьютер распознавать всю мою RAM

    Не удалось загрузить SOS в WinDbg

    Общие коллекции PowerShell

    Есть ли способ настройки культуры для целого приложения? Все текущие streamи и новые streamи?

    Как использовать собственный шрифт с помощью WebView

    Как правильно использовать обратную совместимость вектора вектора с последней поддержкой Android?

    Что такое намерение в Android?

    Windows 10 «Включить политику длинных путей NTFS» отсутствует

    Давайте будем гением компьютера.