使用JSP和POJO的被动视图设计模式示例

时间:2012-07-08 14:00:05

标签: java jsp mvp passive-view

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

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

  1. View是打印HELLO WORLD的JSP!
  2. 数据存储在数据存储中为“hello world”,调用检索数据可以是存根
  3. 提供片段(演示者,视图等)的示例文件,并表示每个文件代表哪个模式。
  4. 除了jstl / el(可选)
  5. 之外,不应使用任何框架/ 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如何向View(JSP)公开。我可能会混合语义,而HelloWorldShowModel(作为各种类型的“ViewModel”,是不了解Presenter的。)

      1. 我是否应该拥有HelloViewShowModel抽象,或者我应该在我的Presenter上简单地使用方法getText(),该方法在JSP中被调用以获取所请求的文本。

      2. 如果我有资源的多个“视图”(例如,显示,索引,编辑,摘要等),我应该有多个演示者吗?这个逻辑应该如何分解?从共享演示者继承的多个演示者?每个演示者是否只负责返回一个ViewModel?

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

      我希望这会让我担心“懒惰”并寻找一个“分发”答案:)

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

像JSP这样的简单模板解决方案不能用于将所有逻辑卸载到控制器,至少在实际情况下是这样。我认为这种事情可以通过JSF来实现。

如果你想了解事情是如何完成的,我建议你看一下Spring MVC。它的源代码可以教你很多。