Предложения шаблона проектирования JSP/ сервлета для веб-приложения
Я работаю в RESTful Web Framework, основанном на сценариях (JSP). Платформа имеет механизм маршрутизации, который автоматически устанавливает число атрибутов запроса, которые затем становятся доступными в JSP (один из атрибутов является "моделью" запрошенного ресурса; в основном это просто HashMap).
Проблема в 90% случаев, требуется некоторое количество логики для добавления в JSP, будь то более сложная логика домена, получение других данных ресурса (других моделей) или очистка данных для вывода.
Я рассматриваю различные шаблоны разработки веб-приложений для извлечения логики предметной области из JSP и поддержания максимально возможной логики JSP.
Несколько вещей, на которые стоит обратить внимание:
- Внутри системы, в которой я работаю, предоставляется Модель (извлечение данных из базы данных), но Framework (ранее упомянутый HashMap); Я мог бы создать свои собственные обертки Model для этих данных, но это, вероятно, не нужно.
- JSP / Scripts являются конечными точками для запросов. Если я использую шаблон, который использует объект типа Presenter/Controller, который возвращает объект представления (ViewModel?), Который содержит все данные, которые будет использовать представление, мне потребуется строка в JSP, который вызывает Presenter/Controller и создает экземпляр объекта View.
В настоящее время я создал POJO Presenter для каждого модуля (скрипта), который имеет доступ к модели (опять же, Framework устанавливает это как атрибут attr), и просто создаю его экземпляр в верхней части JSP и использую его чаще или меньше как боб.
Если я понимаю, правильно, я считаю, что я реализовал шаблон проектирования модели презентации. [1]
Ex.
JSP выглядит так:
<% DemoPresenter demo = new DemoPresenter(request) %>
<%= demo.getTitle() %>
- or add it to pageContext to use w JSTL/EL -
<c:set var="demo" value="new DemoPresenter(request)"/>
${demo.title}
И "Ведущий / Контроллер" выглядит так:
public class DemoPresenter extends BasePresenter {
private String title;
public DemoPresenter(HttpServletRequest request) {
FrameworkModel model = request.getAttribute("frameworkProvidedResourceModel");
this.title = model.get("title").toUpperCase() + "!!!";
}
public getTitle() { return this.title; }
}
Любые мысли об использовании объекта Presenter непосредственно в JSP/Script, против того, чтобы он возвращал bean-компонент "без логики" ViewModel, который Presenter заполняет данными / данными? Преимуществом этого является то, что у меня может быть один Presenter, управляющий различными "представлениями" одного и того же ресурса (например, "Показать-просмотр", "Редактировать-просмотр", "Сводный просмотр" и т. Д.). Ниже приведен пример того, как можно получить различные представления. моделей.
/ blog / posts / 1 / show -> выполняет JSP, который получает свою ViewModel следующим образом:
<% DemoDefaultViewModel default = new DemoPresenter(request).getViewModel(DemoDefaultViewModel.class); %>
/ blog / posts / 1 / edit -> выполняет JSP, который получает свою ViewModel следующим образом:
<% DemoEditViewModel edit = new DemoPresenter(request).getViewModel(DemoEditViewModel.class); %>
Я хотел бы сохранить простое решение без слишком большого количества посторонних предметов. Я также не могу стать слишком изощренным, поскольку я работаю в строгой предопределенной среде - я просто хочу найти хороший способ перевести всю мою доменную логику из JSP в более повторно используемые, тестируемые классы Java.
2 ответа
Проверьте распорки.
Я должен признать, что использовал только более старую версию, но идея сервлета 'front controller', кажется, то, что вам нужно. Это специальный сервлет для запуска общего кода и запросов маршрутизации.
У него также есть действия, которые можно протестировать вне веб-контейнера.
День, когда я перешел от чистого JSP к Struts, был одним из лучших дней в моей жизни в веб-разработке! Проект начал чувствовать себя организованным и намного легче управлять.
Существует множество платформ MVC. Например, Struts использует сервлет фронт-контроллера для отправки запросов классу (контроллеру) в зависимости от используемого ресурса. Класс обрабатывает запрос и отправляет результат представлению (обычно jsp). Модель - это любой класс, который представляет ваши данные. К вашему сведению, карта не является основой. Представление ваших данных только в виде MAP, будет работать, но уродливо и трудно поддерживать.
Не зная вашей строгой структуры, общепринятая хорошая практика будет держать вашу бизнес-логику централизованной и независимой от любой структуры. Используйте ваши рамки только для сантехники. Заставьте ваш контроллер выступать посредником между вашей презентацией и бизнес-логикой, опять же, это просто слесарное дело. Поместите ваши отображаемые данные в правильную область (почти всегда область запроса), чтобы вам не приходилось иметь скриптлеты, как в вашем примере.