我在基于原生脚本 (JSP) 的 RESTful Web 框架中工作。该框架有一个路由机制,可以自动设置一些请求属性,然后在 JSP 中可用(其中一个属性是请求资源的“模型”;它基本上只是一个 HashMap)。
问题在于 90% 的时间,需要向 JSP 添加一些逻辑,无论是更复杂的域逻辑、检索其他资源数据(其他模型)还是清理数据以进行输出。
我正在研究各种建立 Web 应用程序设计模式,用于从 JSP 中提取域逻辑,并使 JSP 尽可能地无逻辑。
需要注意的几点:
- 在我正在工作的系统中,提供了模型(从数据库中提取的数据),但提供了框架(前面提到的 HashMap);我可以围绕这些数据创建自己的模型包装器,但这可能是不必要的。
- JSP/脚本是请求的终点 - 如果我使用的模式使用 Presenter/Controller 类型的对象,该对象返回包含视图将使用的所有数据的 View bean(ViewModel?),我将需要一行在调用 Presenter/Controller 并实例化 View bean 的 JSP 中。
目前我已经为每个模块(脚本)创建了一个 Presenter POJO,它可以访问模型(同样,框架将其设置为请求属性),并简单地在 JSP 的顶部实例化它,并使用它更多或不像豆子。
如果我理解正确,我相信我已经实现了演示模型设计模式。[1]
前任。
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; }
}
关于直接在 JSP/Script 中使用 Presenter obj 与让它返回 Presenter 使用数据填充的“无逻辑”ViewModel bean 的任何想法?这样做的好处是我可以让一个 Presenter 管理同一资源的各种“视图”(例如 Show-view、Edit-view、Summary-view 等) - 下面是我如何获得各种视图的示例楷模。
/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 类中。