Семинар Ajax и Java Server Faces — новые уровни технологий Java.
Краткий отчет.
Небольшой опус, повествующий о событиях 24 апреля, 2008 года. Прочитав опус, вы узнаете о том, как подружились Java SE версии 6 и веб-сервисы, прочете пару строчек про JSF, капелюшечку про JAX, и просто мои мысли вслух.
24 апреля мне посчастливилось попасть на семинар, посвященный JSF в целом и JSF+AJAX в частности.
Скажу сразу: по техническим причинам мне не удалось полностью прослушать лекции.
Пролог
На «разогреве» выступал Михаил Васильев, один из старейших в прямом и переносном смысле преподавателей «Академии ИТ». Михаил рассказывал, параллельно рассуждая, о JavaSE 6, веб-сервисах и их перспективах. Свое знакомство с Джавой и начал благодаря Михаилу, год назад, посетив курс, который он вел. Тетради с лекциями у меня хранятся до сих пор. За 5 полных рабочих дней я узнал уйму нового, мне так понравилось, что я решил посвятить себя служению религии Джава.
Бессмысленно обвинять собравшихся в предвзятости, но многим было приятно слушать о том, что Java с каждым релизом становится быстрее, выше и сильнее.
Действие 1
Лично для меня было открытием то, что API для создания веб-сервисов и их клиентов включен в стандартный JDK SE. С одной стороны, это хорошо, с другой — без сервера далеко не уйдешь и, хоть один захудаленький Apache Tomcat поставить придется.
Михаил много рассказывал про автогенерацию артефактов для веб-сервисов (бины, SEI и т.д.), я и так знаю, что в общем случае RAD с этими задачами справляется, не скажу, что мне была интересна эта часть доклада. По словам Михаила, JAX-RPC умер, да здравствует новый король — JAX-WS. На экзамене «CX-310-220 — Девелопер джавийных веб-сервисов», спрашивают про JAX-WS.
Много говорили о SOAP. Сразу вспоминаются слова одного программиста, друга моего друга, который сказал, что в XML'e больше тегов, чем информации.
Если говорить о сгенерированной WSDL'ине, то слова безыменного хулителя XML близки к истине. Теперь байка от меня: как-то раз мне пришлось снифить SOAP сообщение, отправляемое веб-сервису (налаживал дружеские отношения между php и Джавийным веб-сервисом). Подтверждаю, удельный вес тегов был практически равен полезной передаваемой информации. На этих слова сразу вспоминается еще одна народная программистская мысль — «получая универсальность, мы должны чем-то жертвовать». Да, мы жертвуем производительностью и нагрузкой на канал. Михаил упомянул о формате компании Alcatel, специалисты которой передают бинарные данные вместо SOAP сообщений. С одной стороны экономия очевидна, с другой — очевидны проблемы, которые возникнут при попытке поработать с веб-севисами (или как там они у них называются) Алкателя.
Собравшимся пришлось прийти к выводу, что для того, чтобы подружить неподружимое лучше всего использовать веб-сервисы. В очередной раз услышал страшное для себя слово EJB. Слышал, знаю, но не пробовал. Упомянули неповоротливость, тяжеловесность и высокую сложность компонентов EJB и порадовались за веб-сервисы, которые лишены всех перечисленных недостатков. Стоит отметить, что веб-сервисы так же лишены всех достоинств EJB: транзакционность, контроль состояния объектов; другие я не запомнил. Если б веб-сервисы могли хотя бы иметь контроль состояния, жизнь программиста в очередной раз зацвела бы яркими красками оптимизма и верой в светлое будущее. Про транзакционность я и не говорю. Михаил рассказал о JAXB новой версии, который теперь поддерживает все схемы W3C. Раньше такого не было. И если раньше из XML можно было получить Java-объект, то теперь поддерживается обратная операция. В JAXB 1.0 такой малины не было. Маршаллизация и демаршаллизация на полную катушку для любителей XML'я.
Вспомнили технологию REST — Representational state transfer, которая позволяет передавать xml на прямую, через HTTP без поддержки SOAP.
Аннотации для веб-сервисов в SE 6 меня слегка удивили: если раньше мы писали что-то в этом роде:
myService.getServiceLocator(new URL(«lol.ru/MyService»)),
то теперь нечто похожее пишется в виде коммента-аннотации в коде над экземпляром получаемого интерфейса сервиса. Что здесь крутого я так и не понял. По-моему раньше было не менее удобно. Совсем забыл про base_64 в JAX-RPC. Мы его слегка поругали. Поскольку XMLвоспринимает только символьные данные, то бинарные данные: картинки, xxx.exe, myDiplom.rar передавались в закодированном виде при помощи base_64.
В JAX-WS бинарные данные передаются в виде бинарных данных. Ура, жить стало проще и веселее.
Михаил говорил о проекте Metro, мне показалось, что он сам не очень понимает что это такое и зачем оно нужно. Подступал антракт и мысли концентрировались в пучки и направлялись в буфет.
Антракт
В перерыве некий мужчина, издали похожий на пожилого преподавателя сопромата, атаковал Михаила своими каверзными вопросами. Они дискутировали на тему «Большое-большое предприятие, и веб-сервисы». Затем разговор плавно перетек в сторону возможностей моего любимого языка Джава. Никто из присутствующих не смог с уверенностью ответить на вопрос: «А можно ли на лету добавить к классу методы и поля?». Некоторые кивнули головами и сказали — нет. Я обсудил спорную ситуацию с коллегами в офисе, оказалось что можно. Далее участники дискуссии начали петь дифирамбы Ruby on Rails и я решил пойти покурить.
Действие второе
Как я упомянул в самом начале своего отчета, мне не удалось прослушать лекцию по JSF до конца.
Виктор Кудряшкин, сотрудник Питерского отделения Sun рассказывал о JSF.
Во время рассказа меня смутил следующий факт: в JSF есть специальные штуки — валидаторы. Они используются для проверки данных, например, нужно проверить адрес электронной почты, введенной пользователем. Для этого создается метод public void validateEmail(String userEmail), который throws ValidatorException.
Суть в том, что если пользователь совершил ошибку при вводе и почта не валидна, метод выбрасывает исключение с кастомным сообщением. Исключение перехватывается выше и пользователю отправляется сообщение «бла-бла-бла, введите правильную почту».
Логика, построенная на исключениях, мне напоминает клоунаду. Эдакое жонглирование 10тью мокрыми сосисками одновременно: никогда не знаешь за какой конец схватишься, к тому же они из рук выскальзывают.
Я задал логичный вопрос: «А зачем?».
Виктор говорил о том, что такой подход есть и существует (да не спорю, некоторые летом ездят на зимней резине, но это же не значит, что все должны так делать), и даже используется (например во вьетнамском форуме mvnforum он вроде называется). Как оказалось потом, сам Виктор решил не связываться с исключениями, и задал методу return type.
Насколько я знаю, популярный log4j откалывает штуки похлеще. В log4j в формате вывода сообщения можно указать метод, из которого генерируется запись. Для того, чтобы узнать, из какого метода log4j пишет лог, он бросает исключение, перехватывает его и парсит стэктрэйс. Другого способа обнаружить текущий метод -нет. Если я ошибаюсь, поправьте меня, пожалуйста.
Все таки не зря методы класса могут вернуть значение, не зря люди придумывали if then else.
И тут я извинился, попрощался и побежал на любимую работу.
Краткий отчет.
Небольшой опус, повествующий о событиях 24 апреля, 2008 года. Прочитав опус, вы узнаете о том, как подружились Java SE версии 6 и веб-сервисы, прочете пару строчек про JSF, капелюшечку про JAX, и просто мои мысли вслух.
24 апреля мне посчастливилось попасть на семинар, посвященный JSF в целом и JSF+AJAX в частности.
Скажу сразу: по техническим причинам мне не удалось полностью прослушать лекции.
Пролог
На «разогреве» выступал Михаил Васильев, один из старейших в прямом и переносном смысле преподавателей «Академии ИТ». Михаил рассказывал, параллельно рассуждая, о JavaSE 6, веб-сервисах и их перспективах. Свое знакомство с Джавой и начал благодаря Михаилу, год назад, посетив курс, который он вел. Тетради с лекциями у меня хранятся до сих пор. За 5 полных рабочих дней я узнал уйму нового, мне так понравилось, что я решил посвятить себя служению религии Джава.
Бессмысленно обвинять собравшихся в предвзятости, но многим было приятно слушать о том, что Java с каждым релизом становится быстрее, выше и сильнее.
Действие 1
Лично для меня было открытием то, что API для создания веб-сервисов и их клиентов включен в стандартный JDK SE. С одной стороны, это хорошо, с другой — без сервера далеко не уйдешь и, хоть один захудаленький Apache Tomcat поставить придется.
Михаил много рассказывал про автогенерацию артефактов для веб-сервисов (бины, SEI и т.д.), я и так знаю, что в общем случае RAD с этими задачами справляется, не скажу, что мне была интересна эта часть доклада. По словам Михаила, JAX-RPC умер, да здравствует новый король — JAX-WS. На экзамене «CX-310-220 — Девелопер джавийных веб-сервисов», спрашивают про JAX-WS.
Много говорили о SOAP. Сразу вспоминаются слова одного программиста, друга моего друга, который сказал, что в XML'e больше тегов, чем информации.
Если говорить о сгенерированной WSDL'ине, то слова безыменного хулителя XML близки к истине. Теперь байка от меня: как-то раз мне пришлось снифить SOAP сообщение, отправляемое веб-сервису (налаживал дружеские отношения между php и Джавийным веб-сервисом). Подтверждаю, удельный вес тегов был практически равен полезной передаваемой информации. На этих слова сразу вспоминается еще одна народная программистская мысль — «получая универсальность, мы должны чем-то жертвовать». Да, мы жертвуем производительностью и нагрузкой на канал. Михаил упомянул о формате компании Alcatel, специалисты которой передают бинарные данные вместо SOAP сообщений. С одной стороны экономия очевидна, с другой — очевидны проблемы, которые возникнут при попытке поработать с веб-севисами (или как там они у них называются) Алкателя.
Собравшимся пришлось прийти к выводу, что для того, чтобы подружить неподружимое лучше всего использовать веб-сервисы. В очередной раз услышал страшное для себя слово EJB. Слышал, знаю, но не пробовал. Упомянули неповоротливость, тяжеловесность и высокую сложность компонентов EJB и порадовались за веб-сервисы, которые лишены всех перечисленных недостатков. Стоит отметить, что веб-сервисы так же лишены всех достоинств EJB: транзакционность, контроль состояния объектов; другие я не запомнил. Если б веб-сервисы могли хотя бы иметь контроль состояния, жизнь программиста в очередной раз зацвела бы яркими красками оптимизма и верой в светлое будущее. Про транзакционность я и не говорю. Михаил рассказал о JAXB новой версии, который теперь поддерживает все схемы W3C. Раньше такого не было. И если раньше из XML можно было получить Java-объект, то теперь поддерживается обратная операция. В JAXB 1.0 такой малины не было. Маршаллизация и демаршаллизация на полную катушку для любителей XML'я.
Вспомнили технологию REST — Representational state transfer, которая позволяет передавать xml на прямую, через HTTP без поддержки SOAP.
Аннотации для веб-сервисов в SE 6 меня слегка удивили: если раньше мы писали что-то в этом роде:
myService.getServiceLocator(new URL(«lol.ru/MyService»)),
то теперь нечто похожее пишется в виде коммента-аннотации в коде над экземпляром получаемого интерфейса сервиса. Что здесь крутого я так и не понял. По-моему раньше было не менее удобно. Совсем забыл про base_64 в JAX-RPC. Мы его слегка поругали. Поскольку XMLвоспринимает только символьные данные, то бинарные данные: картинки, xxx.exe, myDiplom.rar передавались в закодированном виде при помощи base_64.
В JAX-WS бинарные данные передаются в виде бинарных данных. Ура, жить стало проще и веселее.
Михаил говорил о проекте Metro, мне показалось, что он сам не очень понимает что это такое и зачем оно нужно. Подступал антракт и мысли концентрировались в пучки и направлялись в буфет.
Антракт
В перерыве некий мужчина, издали похожий на пожилого преподавателя сопромата, атаковал Михаила своими каверзными вопросами. Они дискутировали на тему «Большое-большое предприятие, и веб-сервисы». Затем разговор плавно перетек в сторону возможностей моего любимого языка Джава. Никто из присутствующих не смог с уверенностью ответить на вопрос: «А можно ли на лету добавить к классу методы и поля?». Некоторые кивнули головами и сказали — нет. Я обсудил спорную ситуацию с коллегами в офисе, оказалось что можно. Далее участники дискуссии начали петь дифирамбы Ruby on Rails и я решил пойти покурить.
Действие второе
Как я упомянул в самом начале своего отчета, мне не удалось прослушать лекцию по JSF до конца.
Виктор Кудряшкин, сотрудник Питерского отделения Sun рассказывал о JSF.
Во время рассказа меня смутил следующий факт: в JSF есть специальные штуки — валидаторы. Они используются для проверки данных, например, нужно проверить адрес электронной почты, введенной пользователем. Для этого создается метод public void validateEmail(String userEmail), который throws ValidatorException.
Суть в том, что если пользователь совершил ошибку при вводе и почта не валидна, метод выбрасывает исключение с кастомным сообщением. Исключение перехватывается выше и пользователю отправляется сообщение «бла-бла-бла, введите правильную почту».
Логика, построенная на исключениях, мне напоминает клоунаду. Эдакое жонглирование 10тью мокрыми сосисками одновременно: никогда не знаешь за какой конец схватишься, к тому же они из рук выскальзывают.
Я задал логичный вопрос: «А зачем?».
Виктор говорил о том, что такой подход есть и существует (да не спорю, некоторые летом ездят на зимней резине, но это же не значит, что все должны так делать), и даже используется (например во вьетнамском форуме mvnforum он вроде называется). Как оказалось потом, сам Виктор решил не связываться с исключениями, и задал методу return type.
Насколько я знаю, популярный log4j откалывает штуки похлеще. В log4j в формате вывода сообщения можно указать метод, из которого генерируется запись. Для того, чтобы узнать, из какого метода log4j пишет лог, он бросает исключение, перехватывает его и парсит стэктрэйс. Другого способа обнаружить текущий метод -нет. Если я ошибаюсь, поправьте меня, пожалуйста.
Все таки не зря методы класса могут вернуть значение, не зря люди придумывали if then else.
И тут я извинился, попрощался и побежал на любимую работу.