在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=/@Demo和objectName=/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模式的新闻管理系统”是一种基于Web的新闻发布与管理平台,它采用Model2设计模式,旨在提供高效、稳定且易维护的后台管理系统。Model2模式是MVC(模型-视图-控制器)架构的一个变种,强调...
在B/S(Browser/Server,浏览器/服务器)架构的开发中,存在两种主要的开发模式:Model1和Model2。这两种模式都是为了更好地管理和组织Web应用程序的结构,提高可维护性和扩展性。以下是对这两种模式的详细解释: *...
ADC083X.DLL(报错:External model DLL "ADC083X.DLL" not found. GLE=0x000036B1.) 注意!注意! 注意:替换后再次仿真时仍然有可能失败,这和电脑系统有关(毕竟用的是Po_Jie版本的),可以尝试换台电脑试一试! ...
**Model2模式在JSP中的应用详解** Model2模式,也称为MVC(Model-View-Controller)模式,是Web应用程序设计中常用的一种架构模式。它将业务逻辑、数据处理和用户界面有效地分离,提高了代码的可维护性和可扩展性。...
使用model2模式开发用户登录模块,基于mvc模式的设计理念
Java设计模式 - 简单工厂 & 工厂方法(构建工厂)源码:FactoryModel - 详情:https://blog.csdn.net/Dream_Weave/article/details/83989879
8. **MVC模式对比**:虽然本项目采用Model1模式,但学习Model2(MVC)模式有助于理解更高级别的架构设计,例如Spring MVC。 通过这个BBS论坛项目,开发者可以锻炼实际操作能力,提升对JSP和Web开发的整体理解。同时...
新闻管理系统model1模式是一种常见的软件开发模式,尤其在Web应用中被广泛应用。在这个项目中,model1模式被用来构建一个具备用户登录验证、新闻查询、新闻添加以及安全退出功能的系统。下面将详细阐述model1模式的...
【3dmmods_原神自定义模型导入工具(GI-Model-Importer)】 原神,作为一款备受全球玩家喜爱的开放世界冒险游戏,其丰富的角色和环境设计吸引着大量玩家进行二次创作。为了满足这些玩家的需求,3DMods社区开发了一...
【Model1模式】是Web应用程序开发中的一种基本架构模式,主要应用于早期的JSP(JavaServer Pages)开发中。在Model1模式中,所有的业务...因此,现代Web应用更倾向于使用Model2(MVC)模式,将职责分离以提高代码质量。
**设计模式学习:Model View Presenter (MVP)与MVC** 在软件开发中,设计模式是一种通用解决方案,用于解决常见的设计问题,以提高代码的可读性、可维护性和复用性。MVP(Model View Presenter)和MVC(Model View ...
Screen3Model 估算模式界面版
在Web开发领域,JSP Model2模式是一种广泛应用的架构,它是对MVC(Model-View-Controller)设计模式的一种实现。MVC模式是软件工程中用于分隔应用程序数据和显示逻辑的重要工具,使得代码结构清晰,易于维护。下面将...
【一个简单的Model2模式的Java EE项目(Web登录程序)】是基于经典的MVC(Model-View-Controller)设计模式的实现,Model2是MVC模式在Java Web开发中的一个变体,它主要由Servlet、JSP(JavaServer Pages)和...
使用TriLib 2 - Model Loading Package时,开发者首先需要将`TriLib 2 - Model Loading Package v2.0.6.unitypackage`文件导入到Unity项目中。在Unity编辑器中,选择`Assets > Import Package > Custom Package`,...
在IT行业中,Web开发是至关重要的领域,而Model2架构是一种经典的MVC(Model-View-Controller)设计模式的应用,广泛用于构建动态交互式的Web应用。Model2模式源自JSP和Servlet技术,它将业务逻辑、数据处理和用户...
2. **数据存储**:在Model1模式中,数据通常存储在关系型数据库中,如MySQL或Oracle。`UserLogin`可能需要与数据库进行交互,执行SQL查询来检查用户名和密码的有效性。这可能涉及到连接池、SQL语句的编写以及异常...
"WORKING MODEL 2D 2004 V7.0"是一款三维动态模拟软件,专为产品设计和工程领域中的原型验证而设计。这款工具允许用户在2D环境中创建和测试他们的设计理念,以评估其功能性和物理可行性,从而在实际制造前优化设计。...
**MVC 模型-视图-控制器**是一种软件设计模式,起源于1980年代的Xerox PARC为Smalltalk-80编程语言设计的。MVC模式被广泛应用于现代软件开发,特别是在Java、ColdFusion和PHP等平台上。它的主要目标是将应用程序的...
1. 引入库:将JSONModel库导入项目,可以通过CocoaPods或Carthage等依赖管理工具,或者直接将源码文件添加到项目中。 2. 创建模型类:根据需要解析的JSON数据,创建对应的Swift或Objective-C模型类,定义相应的属性...