JSF или еще одно древнее зло из глубин
Рассказываю про еще одного монстра из недавнего прошлого — Java Server Faces. Немало крови разработчиков попило оно за время своего расцвета.
Прочтите если считаете современный Angular «сложным фреймворком».
Что это такое
Давайте начнем с вики:
JavaServer Faces (JSF) — это Java спецификация для построения компонентно-ориентированных пользовательских интерфейсов для веб-приложений, написанный на Java. Он служит для того, чтобы облегчать разработку пользовательских интерфейсов для Java EE-приложений. В отличие от прочих MVC-фреймворков, которые управляются запросами, подход JSF основывается на использовании компонентов. Состояние компонентов пользовательского интерфейса сохраняется, когда пользователь запрашивает новую страницу и затем восстанавливается, если запрос повторяется. Для отображения данных обычно используется JSP, Facelets
Тогда опишу по-простому, для товарищей по партии:
это такой корпоративный веб-п#здец, создаваемый одними большими компаниями для выкачивания денег из других больших компаний.
JSF это такая спецификация, вроде JPA — документ с описанием и картинками, по которой написали несколько очень жирных фреймворков для разработки веб-приложений.
Целевая аудитория у всего этого — крупный бизнес.
Как это выглядит
Ниже несколько скриншотов веб-систем, построенных на JSF-фреймворках, чтобы вы примерно понимали о чем вообще речь.
В РФ интерфейсы на JSF вы чаще всего могли увидеть в банк-клиентах и личных кабинетах операторов сотовой связи. До недавнего времени очень много такого говна ПО было реализовано на этой технологии.
Профиты
Есть такой известный подход к «быстрой» разработке:
Популяризовал такой подход Borland Delphi, с тех пор и поныне сие есть самый популярный способ разработки чего-то с интерфейсом.
Называется это все Rapid Application Development (RAD)
А вот так выглядела визуальная разработка на JSF в Netbeans:
Вот тут находится очень подробный пошаговый гайд с картинками для Oracle ADF. Врядли вам придет в голову повторять, но даст понимание как такая разработка выглядела:
Сложности и детали
JSF — про компоненты, несмотря на декларируемый стандартный MVC. Из таких компонентов как из кубиков и собирался конечный интерфейс.
Это был очень продуманный фреймворк, а его сложность происходила из самой задачи:
обеспечить компонентный подход в вебе, где часть компонента должна выполняться в браузере на Javascript, часть на сервере и обе части должны коммуницироваться между собой и другими компонентами.
Включая вложенность и отрисовку по динамическим условиям.
И это все было с самого начала, в 2005м году(!) , сильно задолго до Server-Side-Rendering (SSR).
Были два варианта хранения состояния сессионных объектов: на сервере и на клиенте — опять же, все сильно задолго до JWT.
Было частичное обновление (partial rendering) с использованием Ajax — задолго до современных Two-way binding и Shadow DOM.
Естественно что был и Expression Language и обработчики и разграничение доступа — куда более сложное чем в современных frontend-only фреймворках.
Вообщем то что вы сейчас с таким трудом лепите на вашем Ангуляре, существовало еще пару десятков лет назад и отлично работало.
Личный опыт
Впервые с этим адским п#здецом замечательной технологией я познакомился аж в 2005 м году, прошел наверное всю ее историю и активно применял где-то до 2018го — до момента активного развития Angular, React и подобного.
Да это тоже JSF, с кастомными компонентами:
Конечно я делал и делаю кучу прототипов, что-то доходит до реального использования и становится продуктом, что-то — умирает.
Кое что из таких прототипов я могу показать:
Это был проект централизованного сервиса авторизации, интегрированный с LDAP и OpenID. Причем и то и другое было интегрированным — мой «userman» выступал в роли LDAP и OpenID серверов и раздавал права и доступ всем остальным.
Наконец самое веселое что я когда-либо делал с JSF:
Это демка на Apache Myfaces, где реализована авторизация и WebGL эффекты — при ошибке авторизации все светится красным.
Текущее состояние дел
Как я уже писал выше: JSF — очень и очень сложный фреймворк. Появился он до того как пошло современное разделение на фронтэнд и бекэнд.
Поэтому использование JSF требует знаний, которые на сегодняшний день описываются как «full-stack»:
разработчик должен уметь делать сквозную разработку — от базы данных и до веба.
Очевидно что разработчиков такого уровня мало, поэтому весь смысл использования JSF для новых проектов теряется.
Тем не менее, за 19 лет истории:
JSF 1.0 (2004-03-11) – Initial specification released.
было написано огромное количество серьезного ПО, которое используется повсеместно и никуда пропадать не собирается.
Но время берет свое и появляются проблемы, решение которых требует серьезного опыта, опишу несколько.
Любой JSF фреймворк содержит часть на Javascript, зашитую внутрь и не поддающуюся кастомизации.
Для самого простого из JSF — Myfaces, это например выглядит вот так, думаю хватит для понимания сложности.
Естественно что в нынешних реалиях, когда ваш браузер обновляется каждую неделю, такой вот 5-летний блоб очень быстро становится несовместимым.
Конкретный пример для Myfaces (да и практически всех остальных JSF-фреймворков) — поддержка CORS.
JSF основан на более низкоуровневом Servlet API и активно использует EL (Expression Language). И то и другое успело устареть до полной несовместимости за последние 5 лет.
Помимо этого, для полной радости расскажу, что JSF-приложение разворачивается и работает не само по себе, а либо внутри сервера приложений либо в сервлет- контейнере, которые работают в JVM.
Вот такая устаревшая матрешка.
Вообщем, мигрировать такое или хотя-бы просто починить сильно непростая задача, так что если будет нужна помощь — пишите, помогу.