Я работаю в RESTful Web Framework, основанном на собственном скрипте (JSP). В Framework есть механизм маршрутизации, который автоматически устанавливает ряд атрибутов запроса, которые затем становятся доступными в JSP (один из атрибутов является «моделью» запрошенного ресурса, который в основном представляет собой просто HashMap).
Проблема заключается в том, что в 90% случаев в JSP требуется добавить некоторую логику, будь то более сложная логика предметной области, извлечение данных других ресурсов (других моделей) или очистка данных для вывода.
Я рассматриваю различные шаблоны проектирования веб-приложений для извлечения логики домена из JSP и сохранения JSP как можно менее логическим.
Несколько замечаний:
- В системе, в которой я работаю, предоставляется модель (извлечение данных из базы данных), но фреймворк (ранее упомянутый HashMap); Я мог бы создать свои собственные оболочки модели вокруг этих данных, но это, вероятно, не нужно.
- JSP/скрипты являются конечными точками для запросов. Если я использую шаблон, который использует объект типа Presenter/Controller, который возвращает компонент представления (ViewModel?), который содержит все данные, которые будет использовать представление, мне потребуется строка в JSP, который вызывает Presenter/Controller и создает экземпляр bean-компонента View.
В настоящее время я создал POJO Presenter для каждого модуля (скрипта), который имеет доступ к модели (опять же, Framework устанавливает это как атрибут запроса), и просто создаю его экземпляр в верхней части JSP и использую его больше или меньше похож на фасоль.
Если я правильно понимаю, я считаю, что реализовал шаблон проектирования Presentation Model. [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 заполняет данными? Преимущество этого заключается в том, что один докладчик может управлять различными «представлениями» одного и того же ресурса (такими как представление «Показать», «Редактировать», «Сводное представление» и т. д.). Ниже приведен пример того, как я могу получить различные представления. модели.
/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.