Java на habrahabr

Декабрь 6, 2011

 

JAVA / [Опрос] Какие библиотеки компонент вы бы использовали на старте нового JSF проекта?

Java на habrahabr

Декабрь 4, 2011

 

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 месяцев.

ru.java на livejournal

Май 3, 2011

 

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 (реализована трассировка вызовов) можно скачать здесь. Для того, чтобы можно было запустить данное приложение, нам необходимо:

  • Java SDK
  • Maven
  • По отношению к предыдущему примеру приложения, который был приложен к прошлой статье, в этом сделаны следующие изменения:

    • Добавлена поддержка AOP (при компиляции проекта используется плагин aspectj-maven-plugin)
    • Добавлена локализация валидаторов, которые указываются через аннотации над полями POJO классов
    • Добавлены юнит-тесты
    • Улучшен код

    Статью на русском языке по AOP можно посмотреть здесь. Презентацию по AOP можно скачать здесь. Reference Card к библиотеки AspectJ™ 5 можно скачать здесь.

    Для тех, кто всё же заинтересовался технологией JSF 2, хотелось бы обратить внимание на одно из лучших обучающих руководств для быстрого и качественного вхождения в понимания и работу технологии. Это руководство можно посмотреть здесь. Много нестандартных ситуаций, с которыми можно столкнуться при работе с JSF 2, хорошо описаны здесь. Другие, не менее достойные, источники приведены в предыдущих моих статьях (первая и вторая).

    Благодарю за внимание.

    Литература

  • http://en.wikipedia.org/wiki/Aspect-oriented_programming
  • http://www.eclipse.org/aspectj/doc/released/adk15notebook/index.html
  • ru.java на livejournal

    Апрель 1, 2011

     

    Знакомство с 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 подход.
    • Быстрая и легкая разработка со старта.
    Недостатки JSF 2 по сравнению с MVC (servlet + jsp):
    • Если у вас уже есть приложение, которое написано на 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 класс:
  • public class BankCustomer implements Serializable
  • {
  •     private static final long serialVersionUID = -7049641989661118136L;
  •     private int id;
  •     private String firstName, lastName, password;
  •     private double balance;
  •    
  •     // Getters/Setters for instance variables
  •     ...
  • }
  • DAO класс - модель (Model) в MVC:
  • public class BankCustomerLookup implements Serializable
  • {
  •     private static final long serialVersionUID = -6263276550285838301L;
  •     private static int serial;
  •     private static Map&lt;Integer, BankCustomer&gt; customers;
  •    
  •     static
  •     {
  •         // Populate map with some sample customers
  •     }
  •    
  •     public static BankCustomer getCustomer(Integer id)
  •     {
  •         return customers.get(id);
  •     }
  •    
  •     ...
  • }
  • Managed bean класс - поведение (Controller) в MVC:
  • @ManagedBean(name = "bankingBeanAjax")
  • @SessionScoped
  • public class BankingBeanAjax implements Serializable
  • {
  •     private static final long serialVersionUID = -4168278299644178280L;
  •     private String message;
  •     private Integer customerId;
  •     private String password;
  •     private String tooltip;
  •    
  •     public void showBalance(ActionEvent actionEvent)
  •     {
  •         BankCustomer customer = BankCustomerLookup.getCustomer(customerId);
  •        
  •         if (customer == null)
  •         {
  •             message = "Unknown customer";
  •         }
  •         else if (!customer.getPassword().equals(password))
  •         {
  •             message = "Incorrect password";
  •         }
  •         else
  •         {
  •             message = String.format("Balance for %s %s is $%,.2f",
  •             customer.getFirstName(), customer.getLastName(),
  •             customer.getBalance());
  •         }
  •     }
  •    
  •     // Getters/Setters for instance variables
  •     ...
  • }
  • JSF страница - представление (View) в MVC:
  • ...
  • <h:form>
  • Customer ID: <h:inputText value="#{bankingBeanAjax.customerId}"
  •         required="true"
  •         requiredMessage="You did not specify an id. (The id parameter is missing)"
  •         converterMessage="Invalid id. (The id parameter is not a number)"
  •         validatorMessage="Invalid id. (The id parameter is not a positive number)">
  •         <f:validateLongRange minimum="0" />
  •     </h:inputText>
  •     <br />
  •    
  • Password: <h:inputSecret value="#{bankingBeanAjax.password}" />
  •     <br />
  •     <h:commandButton value="Show Current Balance"
  •         actionListener="#{bankingBeanAjax.showBalance}">
  •         <f:ajax execute="@form" render="ajaxMessage :applicationMessages" />
  •     </h:commandButton>
  •     <br />
  •  
  •     <h3>
  •         <h:outputText id="ajaxMessage" value="#{bankingBeanAjax.message}" />
  •     </h3>
  • </h:form>
  • <br />
  • <h:messages id="applicationMessages" style="color: red;" />
  • ...
  • Схематично работу этого приложения можно показать следующим образом:


    Вариант с использованием 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, который можно скачать здесь.

    Благодарю за внимание.

    Литература

  • http://balusc.blogspot.com/
  • http://www.laliluna.de/articles/jsf-2-evaluation-test.html
  • http://www.mkyong.com/tutorials/jsf-2-0-tutorials/
  • http://www.coreservlets.com/JSF-Tutorial/jsf2/
  • http://andyschwartz.wordpress.com/2009/07/31/whats-new-in-jsf-2/
  • Java на habrahabr

    Февраль 20, 2011

     

    JAVA / [Из песочницы] Metawidget — инструмент, гнерирующий Java формы

    Привет читатель.
    Хочу рассказать про инструмент для Java на который я недавно наткнулся и не нашел на хабре ни одного упоминания о нем. Называется он Metawidget и его предназначение — генерировать формы в Java.

    ru.java на livejournal

    Июль 23, 2010

     

    Шифрование данных с JSF

    Добрый день, можно ли в JSF (с использованием каких-либо фреймвёрков, и с небольшим гемором) реализовать шифрование данных между браузером и сервером (всех)?

    поиск google 'jsf encrypt' ничего не дал

    кроме ssl.

    что-то вроде джаваскриптом перед сабмитом формы зашифровать всё, и на сервере вклиниться в цикл jsf'а, и расшифровать?