4

我试图了解被动视图设计模式如何适用于简单的 Web 应用程序。

有人可以使用以下要求提供此模式的简单示例:

  1. View 是一个打印 HELLO WORLD 的 JSP!
  2. 数据以“hello world”的形式保存在数据存储中,检索数据的调用可以是存根
  3. 为片段(演示者、视图等)提供示例文件,并指出每个文件代表的模式片段。
  4. 除了 jstl/el(可选)之外,不应使用任何框架/DSL

谢谢

更新1:增加我对如何构建的理解。

// 主持人; 负责特定视图的多个“再现”(显示、索引、编辑、摘要等)

public class HelloWorldPresenter {
     private HttpServletRequest request;
     private DataStore dateStore;

     public HelloWorldPresenter(HttpServletRequest request) { 
        this.request = request;
        this.dataStore = DataStoreUtil.getDataStore(request); 
        // Do a bunch of other inits that all getXXXModels() will use
     } 

     public getShowModel() {
        HelloWorldShowModel model = new HelloWorldShowModel();         
        String tmp = makeLoud(this.dataStore.getMyData()); // Stub method          

        model.setText(tmp);
        return model;
     }

     private String makeLoud(String str) {
        return str.toUpperCase() + "!";
     } 
}

// 视图使用的模型

public class HelloWorldShowModel { 
   private String text;
   public getText() { return this.text };
   public setText(String text) { this.text = text; }
}

// 查看 show.jsp

<c:set var="model" value="new HelloWorldPresenter.getShowModel()"/>
${model.text} -> HELLO WORLD!

或者

<% HelloWorldShowModel model = new HelloWorldPresenter(request).getShowModel() %>
<%= model.getText() %>

我不确定的事情是:

  1. 由于 View 不应该知道 Presenter,Presenter 将如何暴露给 View (JSP)。不过,我可能正在混合语义,而 HelloWorldShowModel(充当某种“ViewModel”,是关于 Presenter 的不应该知道的)。

    1. 我什至应该有 HelloViewShowModel 抽象,还是应该getText()在我的 Presenter 上有一个方法,在 JSP 中调用它来获取请求的文本。

    2. 如果我对一个资源有多个“视图”(例如 Show、Index、Edit、Summary 等),我应该有多个 Presenter 吗?应该如何打破这个逻辑?从共享演示者继承的多个演示者?每个 Presenter 应该只负责返回一个 ViewModel 吗?

我已经阅读了 Fowlers 的文章以及其他一些文章——问题(对我来说)是它们是在 .NET 应用程序的上下文中编写的,我不明白它们的所有对象是如何连接起来的。

我希望这会减轻我对“懒惰”并寻找“分发”答案的担忧:)

4

2 回答 2

2

根据您所说的要求,我会说该模式无法实现。如果您将视图视为 JSP,则控制器无法主动设置 UI 组件的任何值。(对我来说,这是该模式的核心:控制器实际上通过设置输入/输出 UI 组件的值来主动更新视图,而不是反过来(视图从模型对象获取字段)。这不能用上述技术作为 JSP 无法以这种方式访问​​。

不过,它可以在基于 Javascript 的 Web 环境中实现。考虑您的视图是 DOM,而您的控制器是 Javascript 组件。JS 控制器具有对 DOM 的直接写入访问权限,因此可以像模式建议的那样主动更新单个字段。为了更新/获取模型,JS 控制器可以与服务器端系统对话,例如基于 REST API 通过 Ajax。

于 2012-07-14T17:38:03.077 回答
1

A plain templating solution like JSP cannot be used to offload all logic to controller, at least in real world cases. I think this kind of thing can be achieved with JSF.

If you want to learn about how things are done I recommend you to take a look at Spring MVC. It's source code can teach you a lot.

于 2012-07-17T12:56:59.053 回答