В прошлой записи я рассказал о нашем проекте VoIP WebAdmin (название рабочее). Теперь я хочу поговорить о нем с технической точки зрения: используемые технологии и мои впечатления от работы с ними.
Итак, программа представляет собой веб-приложение. Для разработки был выбран web application framework - Java Server Faces.
Впечатления двоякие. С одной стороны пока делаешь стандартные действия, проблем не возникает и скорость разработки оказывается высокой. Например связь данных и интерфейса, табличное представление информации и прочее...
Но стоит сделать шаг в сторону и начинаются проблемы. Элементарный пример: пусть мы хотим задать задать элементу Text Field ширину 300px. Казалось бы, что проще?! Выделаем в NetBeans компонент textField1 и ищем свойство Width... не находим :) Ладно, пусть так, зато находим свойство Style. Вот это то что нужно! CSS как раз для этого и создан. Пишем туда заветную строчку: width: 300px; Выглядит это так:

Открываем страницу в браузере... Тут нас ждет разочарование! Поле как было своего размера (примерно 150px), так и осталось.
Начинаем разбираться в чем проблема, CSS есть CSS он должен работать везде. Поможет нам великолепный модуль к Firefox - Firebug. С помощью него находим html код, в который JSF преобразовал наш textField1.

Не правда ли многовато для одного контрола? Но главное не это. Посмотрите к чему JSF применил наш Style! к компоненту <span> в котором лежит наш <input>, размер которого мы хотели менять. А это значит что какие бы мы не указывали width и height для textField1, размер не изменится. Вот так все печально.
Решение проблемы конечно есть. Не красивое, но есть. Дело в том что в CSS есть возможность определять стили для дочерних элементов компонента класса. А наш input это как раз дочерний элемент контейнера <span>, к которому JSF наш класс и применит.
Работает это так:

Теперь сомотрим в браузер и радуемся :)
Несмотря на то что проблема решена, остается вопрос, почему такая простая вещь делается таким нестандартным способом? И это не единственный случай, с которым я столкнулся.
И думаю что я могу дать ответ на этот вопрос. Дело в том что JSF позиционируется как Framework для создания web-приложений, а не сайтов. Никогда не понимал в чем разница между ними, а сейчас кажется понял. Web-приложение предполагает большую функциоанльность, но неприхотливость в вопросе интерфейса. JSF предоставляет богатый набор компонентов в расчете на то что разработчик не будет пытаться изменить их внешний вид. Цель JSF - максимально приблизить разработку Web-интерфейса к созданию обычного приложения на Swing. И на мой взгляд он с этой задачей достойно справляется.