Есть такой хороший фреймворк Stripes для написания веб-приложений на Java. Не так много людей, которые о нем хотя бы слышали.
Tim Fennell создал данный фреймворк в 2005 году. Он решил использовать плюшки, которые появились в Java5: аннотации, generic - и. И что самое приятное для меня, всякую конфигурацию из xml файлов.Все в Stripes нацелено на простоту. Не надо под него сильно адаптировать свой код. Он заботится о повторяющихся низкоуровневых операциях, так что разработчику остается только писать чистый, читаемый и легко поддерживаемый код.
Несмотря на свою простоту и легкость, мы получаем следующие плюшки:
Несмотря на свою простоту и легкость, мы получаем следующие плюшки:
- Умную привязку (URL, параметров и событий от HTTP к Java коду).
- Автозагрузка (Stripes сам заботится об автоподгрузке своих классов, без какой-либо XML конфигурации).
- Валидация (Stripes предоставляет мощный механизм валидации, основанный на аннотациях).
- Конвертация типов и форматирование (конвертация в том числе и в свои типы).
- Слои (за счет всего лишь 3 тегов поддержка механизма повторно используемых слоев на UI).
- Локализация
- Обработка исключений (собственные страницы ошибок и страницы для каких-то типовых ошибок).
- Перехватчики (Interceptors), между request и response происходит несколько различных этапов, так вот перехватчики позволяют изменять данные на различных этапах
- Кастомизируемые URL (можно задать паттерн для представления URL)
- Легкая интеграция с AJAX (можно использовать для front-end части свой любимый ajax фреймворк, а об backend позаботится Stripes).
- Тестирование (Stripes создает mock объекты, что значительно облегчает процесс автоматизированного тестирования).
- Легкая расширяемость и возможность адаптировать под свои нужды.
public ActionBeanContext getContext() { return ctx; }
public void setContext(ActionBeanContext ctx) { this.ctx = ctx; }
Обработчики событий (Event Handlers) выполняют всякие действия, происходящие при нажатии на ссылки или кнопки. За отсутствие наличия конфигурации приходится немного платить, это заключается в том, что к обработчикам событий предъявляются следующие требования:
- Они д.б. объявлены как public
- Они д. возвращать объект типа Resolution
- Они не должны принимать параметров.
- Они д.б. определены в классе, реализующем интерфейс ActionBean.
Также об ограничениях как минимум один из обработчиков событий в одном Action Bean должен иметь аннотацию @DefaultHandler (за исключением если он только один в ActionBean, но его все равно всегда рекомендуется добавлять для единообразия), иначе будет исключение. Также исключение будет в том случае, если добавить аннотацию @DefaultHandler на нескольких обработчиках в одном ActionBean.
После того, как выполнена вся работа обработчиком необходимо вернуть объект типа Resolution (разрешение), который содержит информацию о возвращаемой странице и говорит, что необходимо вернуть в ответ на текущий запрос.
Вообще, Resolution, это интерфейс, который содержит один метод
public interface Resolution {
void execute(HttpServletRequest request,
HttpServletResponse response)
throws Exception;
}
Существуют следующие реализации интерфейса Resolution
- ForwardResolution (пересылает по пути такому как JSP или другой ActionBean)
- RedirectResolution (тоже что и ForwardResolution, но использует перенаправление за счет клиентской стороны)
- StreamingResolution (направляет поток непосредственно обратно к клиенту, например создавая бинарный файл)
- JavaScriptResolution (конвертирует Java объект в Javascript код, который отправляется обратно на клиент и его можно расшифровать, использую Javascript функцию eval(). Это особенно полезно, когда используется Ajax).
- ErrorResolution (отправляет HTTP ошибку обратно на клиент, используя статус ошибки и необязательное сообщение об ошибке).
Вообщем, как-то так, я сама об этом ничего не знаю, но мне это уже как-то отдаленно напоминает смесь JSF cо Struts.