`
canonical
  • 浏览: 366414 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

[导入]jsplet:对Model 2模式的批判

阅读更多

   在Jsp Model 2模型中, 用户的所有请求提交给Controller Servlet, 由Controller进行统一分配, 并且采用推的方式将不同的UI显示给用户。 这种推方式在很多人看来是一种优点,因为在Struts等MVC实现中具体推送的UI可以在配置文件中配置,配置完成后还可以通过一些可视化分析工具得到 整个站点地图。在Model2模式中基本的访问格式为:
       action.do?其他参数  

我 本人从未应用过Model2模式,但与我们的jsplet框架对比,我认为这种推送方式在大多数情况下并不是什么优点。如果将一次web访问看作是一次函 数调用,则按照Model2模式,这个函数的返回情况是不确定的,需要由一个额外的配置文件来确定。而我们知道,一个返回情况不确定的函数一般不是什么良 好的设计。在我们的框架设计中,一个基本的观点是尽量将自由度暴露给实际控制它的人。实际上,在大多数情况下,页面编制人员知道应该使用哪个页面来显示数 据,他们并不需要一个额外的配置文件。Jsplet使用如下的url格式:
       视图jsp?objectName=模型对象名&objectEvent=响应事件名&其他参数
举一个具体的例子:
   http://my.com/demo_view.jsp?objectName=/@Demo&objectEvent=test

demo_view.jsp是指定的显示页面, 其代码如下:
[code]
<%@ include file = "/engine.jsp" %>
<!-- 相当于在jsp模型中增加了一个新的变量thisObj,从而实现jsp页面的对象化 -->
<c:out>${thisObj.testVar}</c:out>
[/code]
objectName被WebEngine映射到session中的一个对象,在demo_view.jsp中成为thisObj这个变量,这就相当于java语言中的this指针,从而实现了jsp页面的对象化。

WebEngine还将objectEvent映射到一个Action响应函数并自动调用它,具体的Action代码写在一个独立的java文件或者jsp文件中。
DemoAction.jsp
[code]
<%@ include file = "/jsp_action_begin.jsp" %>
<%!
    //
 // objectName映射为thisObj, objectEvent=test映射对actTest的调用
 // 在这里增加一个actXXX函数之后,即可通过objectEvent=XXX来访问,不需要任何配置
    public Object actTest(){
  // thisObj中的变量可以在视图中使用
  thisObj.set("testVar","hello");
  return success();
 }

 // 如果存在actBeforeAction函数,则该函数在所有action函数之前调用
 public Object actBeforeAction(){
  return success();
 }

 // 如果存在actAfterAction函数,则该函数在所有action函数之后调用
 public Object actAfterAction(){
  return success();
 }
%>
<%@ include file="/jsp_action_end.jsp" %>
[/code]

在Jsplet框架中只需要注册对象,而不需要单独注册每个action。
register.jsp
[code]
<%
    WebEngine.registerType("Demo", new WebActionType("/demo/action/DemoAction.jsp"),pageContext);
%>
[/code]

与Jsplet 框架对比,Model2是对action的建模而不是对object的建模,即它相当于将objectName,objectEvent和 view.jsp绑定在一起定义为一个访问点action.do,绑定过程中需要一个配置文件来固化view.jsp和action之间的联系。因此, Model2并没有完全分离view和model,它隐含假定着objectName只具有一个objectEvent, 并且绑定了一个具体的view(出错页面除外)。
例如, 我们需要两个不同的view来显示同一个数据,则在Model2程序中可能需要配置两个独立的访问点,而在我们的框架中只需要使用两个不同的url:
a_view.jsp?objectName=/@Demo&objectEvent=test
b_view.jsp?objectName=/@Demo&objectEvent=test
同样的web程序甚至可以在前台通过XMLHTTP方式来调用而不需要额外配置!

在Jsplet框架中采用的是对象化的方式而不是Action化的方式,因此存在着多种面向对象的扩展,而所有的扩展都直接体现在url格式的细化上,一切都在阳光下。
  在Jsplet中objectName是WebObject的名称,在全系统内唯一,其格式定义为: objectScope@objectType$objectInstanceId
1. 对象类型objectType
  我们需要注册的是对象类型而不是完整的对象名,一个对象类型可以对应于无数个完整的对象名,例如我们注册了Demo类型的WebObject, 则objectName=/@DemoobjectName=/left/@Demo对应的处理文件都是DemoAction.jsp。
2. 对象生命周期控制objectScope
  objectScope为WebObject所在的域,其格式符合Unix路径命名规范。JSP模型本身支持一些预定义的对象域,包括page, request, session, application等。但为了能够反映现实世界中的对象组织结构,对象域必须是允许自定义的。objectScope被组织成一个树形结构,这是一个 基本的控制结构,其控制策略为
     同时存在的对象域之间必须存在线性序关系(order)
  当系统访问某一对象时,如果该对象所在的对象域不能和现有对象的域处在同一"路径"下(即当对象域之间不能建立父子关系时),系统就会自动销毁不兼容路径 分支下的所有对象。 这种精细的控制策略保证了系统的可扩展性,因为模型上可以保证始终只有一部分对象被创建。
对象转移                                                           系统动作 
/main/@MyObject ==> /main/left/@OtherObject                       无
/main/left/@OtherObject ==> /main/@MyObject                       无
/main/left/@OtherObject ==> /main/left/@MyObject                  无
/main/left/@OtherObject ==> /main/right/@MyObject                自动销毁/main/left子域下的对象,如/main/left/@OtherObject
 
3. 对象实例标识 objectInstanceId
 如果在某一对象域中需要包含多个同一类型的对象,可以通过objectInstanceId来加以区分,这样在同一个页面上我们可以使用多个同样类型的对象。

Jsplet中另外一个扩展是通过事件路由来支持jsp子页面的对象化。例如
http://my.com/demo_main.jsp?objectName=/@Main&eventTarget=/@Sub&objectEvent=test
如果指定了eventTarget参数,则objectEvent由eventTarget对应的对象来响应。
在jsp文件内部我们可以通过include语法来引入子对象,例如
   <jsp:include page="sub_view.jsp?objectName=/@Sub" />
(注:我不是非常清楚Tapestry具体是如何实现对象化的,熟悉Tapestry的朋友可以介绍一下)

在Jsplet中可以通过配置文件来支持对Action的interception, 例如
[code]
<factory>
<listener-filter  class="global.LogFilter" />
<post-listener class="global.CommonActions"/>

<type name="Demo">
 <!-- 如果未指定object, 则缺省为WebObject类型 -->
 <object class="demo.MyWebObject" />
 <listener>
  <filter event="query*|select*" class="demo.LogFilter" />
  <url-listener url="/demo/DemoAction.jsp" />
  <url-listener url="/demo/DemoAction2.jsp" />
 </listener>
</type>

</factory>
[/code]
在上面这个配置文件中,DemoAction.jsp和DemoAction2.jsp是chain关系,即事件响应的传播模型中,如果event没有被标记为stopPropagation,就会传递到下一个listener。

综上所述,可以看到在目前多变的需求环境下,Model 2已不是一种非常完善的Web程序模式,一些重要的设计需求在Model 2模式的推方式中很难得到合适的表达。

分享到:
评论

相关推荐

    韩顺平的model2模式的新闻管理系统

    【标题】:“韩顺平的Model2模式的新闻管理系统”是一种基于Web的新闻发布与管理平台,它采用Model2设计模式,旨在提供高效、稳定且易维护的后台管理系统。Model2模式是MVC(模型-视图-控制器)架构的一个变种,强调...

    Model1和Model开发模式

    在B/S(Browser/Server,浏览器/服务器)架构的开发中,存在两种主要的开发模式:Model1和Model2。这两种模式都是为了更好地管理和组织Web应用程序的结构,提高可维护性和扩展性。以下是对这两种模式的详细解释: *...

    ADC083X.DLL(报错:External model DLL &quot;ADC083X.DLL&quot; not found.)

    ADC083X.DLL(报错:External model DLL "ADC083X.DLL" not found. GLE=0x000036B1.) 注意!注意! 注意:替换后再次仿真时仍然有可能失败,这和电脑系统有关(毕竟用的是Po_Jie版本的),可以尝试换台电脑试一试! ...

    jsp中model2模式的开发小应用

    **Model2模式在JSP中的应用详解** Model2模式,也称为MVC(Model-View-Controller)模式,是Web应用程序设计中常用的一种架构模式。它将业务逻辑、数据处理和用户界面有效地分离,提高了代码的可维护性和可扩展性。...

    model2模式编写用户登录模块

    使用model2模式开发用户登录模块,基于mvc模式的设计理念

    Java设计模式 - 简单工厂 & 工厂方法(构建工厂)源码:FactoryModel

    Java设计模式 - 简单工厂 & 工厂方法(构建工厂)源码:FactoryModel - 详情:https://blog.csdn.net/Dream_Weave/article/details/83989879

    jspBBS源码.BBS论坛,用model1模式的项目

    8. **MVC模式对比**:虽然本项目采用Model1模式,但学习Model2(MVC)模式有助于理解更高级别的架构设计,例如Spring MVC。 通过这个BBS论坛项目,开发者可以锻炼实际操作能力,提升对JSP和Web开发的整体理解。同时...

    新闻管理系统model1模式

    新闻管理系统model1模式是一种常见的软件开发模式,尤其在Web应用中被广泛应用。在这个项目中,model1模式被用来构建一个具备用户登录验证、新闻查询、新闻添加以及安全退出功能的系统。下面将详细阐述model1模式的...

    【Model1模式的Web登录程序】

    【Model1模式】是Web应用程序开发中的一种基本架构模式,主要应用于早期的JSP(JavaServer Pages)开发中。在Model1模式中,所有的业务...因此,现代Web应用更倾向于使用Model2(MVC)模式,将职责分离以提高代码质量。

    设计模式学习:Model View Presenter (MVP) mvc mvp

    **设计模式学习:Model View Presenter (MVP)与MVC** 在软件开发中,设计模式是一种通用解决方案,用于解决常见的设计问题,以提高代码的可读性、可维护性和复用性。MVP(Model View Presenter)和MVC(Model View ...

    JSP model2(MVC)思想实现用户注册

    在Web开发领域,JSP Model2模式是一种广泛应用的架构,它是对MVC(Model-View-Controller)设计模式的一种实现。MVC模式是软件工程中用于分隔应用程序数据和显示逻辑的重要工具,使得代码结构清晰,易于维护。下面将...

    【一个简单的Model2模式的Java EE项目(Web登录程序)】

    【一个简单的Model2模式的Java EE项目(Web登录程序)】是基于经典的MVC(Model-View-Controller)设计模式的实现,Model2是MVC模式在Java Web开发中的一个变体,它主要由Servlet、JSP(JavaServer Pages)和...

    TriLib 2 - Model Loading Package v2.0.6.zip

    使用TriLib 2 - Model Loading Package时,开发者首先需要将`TriLib 2 - Model Loading Package v2.0.6.unitypackage`文件导入到Unity项目中。在Unity编辑器中,选择`Assets &gt; Import Package &gt; Custom Package`,...

    3dmmods_原神自定义模型导入工具( GI-Model-Importer ).zip

    【3dmmods_原神自定义模型导入工具(GI-Model-Importer)】 原神,作为一款备受全球玩家喜爱的开放世界冒险游戏,其丰富的角色和环境设计吸引着大量玩家进行二次创作。为了满足这些玩家的需求,3DMods社区开发了一...

    Model2模块实现用户注册登录.zip

    在IT行业中,Web开发是至关重要的领域,而Model2架构是一种经典的MVC(Model-View-Controller)设计模式的应用,广泛用于构建动态交互式的Web应用。Model2模式源自JSP和Servlet技术,它将业务逻辑、数据处理和用户...

    利用model模式开发登陆系统

    2. **数据存储**:在Model1模式中,数据通常存储在关系型数据库中,如MySQL或Oracle。`UserLogin`可能需要与数据库进行交互,执行SQL查询来检查用户名和密码的有效性。这可能涉及到连接池、SQL语句的编写以及异常...

    Screen3Model 估算模式界面版

    Screen3Model 估算模式界面版

    WORKING MODEL 2D 2004 V7.0

    "WORKING MODEL 2D 2004 V7.0"是一款三维动态模拟软件,专为产品设计和工程领域中的原型验证而设计。这款工具允许用户在2D环境中创建和测试他们的设计理念,以评估其功能性和物理可行性,从而在实际制造前优化设计。...

    关于设计模式MVC(Model View Controller)模型-视图-控制器

    **MVC 模型-视图-控制器**是一种软件设计模式,起源于1980年代的Xerox PARC为Smalltalk-80编程语言设计的。MVC模式被广泛应用于现代软件开发,特别是在Java、ColdFusion和PHP等平台上。它的主要目标是将应用程序的...

    iOS json一键转换Model

    1. 引入库:将JSONModel库导入项目,可以通过CocoaPods或Carthage等依赖管理工具,或者直接将源码文件添加到项目中。 2. 创建模型类:根据需要解析的JSON数据,创建对应的Swift或Objective-C模型类,定义相应的属性...

Global site tag (gtag.js) - Google Analytics