我试图了解被动视图设计模式如何适用于简单的网络应用程序。
有人可以使用这些要求提供此模式的简单示例:
由于
更新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() %>
我不确定的事情是:
由于View不知道演示者,因此Presenter如何向View(JSP)公开。我可能会混合语义,而HelloWorldShowModel(作为各种类型的“ViewModel”,是不了解Presenter的。)
我是否应该拥有HelloViewShowModel抽象,或者我应该在我的Presenter上简单地使用方法getText()
,该方法在JSP中被调用以获取所请求的文本。
如果我有资源的多个“视图”(例如,显示,索引,编辑,摘要等),我应该有多个演示者吗?这个逻辑应该如何分解?从共享演示者继承的多个演示者?每个演示者是否只负责返回一个ViewModel?
我已经阅读了Fowlers的文章以及其他一些文章 - 问题(对我而言)是它们是在.NET应用程序的上下文中编写的,我不明白他们的所有对象是如何连接起来的
我希望这会让我担心“懒惰”并寻找一个“分发”答案:)
答案 0 :(得分:2)
根据你所说的要求我会说模式无法实现。如果您认为视图是JSP,那么控制器无法主动设置UI组件的任何值。 (对我而言,这是模式的核心:控制器实际上通过设置输入/输出UI组件的值来主动更新视图,而不是相反的方式(查看从模型对象获取字段)。这不能用作为JSP的上述技术无法以这种方式访问。
它可以在基于Javascript的Web环境中实现。考虑您的视图是DOM,您的控制器是Javascript组件。 JS控制器具有对DOM的直接写访问权,因此可以像模式所暗示的那样主动更新单个字段。为了更新/获取模型,JS控制器可以与服务器端系统e进行通信。 G。基于通过Ajax的REST API。
答案 1 :(得分:1)
像JSP这样的简单模板解决方案不能用于将所有逻辑卸载到控制器,至少在实际情况下是这样。我认为这种事情可以通过JSF来实现。
如果你想了解事情是如何完成的,我建议你看一下Spring MVC。它的源代码可以教你很多。