Java на habrahabr
JAVA / Опыт разработки GUI на JSF
Разработкой браузерных GUI под явой я занимаюсь уже около 12 лет, среди прочего имею опыт использования сервлетов, JSP, XML/XSLT, Struts, Tapestry (3,4,5), Wicket, Spring MVC и GWT.
Но JSF обходил до сих пор стороной. Причина этому было то, что когда JSF только появился, то в своих первых инкарнациях выглядел устрашающе коряво — по сравнению с теми же Tapestry и Wicket.
Но время шло, JSF появился уже версии 2.1, и я решил попробовать использовать его для одного из своих экспериментальных проектов, на которые я трачу примерно 3 месяца каждый год для расширения кругозора и отвлечения от скучного консалтинга, которым зарабатываю на еду в остальные 9 месяцев.
Теги:
Java
jsf
web-разработка
icefaces
ru.java на livejournal
AOP на примере JSF 2 приложения
В этой статье я познакомлю читателей с аспектно-ориентированным программирование на примере JSF 2 приложения.
AOP (Аспектно-ориентированное программирование) является одной из самых интересных парадигм абстрактной разработки с тех пор, как была разработана объектно-ориентированная. Как и объектно-ориентированное программирование, AOP позволяет разделять и повторно использовать код, однако расширяя эти возможности во многих областях программы, где это либо сложно, либо не возможно при объектно-ориентированном программировании. Как правило, эти области называют взаимно пересекающимися блоками (cross cutting concerns). Хорошим примером применения взаимно пересекающихся блоков можно назвать периодически повторяющийся код, например, для сбора статистики, трассировки приложения, управления соединениями с базой данных, удаленными соединениями, и др. Используя AOP, эти элементы могут быть выделены из каждого метода и применены через AOP, используя pointcut'ы. Pointcut — это код применимости аспекта, который отвечает на вопросы где (в каких точках соединения (join point)) может быть применена функциональность данного аспекта, которая задаётся с помощью советов (advice). В роли точки соединения может выступать поле класса, конструктор, либо метод. Аспект (aspect) – это набор некоторой сквозной функциональности (периодически повторяющийся код), нацеленный на решение конкретной задачи (сбора статистики, трассировки приложения, управления соединениями с базой данных и т.д.). С помощью совета (advice) можно контролировать изменение полей классов, когда они будут вызываться, вести журнал трассировки вызовов, статистику, выбрасывать исключения, обходить прерванный метод (при возникновении исключительной ситуации) и др. Также стоит заметить, что в контексте ООП сквозной функциональностью можно назвать функциональность, по которой не была проведена декомпозиция.
Для работы аспектов необходимо использовать специальный компилятор и подключить соответствующую библиотеку аспектов в проект.
Далее в статье будет рассматриваться библиотека AspectJ™ 5, при работе с которой в Eclipse лучше использовать этот плагин, а для NetBeans - этот.
Чаще встречаются следующие типы pointcut'ов:
| Тип pointcut'а | Описание |
|---|---|
| execution(void SomeClass.someMethod(..)) | Выполнение метода someMethod в классе SomeClass |
| call(void SomeClass.someMethod(..)) | Вызов метода someMethod в классе SomeClass |
| handler(IOException) | Pointcut для обработки исключительной ситуации IOException |
| this(SomeType) | Текущий объект, который принадлежит типу SomeType |
| target(SomeType) | Объект назначения, который принадлежит типу SomeType |
| within(SomeClass) | Выполняемый код, который принадлежит классу SomeClass |
| withincode(*SomeClass.someMethod(..)) | Выполняемый код над методом по стеку вызовов из метода someMethod, который принадлежит классу SomeClass |
| args(*, int) | любая точка соединения, где есть два аргумента, второй из которых типа int |
| @this(SomeAnnotation) | Текущий объект, который имеет аннотацию типа SomeAnnotation |
| @target(SomeAnnotation) | Объект назначения, который имеет аннотацию типа SomeAnnotation |
| @within(SomeAnnotation) | Выполняемый код над типом, имеет аннотацию типа SomeAnnotation |
| @withincode(SomeAnnotation) | Выполняемый код над методом либо конструктором, который имеет аннотацию типа SomeAnnotation |
| @args(SomeAnnotation) | любая точка соединения, где есть один аргумент, который имеет аннотацию типа SomeAnnotation |
Чаще встречаются следующие типы advice'ов:
| Тип advice'а | Описание |
|---|---|
| @Before("get(someType SomeClass.someField)") | Выполнение определенного действия до вызова чтения поля someField класса SomeClass |
| @AfterReturning("call(someType SomeClass.someMethod(someType))") | Выполнение определенного действия после вызова возвращения результата (выполниттся только при нормальном завершении метода (без исключения)) из метода someMethod класса SomeClass |
| @AfterThrowing("call(someType SomeClass.someMethod(someType))") | Выполнение определенного действия после возникновения исключения при выполнении метода someMethod класса SomeClass |
| @After("call(someType SomeClass.someMethod(someType))") | Выполнение определенного действия после вызова выполнения метода someMethod класса SomeClass |
| @Around("call(someType SomeClass.someMethod(someType))") | Выполнение определенного действия вместо вызова выполнения метода someMethod класса SomeClass. В теле для их выполнения можно воспользоваться proceedingJoinPoint.proceed() |
Логические операции pointcut'ов:
| Логическая операция | Описание |
|---|---|
| && | Логическое объединение двух pointcut'ов с помощью операции AND |
| || | Логическое объединение двух pointcut'ов с помощью операции OR |
| ! | Логическое отрицание pointcut'а |
Групповые символы (wildcards) pointcut'ов:
| Групповой символ | Описание |
|---|---|
| * | Удовлетворяет любому числу символов, как части шаблона |
| .. | При определении пакета удовлетворяет любому количеству дочерних пакетов. Например: com.demo..* – означает, что в любом подпакете пакета com.demo. В определении аргумента удовлетворяет любому количеству аргументов. Например: call(void SomeClass.someMethod(..)) - удовлетворяет вызову из класса SomeClass метода someMethod с любым количеством аргументов, который возвращает тип void |
| + | При определении класса, добавленный как приставка, удовлетворяет всем подклассам данного класса. Например: handler(Exception+) – означает, что pointcut будет удовлетворять условию обработки исключений для всех подклассов класса Exception |
AOP на примере вызова (call) и выполнения (execution) метода показано ниже в виде рисунка, на котором с помощью толстой линии показан вызов метода, тогда как возвращение результата/исключение - пунктирной линией:
В библиотеки AspectJ™ 5 можно определять pointcut как внутри advice'а (@Before("get(someType SomeClass.someField)")), так и отдельным методом (@Pointcut("execution(void SomeClass.someMethod(..))")).
Графически пример применения AOP на базе библиотеки AspectJ™ 5 можно показать следующим образом:
Из рисунка видно, что у нас определён аспект TraceAspect, у которого есть два pointcut'а: loggableTypePointcut – используется для трассировки в случае, если аннотация @Loggable стоит над классом; loggableMethodPointcut - используется для трассировки в случае, если аннотация @Loggable стоит над методом или конструктором. Также есть два advice метода: public Object log(ProceedingJoinPoint proceedingJoinPoint) throws Throwable – отвечает за обработку действий до и после метода; public void log(Throwable t) – отвечает за обработку исключительной ситуации после её возникновения. Из данного примера advice методы работают исключительно в контексте вызовов методов и/или классов, помеченных аннотацией @Loggable, по соответствующим pointcut'ам.
Рабочий пример проекта с использованием AOP (реализована трассировка вызовов) можно скачать здесь. Для того, чтобы можно было запустить данное приложение, нам необходимо:
По отношению к предыдущему примеру приложения, который был приложен к прошлой статье, в этом сделаны следующие изменения:
- Добавлена поддержка AOP (при компиляции проекта используется плагин aspectj-maven-plugin)
- Добавлена локализация валидаторов, которые указываются через аннотации над полями POJO классов
- Добавлены юнит-тесты
- Улучшен код
Статью на русском языке по AOP можно посмотреть здесь. Презентацию по AOP можно скачать здесь. Reference Card к библиотеки AspectJ™ 5 можно скачать здесь.
Для тех, кто всё же заинтересовался технологией JSF 2, хотелось бы обратить внимание на одно из лучших обучающих руководств для быстрого и качественного вхождения в понимания и работу технологии. Это руководство можно посмотреть здесь. Много нестандартных ситуаций, с которыми можно столкнуться при работе с JSF 2, хорошо описаны здесь. Другие, не менее достойные, источники приведены в предыдущих моих статьях (первая и вторая).
Благодарю за внимание.
Литература
ru.java на livejournal
Знакомство с JavaServer Faces (JSF) 2
Хотел бы познакомить читателей с технологией JSF 2. В данной статье я
постараюсь провести обзор возможностей JSF 2, которыми обладает данная
технология, а
также ее сравнение со стандартными технологиями JSP и servlet.
Вступление
JSF 2 является Java стандартом (JSR 314), реализацией которого занимаются Oracle Mojarra и Apache MyFaces. JSF 2 предоставляет разработчику большое количество новых возможностей, таких как стандартный механизм поддержки AJAX, проверку входных данных с помощью аннотаций, библиотеку facelets, как стандартный движок для шаблонизации страниц, множество готовых компонентов. Все это можно свободно использовать при построении web приложений любой сложности.
Из наиболее известных third-party JSF компонентов, хотелось бы отметить PrimeFaces, ICEfaces, RichFaces, PrettyFaces, OpenFaces. Хотя JSF 2 по своей сути является компонентно ориентированной платформой, однако с её помощью можно писать и MVC ориентированные приложения. При этом модель (Model) – это коллекция классов, которые служат для сохранения, изменения и получения данных; представление (View) – это jsf страница в xhtml формате; поведение (Controller) – это managed bean, который интерпретирует данные, введённые пользователем, и информирует модель о необходимости соответствующей реакции. JSF также хорошо интегрируется со Spring.
JSF 2 компоненты:Сравнение JSF 2 с MVC (servlet + jsp)
Преимущества JSF 2 по сравнению с MVC (servlet + jsp):- JSF обеспечивает программиста хорошим набором API, что даёт возможность создавать свои компоненты. Также можно воспользоваться уже готовыми компонентами, такими как: PrimeFaces, ICEfaces, RichFaces, PrettyFaces, OpenFaces и др.
- С помощью JSF легко указать, с помощью какого Java кода будет обрабатываться форма.
- В JSP мы можем использовать property="*" c jsp:setProperty тегом, чтоб автоматически наполнить bean отправленными в форме параметрами. JSF расширяет это свойство, а также добавляет возможность валидировать/конвертировать значения.
- JSF дает вам возможность без использования JavaScript, а также AJAX ориентированных фреймворков, таких, как Jquery, EXT-JS, Prototype и др. писать AJAX ориентированное приложение, используя простые в использовании компоненты JSF.
- JSF имеет встроенную возможность валидировать поля форм, конвертировать string поля ко многим другим типам данных. Если валидация/конвертация прошла с ошибкой, форма может быть автоматически показана с ошибкой вместе с предыдущими установленными значениями. Валидация/конвертация проходит на серверной стороне.
- Хотя у JSP есть jsp:include тег для вставки контента, однако JSF имеет полноценную поддержку системы шаблонизации страниц, которая позволяет создавать макет страницы, либо ее часть для дальнейшего использования.
- Централизованная файловая конфигурации JSF, что позволяет вместо жесткого кодирования данных в программе Java выносить ее в конфигурационный файл. Что позволяет без редактирования Java кода и перекомпиляции изменить эти данные.
- В JSF также можно использовать MVC подход.
- Быстрая и легкая разработка со старта.
- Если у вас уже есть приложение, которое написано на servlet + jsp, и у вас есть необходимость сделать в нем некоторый AJAX функционал, то гораздо проще использовать, например, Jquery (если вы знаете JavaScript), чем перевести это приложение на JSF.
- По сравнению с JSP и servlet на JSF написано заметно меньше документации.
- У JSF приложения есть много моментов, которые тяжело отследить, понять и оптимизировать, например генерация html/css/javascript кода выбранным компонентом, и др.
- Существует большое количество IDE, которые поддерживают стандартный JSP и servlet, однако JSF 2 начали поддерживать недавно, так как это достаточно новая технология. Последний на данный момент релиз JSF 2 был выпущен 2009-06-28.
- Поддержка REST находится на стадии разработки. Посмотреть спецификацию можно тут.
На мой взгляд, JSF 2 лучше использовать:
- Когда проект только начался.
- Вам необходимо использовать отправку данных на сервер, при этом использовать серверную валидацию/конвертацию.
- AJAX.
- Богатый выбор готовых компонентов (PrimeFaces, ICEfaces, RichFaces, PrettyFaces, OpenFaces и др).
- Вы не хотите писать много JavaScript кода.
Сравнение JSF 2 с JSF 1.2
Новые возможности JSF 2 по сравнению с JSF 1.2:- Библиотека facelets и View Declaration Language.
- Composite Components.
- Ajax.
- Частичное сохранение состояния (State Saving).
- System Events.
- Улучшенная навигация.
- Поддержка GET.
- View Scope.
- Flash Scope.
- Custom Scopes.
- Аннотации над Managed Bean.
- Аннотации над компонентами.
Пример приложения на JSF 2
Описание приложения:- Функциональность.
- Ввеcти идентификатор клиента.
- Показать имя, фамилию, и баланс банковского счета клиента с указанным ID.
- Показать сообщение об ошибке, если ID не существует.
- Цели.
- Не перегружая страницы показать результат действия.
- Использование стандартных JSF компонентов без применения JavaScript.
- Подход.
- Использование JSF 2 <f:ajax> тега.
POJO класс:
Вариант с использованием JSP + servlet будет выглядеть так:
Итоги
Кому интересна данная технология, тому я рекомендую посмотреть проект Scrum Toys.
График сравнения спроса по технологиям jsf, struts, spring mvc, gwt:Рабочий demo проект, который я описывал в данной статье, можно скачать здесь.
Для запуска проекта в системе обязательно должен быть установлен maven. Проект запускается с помощью команды: 'mvn jetty:run'. После запуска проекта его можно посмотреть, перейдя по адресу: 'http://localhost:8080/bank-example/'.
В целом же, забигая вперед, библиотеки jsf-api.jar и jsf-impl.jar нужны, если вы используйте контейнер Tomcat 6/7. Если же вы используйте сервер Java EE 6(например Glassfish 3, JBoss 6, WebLogic 11g ...), то он уже имеет встроенную поддержку JSF 2.0.
Также к статье я приложил небольший JSF 2 Reference Card, который можно скачать здесь.
Благодарю за внимание.
Литература
Java на habrahabr
JAVA / [Из песочницы] Metawidget — инструмент, гнерирующий Java формы
Привет читатель.
Хочу рассказать про инструмент для Java на который я недавно наткнулся и не нашел на хабре ни одного упоминания о нем. Называется он Metawidget и его предназначение — генерировать формы в Java.
ru.java на livejournal
Шифрование данных с JSF
Добрый день, можно ли в JSF (с использованием каких-либо фреймвёрков, и с небольшим гемором) реализовать шифрование данных между браузером и сервером (всех)?
поиск google 'jsf encrypt' ничего не дал
кроме ssl.
что-то вроде джаваскриптом перед сабмитом формы зашифровать всё, и на сервере вклиниться в цикл jsf'а, и расшифровать?
Теги:
jsf