Технологии рендеринга страниц
Реализация JSF Mojarra позволяет создавать страницы с помощью технологии Facelets или JSP. Facelets – это страницы в формате XHTML, в то время как JSP – они и в Африке JSP. Sun (Oracle) рекомендует использовать Facelets (страницы xhtml) так как они быстрее рендерятся движком JSF, что значительно сказывается на быстродействии всего web-приложения а также поддерживают технологию шаблонов “из коробки”.
Комфортная разработка
В JSF 2 адаптировали одну из идей Ruby On Rails. Существует настройка, которая определяет режим работы приложения: режим разработки, режим тестирования и продакшн режим. В режиме разработки, программист получает подробный вывод об исключительной ситуации на JSF-страницу. Помимо стэк-трэйса выводится дерево компонентов и список Scoped Variables (переменных с областью действия scope).
Выглядит это так (щелкните чтобы увеличить):
Здесь я пытаюсь взять из ресурсного бандла ресурс hello.worl, который не существует. По умолчанию JSF 2 работает в режиме Production. Режим Development включается с помощью контекстного параметра в web.xml:
<context-param> <param-name>javax.faces.PROJECT_STAGE</param-name> <param-value>Development</param-value> </context-param>
Поддержка Groovy
Mojarra поддерживает Groovy для реализации управляемых бинов и компонентов. Groovy – это динамический язык. Благодаря Groovy можно значительно увеличить скорость разработки. Как это сделать читатйте в статье “Groovy на практике: сокращение кода с помощью Groovy” на сайте IBM.
Поддержка Ajax
JSF 2 предоставляет ряд функций для поддержки Ajax. Одна из особенностей – так называемая частичная визуализация (partial rendering). Вместо обновления всей страницы, рендерится только необходимая часть, которая затем вставляется в текущую страницу. Обычный updater из JQuery, но уже встроенный в фреймворк и настроенный на работу с ним.
Для работы с Ajax в JSF 2 введен новый тэг
<f:ajax>который добавляет функциональность Ajax в существующие компоненты. В следующем блоке кода в качестве примера приводится Ajax-кнопка при щелчке на которой JSF отправляет Ajax-запрос слушателю действий actionListener, методу increase из класса AjaxBean, который в свою очередь изменяет значение счетчика, в результате чего, значение в компоненте outputText изменяется на новое.
<h:form id="formId"> The counter value is <h:outputText value="#{ajaxBean.counter}" id="counter"/> <h:commandButton actionListener="#{ajaxBean.increase}" value="Ajax call"> <f:ajax render="counter" /> </h:commandButton> </h:form>
Замечание: если изменяемый компонент и компонент, отправляющий Ajax-запрос, находятся на разных уровнях вложенности, то необходимо указать полный путь до изменяемого компонента. Например:
... <f:ajax render=":foo:counter"/> ... <h:form id="foo"> <h:outputText value="#{ajaxBean.counter}" id="counter"/> </h:form>
Если отключить JavaScript в браузере, то компоненты будут вести себя как обычные (не Ajax), т.е., например, кнопка будет выполнять обычную отправку формы на сервер.
Еще один интересный атрибут тэга f:ajax – execute. Он посылает Ajax-запрос и обрабатывает жизненный цикл только указанных компонентов. Следующий код выполнит все проверки и перерендерит тэг h:messages чтобы отобразить ошибки.
<h:inputText id="age" value="#{ajaxValidation.age}" required="true"> <f:validateDoubleRange minimum="5" maximum="99"/> <f:ajax execute="age" event="blur" render="age-error"/> </h:inputText> <h:messages id="age-error" for="age"/>
Обработка CSS и JavaScript
В JSF ресурсами может быть все что угодно, например скрипты JavaScript, таблицы стилей CSS, картинки и т.д. Следующий тэг добавляет test.js в head страницы независимо от того, где он объевлен.
<h:outputScript library=“js” name=“test.js” target=“head”/>Ресурсы нужно хранить в каталоге resources в корне web-приложения или в META-INF/resources, который находится в classpath приложения. Однако, лучше группировать ресурсы в библиотеки. Библиотека в терминах JSF 2 – это подкаталог в каталоге resources. Вот пример структуры каталогов:
webroot/resources/css/default.css webroot/resources/images/foo.gif webroot/resources/images/bar.gif webroot/resources/js/myscript.js
К библиотеке можно добавить версии и локали. Это очень гибкий подход для обработки различных версий и регионально зависимых ресурсов. Например:
webroot/resources/de/js/default.js/1.0.js webroot/resources/de/js/default.js/1.1.js webroot/resources/en/js/default.js/1.0.js
Пользователи с локалью (de) будут использовать следующий тэг, который будет отдавать последню версию немецкого скрипта default.js.
<h:outputScript library="js" name="default.js" />Также можно указать версию ресурса:
<h:outputScript library="js" resourceVersion="1.0" name="default.js" />Безопасность
Реализация JSF Mojarra не предоставляет каких-либо серьезных средств безопасности, но легко интегрируется с Spring Security, а при использовании JSF с JBoss Seam, можно использовать его (Seam) функции обеспечения безопасности. Оба подхода позволяют защищать страницы и методы, а Spring даже предоставляет поддержку обеспечения безопасности домена (доменной модели). Это значит что можно проверить, имеет ли пользователь права на объект, возвращаемый каким-либо методом. Информация о правах доступа хранится в очень простой форме. Каждый объект должен иметь уникальный идентификатор(id), а класс, id объекта, и id пользователя и его прав доступа (чтение, запись, удаление и т.д.) хранятся в базе данных. Метод-перехватчик проверяет возвращаемые другим методом объекты и принимает соответствующие решения.
Такой подход к обеспечнию безопасности может быть избыточным для некоторых приложений, поэтому есть более простой способ, предоставляемый средствами JSF Mojarra. Этот способ описан в статье “Improving JSF Security Configuration With Secured Managed Beans“. В описанном в этой статье способе используются глобальные слушатели действий и пользовательские обработчики навигации. Глобальный слушатель вызывается до выполнения вызываемого метода. Он проверяет, имеет ли пользователь необходимые права (роли) для доступа к методу. Необходимые роли могут быть определены при помощи аннотаций к методу. Например:
@SecurityRoles("customer-admin-adv, root") public String delete() { System.out.println("I'm a protected method!"); return "delete-customer"; }
Этот подход хорош тем, что очень прост, но в тоже время отлично делает свое дело.
Достоинста JSF
- Много поставщиков решений (Oracle, IBM, JBoss и т.д.), реализующих в своих продуктах поддержку JSF, поэтому можно ожидать хороший уровень поддержки и качества компонентов.
- JSF позволяет создавать повторно используемые компоненты, что способствует повышению производительности.
- Много готовых к использованию компонентов от серьезных разработчиков: Apache, Richfaces, Infragistics, Oracle, и т.д.
- Хорошо продуманная концепция слушателей действий.
- Отличная реализация концепций валидаторов и конверторов. В отличие от Struts, JSF хранит логику валидации в непосредственной близости от описания компонента.
- Внедряемый в компоненты JavaScript код и отличная поддержка Ajax.
Недостатки JSF
С недостатками JSF я пока плохо знаком, читал лишь только что есть какие-то сложности с логированием JSF-web-приложений.
В Internet много статей типа “Advantages and Disadvantages JSF”, однако практически все они о ранних версиях JSF. В версии 2.0 все недостатки, описывемые в этих статьях исправлены. А в остальном, видимо народ еще не достаточно разобрался с JSF 2.
В этой статье мы рассмотрели несколько положительных особенностей JSF Mojarra, но толком не рассмотрели ни одного недостатка. Надеюсь исправить это упущение в следующих постах.



#1 by Alex on 8 Апрель 2010 - 11:06
Quote
Плиз!Расскажите в след. статье о Facelets.
#2 by Дмитрий Леонтьев on 8 Апрель 2010 - 14:21
Quote
Рассказал о Facelets в JSF 2
#3 by Armen on 25 Май 2010 - 12:05
Quote
Я думаю что JSF это та технология каторое нужно програмисту: JSF 1.2/2.0(apache myfaces)+Tomahawk Myfaces+Richfaces+Facelets, это мощний фронтенд. Алтернативи пока нету.
#4 by Armen on 25 Май 2010 - 12:08
Quote
http://armdev.blog.ru/ я немного понаписал в моем блоге
#5 by amarkhel on 26 Август 2010 - 14:30
Quote
Главный недостаток JSF, прожорливость ресурсов, так и не был исправлен, и честно говоря не видно как он может быть исправлен. JSF прекрасно подходит для корпоративных приложений, но для паблик сайтов – не очень.
#6 by Дмитрий Леонтьев on 27 Август 2010 - 8:38
Quote
Я думаю что JSF и не задумывался изначально для создания паблик-сайтов. Это корпоративная технология. А если посмотреть на рекомендуемые системные требования серверов приложений, то и вовсе диву даешься.
Для Glassfish:
Minimum Memory 512 MB
Recommended Memory 1 GB
Minimum Disk Space 250 MB free
Recommended Disk Space 500 MB free
Источник: http://docs.sun.com/app/docs/doc/820-4494/abpaj?l=en&n=1&a=view
У JBoss примерно такие же требования к аппаратным ресурсам.
#7 by handsOff MySis on 14 Октябрь 2010 - 18:43
Quote
мужик. ты тащишь
добавил в закладки. приятный с виду блог. хорошо составленные статьи. жги еще )
#8 by arivlav on 9 Январь 2011 - 17:25
Quote
Офигенный блог! Дмитрий не могли бы вы рассказать как работать с базами данных в jsf 2.0
#9 by Victor on 13 Январь 2011 - 16:22
Quote
капец причем тут jsf и базы данных…
#10 by Masterov Alexander on 1 Март 2011 - 14:42
Quote
Недостатки JSF:
1. Сложность в использовании даже для опытного программиста. Слишком много всего нужно знать и уметь, чего знать и учиться уметь не хочется. (Инструмент должен быть простым, а для этого он должен быть узкоспециальным, либо – представлять собой – набор инструментов.)
2. Отсутствие аренды хостинга, на котором поддерживалась бы JSF.
#11 by Armen on 7 Март 2011 - 0:34
Quote
Reply to Masterov Alexander..
1. Pervi raz slishu chto JSF takoj slojni, da nado mnogo znat, no esli mnogo ne znat nichego ne vozmojno pisat. JSF odnovremenno sljni, no ochen dostupni, bistraja razrabotka obespechena, tam vse est, i validatori, convertor-i……
2. Pro xosting, ochen smeshno, podejdet ljubuj java xosting+tomcat.
I pro to chto JSF upotrebljaejt mnogo memory.
a/v JSF 2.0 eto stalo menshe v dvoe…
b/ ja ne dumaju chto ljuboj sajt tipa facebook, odnoklassniki, ili youtube, potrebljajut menshe memory server side, ljubaja texnologija jret memory na odnogo usera, smotrja chto delaetsja v server side….
Ljuboj normalni sajt potrebljaet minmium 1 Gb memory, nu esli eto ne kakoj nibud blogik….
3. JSF ne tolko korporativni, est mnogo sitov na jSF, daje dating sajti, naprimer krupnaja kompanija http://corporate.be2.com/ vse ego sajti pod JSF ! tolko eto oprovergaet vse,
esho odin naprimer
http://eva.ru/jsf/login-view.jsf
JSF 2.0 eto to chto nujno programistu na web, ostaline texnologii tipo struts, tapestry ostajut ochen mnogo
Est odno pravilo – nado pravilno napisat, ploxomu tancoru nogi meshajut
#12 by Slave on 22 Август 2011 - 14:05
Quote
“Главный недостаток JSF, прожорливость ресурсов, так и не был исправлен, и честно говоря не видно как он может быть исправлен.”
если руки из жопы растут, то конечно JSF прожорливый. Вообще миф о прожорливости распространен среди тех кто с фреймворком толком не работал
#13 by деф on 25 Апрель 2012 - 16:17
Quote
JSF это вообще технолог. прорыв в разработке web app уровня предприятий. Альтернативы в JEE НЕТ!