it-history
April 10, 2023

JSF  или еще одно древнее зло из глубин

Рассказываю про еще одного монстра из недавнего прошлого — Java Server Faces. Немало крови разработчиков попило оно за время своего расцвета.

Прочтите если считаете современный Angular «сложным фреймворком».

Когда узнал на чем работает биллинг в компании

Традиционный трек для статьи:

Что это такое

Давайте начнем с вики:

JavaServer Faces (JSF) — это Java спецификация для построения компонентно-ориентированных пользовательских интерфейсов для веб-приложений, написанный на Java. Он служит для того, чтобы облегчать разработку пользовательских интерфейсов для Java EE-приложений. В отличие от прочих MVC-фреймворков, которые управляются запросами, подход JSF основывается на использовании компонентов. Состояние компонентов пользовательского интерфейса сохраняется, когда пользователь запрашивает новую страницу и затем восстанавливается, если запрос повторяется. Для отображения данных обычно используется JSP, Facelets

Вообщем все сложно.

Тогда опишу по-простому, для товарищей по партии:

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

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

Целевая аудитория у всего этого  — крупный бизнес.

Как это выглядит

Ниже несколько скриншотов веб-систем, построенных на JSF-фреймворках, чтобы вы примерно понимали о чем вообще речь.

Oracle ADF Faces
JBoss Richfaces
Primefaces

В РФ интерфейсы на JSF вы чаще всего могли увидеть в банк-клиентах и личных кабинетах операторов сотовой связи. До недавнего времени очень много такого говна ПО было реализовано на этой технологии.

Профиты

Есть такой известный подход к «быстрой» разработке:

накидать компонентов на форму и запустить

Популяризовал такой подход Borland Delphi, с тех пор и поныне сие есть самый популярный способ разработки чего-то с интерфейсом.

Называется это все Rapid Application Development (RAD)

Вот так это начиналось:

Delphi 1, 1995й, история

А вот так выглядела визуальная разработка на JSF в Netbeans:

Netbeans 6, 2007й год

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

Oracle JDeveloper 12, 2013й год

Сложности и детали

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 и подобного.

2005й год, Java 1.5, Myfaces, Tomahawk

Да это тоже JSF, с кастомными компонентами:

Richfaces, 2013й год

Конечно я делал и делаю кучу прототипов, что-то доходит до реального использования и становится продуктом, что-то — умирает.

Кое что из таких прототипов я могу показать:

Primefaces, 2014й год

Это был проект централизованного сервиса авторизации, интегрированный с 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.

Вот такая устаревшая матрешка.

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