Каковы основные недостатки 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 ответов


недостатки 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)

это был первый релиз новой команды разработчиков JSF во главе с Райаном Любке. Новая команда проделала большую работу. Были также изменения в спецификации. Основным изменением стало улучшение обработки представлений. Это не только полностью отделило JSF от JSP, поэтому можно было использовать другую технологию просмотра, чем JSP, но и позволило разработчикам встроить простой ванильный HTML на странице JSF без проблем с <f:verbatim> теги. Еще одним важным направлением работы новой команды было улучшение производительность. Во время жизни ссылочной реализации Sun JSF 1.2 (которая была кодовым именем Mojarra С момента сборки 1.2_08, около 2008), практически каждая сборка была отправлена с (основными) улучшениями производительности рядом с обычными (незначительными) исправлениями.

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

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

также, JSF 1.x не поставлял с Ajax-оборудованием из коробки. Не реально технический недостаток, но из-за шумихи Web 2.0 в этот период он стал функциональным недостатком. Эксадел было рано вводить 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 и убедитесь, что вы не используете символ самостоятельно в любом месте идентификатора клиента, например -.

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

хотя практически все недостатки JSF 1.x были исключены, есть Конкретные ошибки JSF 2.0, которые могут стать showstopper. The @ViewScoped сбой в обработчиках тегов из-за проблемы куриного яйца в частичном сохранении состояния. Это исправлено в JSF 2.2 и обратно в Mojarra 2.1.18. Также передача пользовательских атрибутов, таких как HTML5 data-xxx не поддерживается. Это исправлено в JSF 2.2 новой функцией элементов/атрибутов passthrough. Далее реализация JSF Mojarra имеет собственный набор вопросов. Относительно много связаны с иногда неинтуитивное поведение <ui:repeat>, the новая реализация частичного сохранения состояния и плохо реализован 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, а не запрос (действие) на основе MVC framework. Если высокая степень управления HTML / CSS / JS является вашим основным требованием при рассмотрении структуры MVC, то вы уже не должны смотреть на компонентную структуру MVC, а по запросу на основе MVC framework, например Весна MVC. Вам нужно только принять во внимание, что вам придется написать все это HTML/CSS/JS boilerplate самостоятельно. См. также разница между запросом MVC и компонентом В MVC.

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


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

два крупный в JSF недостатки:

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

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

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

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

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

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

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


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

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

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


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

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

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

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

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

  • GlassFish (2, 3 и т. д.)
  • JBoss
  • котяра

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

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


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

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

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


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

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


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

мы пытаемся использовать core jsf, если нужен компонент, мы использовали PrimeFaces.

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

сайт имеет два использования:

  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 project (или, по крайней мере, меньше ajax project) вы не столкнетесь с множеством вышеуказанных проблем.

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

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.