0

我在基于原生脚本 (JSP) 的 RESTful Web 框架中工作。该框架有一个路由机制,可以自动设置一些请求属性,然后在 JSP 中可用(其中一个属性是请求资源的“模型”;它基本上只是一个 HashMap)。

问题在于 90% 的时间,需要向 JSP 添加一些逻辑,无论是更复杂的域逻辑、检索其他资源数据(其他模型)还是清理数据以进行输出。

我正在研究各种建立 Web 应用程序设计模式,用于从 JSP 中提取域逻辑,并使 JSP 尽可能地无逻辑。

需要注意的几点:

  1. 在我正在工作的系统中,提供了模型(从数据库中提取的数据),但提供了框架(前面提到的 HashMap);我可以围绕这些数据创建自己的模型包装器,但这可能是不必要的。
  2. 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 类中。

[1] http://martinfowler.com/eaaDev/PresentationModel.html

4

2 回答 2

0

检查支柱。
我必须承认只使用过旧版本,但“前端控制器”servlet 的想法似乎是你所追求的。它是一个运行公共代码和路由请求的特殊 servlet。
它还具有可以在 Web 容器之外进行测试的操作。

我从纯 JSP 转向 struts 的那一天是我 Web 开发生涯中最美好的日子之一!该项目开始感觉井井有条,并且更易于管理。

于 2012-07-08T07:44:04.090 回答
0

有很多 MVC 框架。例如,Struts 使用前端控制器 servlet 根据所使用的资源将请求分派到类(控制器)。该类处理请求并将结果发送到视图(通常是 jsp)。模型是代表您的数据的任何类。仅供参考,地图不是框架。仅将您的数据表示为 MAP 会起作用,但是很难看且难以维护。

在不了解您的严格框架的情况下,普遍接受的良好做法是保持您的业务逻辑集中并独立于任何框架。仅将您的框架用于管道。让您的控制器在您的演示和业务逻辑之间进行调解,这只是管道。将您的显示数据放在正确的范围内(几乎总是请求范围),这样您就不必像示例中那样拥有 scriptlet。

于 2012-07-08T10:08:47.810 回答