Каковы основные недостатки Java Server Faces 2.0?


вчера я видел презентацию на Java Server Faces 2.0, которая выглядела действительно впечатляюще, хотя в настоящее время я счастлив ASP.NET разработчик MVC / jQuery. Что мне больше всего понравилось в JSF, так это огромное количество компонентов пользовательского интерфейса с поддержкой AJAX, которые, похоже, делают разработку намного быстрее, чем с помощью ASP.NET MVC, особенно на AJAX-тяжелых сайтах. Интеграционное тестирование тоже выглядело очень красиво.

поскольку презентация только подчеркнула преимущества JSF, я хотел бы услышать о другом и сбоку тоже.

Итак, мои вопросы:

  • каковы основные недостатки Java Server Faces 2.0?
  • что может заставить разработчика JSF рассмотреть возможность использования ASP.NET MVC вместо JSF?
13 226

13 ответов:

недостатки JSF 2.0? Честно говоря, помимо относительной крутой кривой обучения, когда у вас нет твердых фоновых знаний о основные веб-разработки (HTML / CSS / JS, серверная сторона против клиентской стороны и т. д.) и базовый Java Servlet API (запрос/ответ/сеанс, пересылка/перенаправление и т. д.), Никаких серьезных недостатков не приходит на ум. JSF в своем текущем выпуске Все еще нуждается в избавлении от негативного образа, который он получил в раннем возрасте, во время которого было несколько серьезных недостатков.

JSF 1.0 (март 2004)

это был первый выпуск. Он был загроможден ошибками как в основных, так и в рабочих областях, о которых вы не хотите знать. Ваше веб-приложение не всегда работает так, как вы интуитивно ожидаете. Вы, как разработчик, убежали бы от плача.

JSF 1.1 (май 2004)

это был выпуск исправления. Производительность все еще не сильно улучшилась. Был также один крупный недостаток: вы не можете встроить HTML в страницу JSF безупречно. Все обычные HTML были оказаны до дерево компонентов JSF. Вам нужно завернуть всю простую ваниль в <f:verbatim> теги, чтобы они были включены в дерево компонентов JSF. Хотя это было согласно спецификации, это получило много критики. См. также.о'. JSF/Facelets: почему не рекомендуется смешивать JSF / Facelets с тегами HTML?

JSF 1.2 (май 2006)

<f:verbatim> теги. Еще одним важным направлением работы новой команды было улучшение производительность. В течение всего срока службы Sun JSF Reference Implementation 1.2 (который был кодовым именем Mojarra начиная с сборки 1.2_08, около 2008 года), практически каждая сборка была отправлена с (основными) улучшениями производительности рядом с обычными (незначительными) исправлениями.

единственный серьезный недостаток JSF 1.x (включая 1.2) - это отсутствие области между запрос и сессии сфера, так называемая разговор масштаб. Это заставило разработчиков возиться со скрытыми элементами ввода, ненужными запросами БД и/или злоупотреблять областью действия сеанса всякий раз, когда нужно сохранить исходные данные модели в последующем запросе, чтобы успешно обрабатывать проверки, преобразования, изменения модели и вызовы действий в более сложных веб-приложениях. Боль можно смягчить, приняв стороннюю библиотеку, которая сохраняет необходимые данные в последующем запросе, например MyFaces Tomahawk <t:saveState> компонент JBoss Шов объем разговоре и MyFaces Orchestra разговор рамок.

еще один недостаток для HTML / CSS пуристов является то, что JSF использует двоеточие : как символ разделителя идентификаторов для обеспечения уникальности HTML-элемента id в сгенерированном HTML-выводе, особенно когда компонент повторно используется более одного раза в представлении (шаблоны, итерационные компоненты и т. д.). Потому что это незаконный символ в идентификаторах CSS, вам нужно будет использовать \ чтобы избежать двоеточия в селекторах CSS, что приводит к уродливым и странным селекторам, таким как #formId\:fieldId {} или даже #formIdA fieldId {}. Смотрите также как использовать JSF generated HTML element ID с двоеточием": "в селекторах CSS? однако, если вы не пурист, Читайте также по умолчанию JSF генерирует непригодные идентификаторы, которые несовместимы с css частью веб-стандартов.

кроме того, JSF 1.x не поставлял с Ajax-оборудованием из коробки. Не реально технический недостаток, но из-за шумихи Web 2.0 в этот период он стал функциональным недостатком. Exadel было рано вводить Ajax4jsf, который был тщательно разработан в течение многих лет и стал основной частью С JBoss RichFaces библиотеки компонентов. Еще одна компонентная библиотека также была поставлена со встроенными возможностями Ajax, хорошо известным из которых является ICEfaces.

примерно на полпути жизни JSF 1.2, новый XML на основе технология просмотра была введена: Facelets. Это давало огромные преимущества перед JSP, особенно в области шаблонов.

JSF 2.0 (июнь 2009)

это был второй крупный релиз, с Ajax в качестве модного слова. Было много технических и функциональных изменений. JSP заменяется Facelets как технология представления по умолчанию и Facelets был расширен с возможностями для создания пользовательских компонентов с использованием чистого XML (так называемый композитный компоненты). Смотрите также почему Facelets предпочтительнее JSP в качестве языка определения представления от JSF2. 0 и далее?

Ajax полномочия были введены в аромате <f:ajax> компонент, который имеет много общего с Ajax4jsf. В убить многословный faces-config.xml файл как можно больше. Кроме того, символ разделителя идентификатора контейнера именования по умолчанию : стал настраивать, так что пуристы HTML / CSS могли вздохнуть с облегчением. Все, что вам нужно сделать, это определить его как init-param на web.xml на имя javax.faces.SEPARATOR_CHAR и убедитесь, что вы не используете символ самостоятельно в любом месте идентификатора клиента, например -.

наконец, была введена новая область, view объем. Он устранил еще один крупный JSF 1.х недостаток, как описано выше. Вы просто объявляете Боб @ViewScoped чтобы включить область разговора, не беспокоя все пути чтобы сохранить данные в последующих (разговорных) запросах. А @ViewScoped bean будет жить до тех пор, пока вы впоследствии отправляете и переходите к тому же представлению (независимо от открытой вкладки/окна браузера!), либо синхронно, либо асинхронно (Ajax). Смотрите также разница между представлением и областью запроса в управляемых компонентах и Как выбрать правильный объем фасоли?

хотя практически все недостатки JSF 1.x были устранены, есть JSF 2.0 конкретные ошибки, которые могут стать showstopper. Элемент @ViewScoped сбой в обработчиках тегов из-за проблемы с куриным яйцом в частичном сохранении состояния. Это исправлено в JSF 2.2 и обратно в Mojarra 2.1.18. Также передача пользовательских атрибутов, таких как HTML5 data-xxx не поддерживается. Это исправлено в JSF 2.2 новой функцией passthrough elements / attributes. Далее реализация JSF Mojarra имеет свой собственный набор проблем. Относительно много из них связаны с иногда неинтуитивное поведение <ui:repeat> на новая реализация частичного сохранения состояния и плохо реализованный flash scope. Большинство из них зафиксированы в Mojarra 2.2.x версия.

вокруг времени JSF 2.0,PrimeFaces был введен, основанный на jQuery и jQuery UI. Он стал самой популярной библиотекой компонентов JSF.

JSF 2.2 (май 2013)

С введение JSF 2.2, HTML5 был использован в качестве модного слова, хотя это было технически просто поддерживается во всех старых версиях JSF. Смотрите также JavaServer сталкивается с поддержкой 2.2 и HTML5, почему XHTML все еще используется. Наиболее важной новой функцией JSF 2.2 является поддержка пользовательских атрибутов компонентов, тем самым открывая целый мир возможностей, таких как пользовательские группы переключателей без таблиц.

помимо реализации конкретных ошибок и некоторых " раздражающих мелочи", такие как невозможность ввести EJB в валидатор/конвертер (уже исправленный в JSF 2.3), в спецификации JSF 2.2 нет действительно серьезных недостатков.

компонент на основе MVC vs запрос на основе MVC

некоторые могут выбрать, что основным недостатком JSF является то, что он позволяет очень мало мелкозернистого контроля над сгенерированным HTML/CSS/JS. Это не собственный JSF, это просто потому, что это компонент на основе MVC framework, а не a запрос (действие) на основе MVC framework. Если высокая степень управления HTML / CSS/JS является вашим основным требованием при рассмотрении структуры MVC, то вы уже должны смотреть не на компонентную структуру MVC, а на структуру MVC на основе запроса, например Spring MVC. Вам нужно только принять во внимание, что вам придется написать весь этот шаблон HTML/CSS/JS самостоятельно. Смотрите также разница между запросом MVC и компонентом MVC.

Читайте также:

после 5 лет работы с JSF, я думаю, что я могу добавить свои 2 цента.

два майор JSF недостатки:

  1. большой кривой обучения. JSF сложен, это просто правда.
  2. его компонент природа. Компонентный фреймворк пытается скрыть истинную природу сети, которая поставляется с огромным количеством осложнений и катастроф (например, не поддерживает GET в JSF в течение почти 5 лет).
    ИМХО скрывает HTTP Запрос/ответ от разработчика-это огромная ошибка. По моему опыту, каждая компонентная структура добавляет абстракцию в веб-разработку, и эта абстракция приводит к ненужным накладным расходам и более высокой сложности.

и несовершеннолетний недостатки, которые приходят мне в голову:

  1. по умолчанию идентификатор объекта состоит из идентификаторов его родителей, например form1:button1.
  2. нет простого способа прокомментировать неверную страницу фрагмент. Тег <ui:remove> требуется синтаксически правильное содержание, которое анализируется в любом случае.
  3. низкое качество сторонних компонентов, которые, например, не проверяют isRendered() внутри processXxx() метод, прежде чем продолжить.
  4. включение меньше и Сенча трудно.
  5. не очень хорошо играет с отдыхом.
  6. не так просто для дизайнеров UX, потому что готовые к использованию компоненты имеют свои собственные стили CSS, которые необходимо перезаписать.

не вам я ошибаюсь. В качестве компонентного фреймворка JSF в версии 2 действительно хорош, но он по-прежнему основан на компонентах и всегда будет...

обратите внимание на низкую популярность гобелена, калитки и низкий энтузиазм опытных разработчиков JSF (что еще более значимо). А для контраста взгляните на успех Rails, Grails, Django, Play! Фреймворк-все они основаны на действиях и не пытаются скрыться от программиста истинный запрос/ответ и без гражданства природа веб.

для меня это главный недостаток JSF. IMHO JSF может подходит для некоторых типов приложений (интранет, интенсивные формы), но для реальной жизни web применение это не очень хороший способ пойти.

надеюсь, что это поможет кому-то с его / ее выбором, что касается переднего плана.

несколько недостатков, которые приходят на ум:

  1. JSF-это компонентная структура. Это неотъемлемые ограничения, которые имеют отношение к подчинению компонентная модель.
  2. AFAIK JSF поддерживает только пост, так что если вы хотите получить где-то у вас есть чтобы сделать простой сервлет / JSP.
  3. большинство компонентов пытаются предоставить абстракции над доменами, такими как реляционные базы данных и интерфейсы JavaScript, и много раз эти абстракции являются "дырявыми" и очень трудно отлаживать.
  4. эти абстракции могут быть хорошей отправной точкой для младшего разработчика или кого-то, кому не нравится конкретный домен (например, интерфейсный JavaScript), но их очень трудно оптимизировать для производительности, поскольку есть несколько уровней, и большинство людей, которые их используют, мало понимают, что происходит под капотом.
  5. шаблонизатор механизмы, которые обычно используются с JSF не имеют ничего общего с тем, как веб-desigers работы. редактор WYSIWYG для JSF примитивны, и в любом случае ваш дизайнер даст вам HTML/CSS, который вам придется потратить на преобразование возрастов.
  6. такие вещи, как выражения EL, не проверяются статически, и как компилятор, так и IDE не выполняют хорошую работу по поиску ошибок, поэтому вы в конечном итоге получите ошибки, которые вам придется поймать во время выполнения. Это может быть хорошо для динамически типизированного языка, такого как Ruby или PHP, но если мне нужно противостоять явному раздуванию экосистемы Java, я требую ввода для моего шаблоны.

подведем итоги: время, которое вы сэкономите с помощью JSF, чтобы избежать написания кода шаблона JSP/servlet/bean, вы потратите его x10, чтобы сделать его масштабным и сделать именно то, что вы хотите.

для меня самым большим недостатком JSF 2.0 является кривая обучения не только JSF, но и библиотеки компонентов, которые вы должны использовать, чтобы заставить его выполнять полезную работу. Рассмотрим ошеломляющее количество спецификаций и стандартов, с которыми вы имеете дело, чтобы действительно быть опытным:

  • HTML в различных воплощениях. Не притворяйся, что тебе не нужно это знать.
  • HTTP -- когда вы не можете понять, что происходит, вы должны открыть Firebug и посмотреть. Для что тебе нужно это знать.
  • CSS -- нравится это или нет. Это не так уж плохо на самом деле, и есть некоторые хорошие инструменты там, по крайней мере.
  • XML -- JSF, вероятно, будет первым местом, где вы используете пространства имен в этой степени.
  • Спецификация Сервлетов. Рано или поздно вы попадете в вызов методов в этом пакете. Кроме того, вы должны знать, как ваши Facelets превращается в XHTML или что-то еще.
  • JSP (в основном, чтобы вы знали, почему вам это не нужно JSF)
  • JSTL (опять же, в основном, чтобы справиться с устаревшей структурой)
  • язык выражений (El) в его различных формах.
  • ECMAScript, JavaScript, или как еще вы хотите это назвать.
  • в формате JSON, вы должны знать это, даже если вы не используете его.
  • AJAX. Я бы сказал, что JSF 2.0 делает достойную работу, скрывая это от вас, но вам все равно нужно знать, что происходит.
  • дом. И как браузер использует его. Видеть ECMAScript.
  • DOM события -- тема сама по себе.
  • Java Persistence Architecture (JPA), то есть если вы хотите, чтобы ваше приложение имело какую-либо внутреннюю базу данных.
  • сама Java.
  • JSEE, пока вы на нем.
  • спецификация инъекции зависимостей контекста (CDI) и то, как она сталкивается и используется с JSF 2.0
  • JQuery -- я бы хотел, чтобы вы обошлись без него.

теперь, как только вы закончите с что вы можете получить с проприетарными спецификациями, а именно библиотек компонентов и библиотек поставщиков вы будете подбирать по пути:

  • PrimeFaces (моя библиотека компонентов выбора)
  • RichFaces
  • MyFaces
  • ICEFaces
  • EclipseLink (мой провайдер JPA)
  • Hibernate
  • сварка

и не забудьте контейнер! И все эти конфигурации файлы:

  • сервер приложений GlassFish (2, 3 и т. д.)
  • JBoss
  • котяра

Итак -- это делает его легким? Конечно, JSF 2.0 "прост", если все, что вы хотите сделать, это самые простые веб-страницы с простейшими взаимодействиями.

  1. неопытные разработчики обычно создают приложения, которые мучительно медленны, а код будет действительно уродливым и трудным в обслуживании. Его обманчиво просто начать, но на самом деле требует некоторых инвестиций в обучение, если вы хотите писать хорошие программы.
  2. по крайней мере, в начале вы часто "застряли" на какой-то проблеме и будете тратить больше времени на чтение сообщений balusc в интернете, чем на самом деле работает :) через некоторое время это будет все меньше и меньше, но это все еще может быть раздражающий.
  3. еще больше раздражает, когда вы узнаете, что проблема не из-за отсутствия знаний/ошибки, а на самом деле ошибка. Мохарра была(есть?) довольно глючит, а еще один слой компонентов добавляет еще больше проблем. Richfaces был самым большим куском дерьма программного обеспечения когда-либо написанного :) не знаю, как это теперь на версии 4. У нас есть Primefaces, который лучше, но все же вы столкнетесь с ошибками или отсутствием функций, особенно с более экзотическими компонентами. И теперь вам нужно будет заплатить за На основе схемы PrimeFaces обновления. Поэтому я бы сказал, что его багги, но он становится лучше, особенно после того, как версия 2.2 исправила некоторые проблемы со спецификацией. Рамки становятся более зрелыми, но все еще далеки от совершенства (может быть, myfaces лучше?).
  4. Я не считаю его особенно гибким. Часто, если вам нужно что - то очень очень настроенное и нет никаких компонентов, которые это делают-это будет немного больно. Опять же, я говорю со средней точки зрения разработчика - с крайними сроками, быстрыми учебниками по чтению и поиск stackoverflow при застревании, потому что нет времени, чтобы узнать, как это действительно работает :) часто некоторые компоненты, кажется, имеют "почти" то, что вам нужно, но не совсем, и иногда вы можете потратить слишком много времени, чтобы заставить его делать то, что вы хотите :) нужно быть осторожным в оценке, если его лучше создать свой собственный или пытать существующий компонент. На самом деле, если вы создаете что-то действительно уникальное, я бы не рекомендовал JSF.

короче говоря, мои недостатки будут: сложность, Не очень плавный ход развития, глючный, негибкий.

конечно есть плюсы, но это не то, что вы просили. В любом случае, это мой опыт работы с фреймворком, у других могут быть разные мнения, поэтому лучший способ - просто попробовать его на некоторое время, чтобы увидеть, подходит ли он для вас (просто что - то более сложное-не наивные примеры-JSF действительно сияет там:) IMHO лучший вариант использования для JSF-это бизнес-приложения, такие как CRMs и т. д...

" JSF будет выводить HTML и JavaScript уровня представления, которые вы не можете контролировать или изменять, не входя в код контроллера."

на самом деле JSF дает вам гибкость, вы можете использовать стандартные/сторонние компоненты или создавать свои собственные, которые у вас есть полный контроль над тем, что визуализируется. Это всего лишь один xhtml вам нужно создать свои пользовательские компоненты с JSF 2.0.

мы разработали образец проекта с JSF (это было трехнедельное исследование, поэтому мы, возможно, потеряли некоторые вещи!)

мы пытаемся использовать ядро jsf, если компонент необходим, мы использовали PrimeFaces.

проект представлял собой веб-сайт с навигацией. Каждая страница должна быть загружена через ajax при нажатии на меню.

сайт имеет два usecases:

  1. страница с сеткой. Сетка загружается через ajax и должна поддерживать сортировку и подкачку
  2. A три шага мастера. Каждая страница имеет клиентскую проверку (для простых проверок) и базовую проверку ajax на стороне сервера (для сложных проверок). Любое исключение сервера (из уровня сервиса) должно отображаться на той же странице мастера без перехода на следующую страницу.

мы обнаружили, что:

  1. вам нужно использовать некоторые хаки из omniFaces, чтобы сделать состояние представления JSF фиксированным. Состояние JSF будет повреждено при включении страниц через ajax друг в друга. Это кажется ошибкой в JSF и может быть исправлено в следующих версиях (не в 2.3).
  2. поток JSF не работает правильно с ajax (или мы не могли заставить его работать!) Вместо этого мы пытаемся использовать компонент мастера primeface, но проверка клиента, похоже, не поддерживается и означает, что он не был стандартным стандартом потока JSF.
  3. при использовании некоторых компонентов jQuery, таких как jqGird, и вам нужно загрузить результаты JSON, тогда вам рекомендуется использовать чистый сервлет, JSF ничего не сделает для вас. Так если вы используете такие компоненты, ваш дизайн не будет соответствовать JSF.
  4. мы пытаемся сделать некоторые клиентские скрипты, когда ajax завершается ajaxComplete и мы обнаружили, что PF 4 реализовал свои собственные события ajax. У нас были некоторые компоненты jQuery и нужно менять свой код.

Если вы измените приведенный выше пример на не Ajax проект (или, по крайней мере, меньше ajax проекта) вы не будете сталкиваться с большим количеством вышеуказанных проблем.

мы подводим итоги нашего исследования как:

JSF не работает хорошо в полностью ajax базовый сайт.

конечно, мы находим много хороших функций в JSF, которые могут быть очень полезны в некоторых проектах, поэтому рассмотрим ваши потребности проекта.

пожалуйста, обратитесь к техническим документам JSF, чтобы просмотреть преимущества JSF, и, на мой взгляд, самым большим преимуществом JSF является полная и огромная поддержка от @BalusC ; -)

Я вообще не эксперт по Java-серверам. Но ИМХО главным недостатком является то, что это серверная сторона. Я устал от обучения и использования фреймворков уровня веб-презентации на стороне сервера, таких как ASP.NET веб-формы, ASP.NET MVC, Java Server Faces, Struts, PHP Framework и Ruby on rails Framework. Я попрощался со всеми ними и поздоровался с Angularjs и TypeScript. Мой презентационный слой работает в браузере. Я не имеет значения, если он обслуживается Windows IIS под управлением php или ASP.NET или если это обслуживается веб-сервером Apache, работающим на Linux. Мне просто нужно изучить только один фреймворк, который работает везде.

просто мои два цента.

для меня самым большим недостатком JSF является плохая поддержка программно (динамически) генерируемых страниц.
Если вы хотите построить свою страницу (создать модель компонента страницы) динамически из кода java. Например, если вы работаете над конструктором веб-страницы WYSIWYG. Адекватная документация по этому случаю использования в общем доступе отсутствует. Есть много точек, где вы должны экспериментировать и развитие тихо медленно. Многие вещи просто не работают так, как вы ожидаете. Но в целом его возможно взломать его как-нибудь.
Хорошо, что это не проблема в философии или архитектуре JSF. Это просто недостаточно разработано (насколько я знаю).

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

но, похоже, что сообщество JSF знает об этих недостатках. Они работают над этим, как вы можете видеть из этих двух bugs
http://java.net/jira/browse/JAVASERVERFACES-1309
http://java.net/jira/browse/JAVASERVERFACES_SPEC_PUBLIC-599

ситуация должна быть лучше с JSF 2.2, по крайней мере, если речь идет о спецификации.

комментируя мои последние несколько месяцев Primefaces / JSF опыт:

  • Если вы можете использовать компоненты "с полки", я думаю, это не страшно.
  • однако, он не играет хорошо, как только вы выходите на улицу и нужны пользовательские UIs. - Например, нам нужно было использовать bootstrap Twitter для нашего проекта. (Не primefaces bootstrap).
    • Теперь наши страницы работают следующим образом:
      • загрузки страницы.
      • пользователь взаимодействует с Primefaces это имеет функциональность ajax
      • привязки javascript Bootstrap ломаются
      • мы запускаем дополнительный javascript для повторной привязки всего

обещание JSF избегать написания javascript превратилось в написание большего количества javascript, чем у нас было бы, если бы мы не использовали Primefaces-и этот javascript исправляет то, что Primefaces ломается.

это раковина времени-если вы снова не используете" с полки " вещи. Также очень некрасиво (Primefaces) когда приходится работать с селеном. Все это может быть сделано--но опять же--есть только так много времени.

определенно избегайте этого, если вы работаете с командой UX/design и вам нужно быстро перебирать пользовательский интерфейс-вы можете сэкономить время, изучив jquery/написание прямого HTML-или глядя на react/angular.

JSF имеет много преимуществ, вопрос о недостатке позвольте мне добавить пару пунктов на нем.

на практическом сценарии реализации веб-проекта в сроки, нужно следить за следующими факторами.

  • у вас есть достаточно высокопоставленных членов в вашей команде, которые могут предложить лучшие элементы управления, подходящие для каждого сценария?
  • есть ли у вас пропускная способность для размещения начального обучения кривая?

  • У вас есть достаточно опыта в вашей команде, которые могут рассмотреть JSF
    вещи, производимые разработчиками?

Если ваш ответ " Нет " для вопросов, вы можете оказаться в не поддерживаемой кодовой базе.

JSF имеет только один недостаток: перед началом разработки "JSF" вы должны четко понимать веб-разработку, основную java и интерфейсную архитектуру.

В настоящее время" новые "JavaScript-фреймворки просто пытаются скопировать/вставить компонентную модель" JSF".

среди всех" основных " рамок, таких как Spring MVC, калитка, гобелен и т. д., JSF Java EE с его составными компонентами является наиболее разработанной презентационной и компонентно-ориентированной технологией. Это немного громоздко и неполно по сравнению с решениями, предоставляемыми HybridJava.