http://www.jdon.com/artichect/sjt.htm Struts/Tapestry/JSF是目前J2EE表现层新老组合的框架技术。从诞生时间上看,Struts应该比较早,使用得非常广泛,Tapestry 3.0逐渐引起广泛的重视,正当Tapestry即将大显身手时期,SUN推出JSF标准技术,虽然JSF一开始推出尚不成熟,留出了一段空白期,但是随着JSF1.1标准推出,JSF开始正面出击,粉面隆重登场了。 其实,JSF和Tapestry也并不是那种头碰头的相同竞争性技术,两者还是各有侧重点的,不过比较细微,但是这种细微点在实现一个大工程时可能带来不同的感受和变化。 首先,我们从一个高度来抽象一下表现层框架应有的技术架构,下图可以说所有表现层框架技术都必须实现的功能架构图: 当然,我们不必废话罗嗦MVC模式,MVC模式是基准模式,现在框架技术已经不必再拼是否是MVC模式了。 在上图MVC模式基础上,一个表现层框架无外乎要实现图中的三个功能: 1.在当前页面能够显示一个组件对象的内容;而不是象纯JSP那样,需要在Jsp页面写入“调用对象方法”的Java代码。 2.当用户按下页面的提交按扭或链接后,事件发生,这时应该触发服务器端并将当前页面的参数提交给服务器。这种机制表现在Form表单提交和有参数的链接<a href=""></a> 3.从一个页面视图直接跳转到另外一个页面视图,单纯的导航作用。 我们通过下表来比较这 三种框架在实现上图各个功能时技术细节,从而得出他们的异同点和偏重点。
Struts组件编程模型 Struts实现组件编程时有一些复杂:经常为一个页面中需要引入多个组件而头疼,因为Struts中无法直接引入多个组件,必须绕一些圈子: 一般分两种情况:如果同一个Action就可以对付这些组件,那么在这种情况下有两个办法: 1.将这多个组件装入一个ActionForm中,如使用MapForm等机制; 2.手工将多个组件装入request/session等scope中,然后根据其名称在jsp中获得。 这两个方法都有缺点: 第一种办法经常一个ActionForm弄得面目全非,变成一个大杂烩,违反了OO分派封装的原则;第2种办法其实又回到jsp编程; 第二种情况,如果这些组件必须有预先由不同的Action来处理,每个组件必须经过Action -->ActionForm流程,在这种情况下有两种办法: 1.使用Tiles, 不同流程输出到同一个页面的不同区域。是一种并行处理方式。 2. 对多个流程首尾相连,第一Action forward结果是第二个Action,最后输出一个Jsp,在这个jsp中就可以使用前面多个流程的多个ActionForm了,这属于串行方式。 Struts组件模型缺点 Struts组件编程必须限定在Action/ActionForm/JSP这三个框框中做文章,难度相对比较大,而Tapestry/JSF则没有太多这些技术框框限制,两者在组件编程方面更让编程者自由一些,方便一些,这也是组件型框架的优势吧。 Struts标签库 在Struts中,经常需要使用标签库来显示组件ActionForm中内容,这就涉及到一个结合的问题,标签库是别人写的,参考Struts的标签库用法,而组件是自己的,难度和麻烦就体现在这个结合点上。 JSF基本思路和Struts差不多,只不过换了不同标签库,也需要标签库+组件的结合思考,不过因为组件这里是通用组件,没有什么限制,所以这样比Struts要轻松一些。 Tapestry使用了组件库概念替代了标签库,没有标签库概念,这样就没有标签库和自己的组件需要结合的问题,都是组件的使用,组件中分Tapestry标准组件和自己定义的组件,这也是接触了Jsp体系的人学习Tapestry面临的一个思路转换。 具体以页面跳转为例子,页面跳转是靠链接<a href="目标"></a> 实现,链接是页面经常使用的元素。 Struts提供的html:link在频繁使用就特别不方便,尤其在传递多个参数时:其中html:link的page值,是跳转对方页面或Action的path,这个path一般需要到struts-config.xml查找Action的相应path,一旦配置文件path值修改,涉及到这个所有相关页面都要修改。 JSF将链接概念划分两个方面:导航性质和事件激活,在导航方面还是需要到配置faces-config查询Navigation的from-outcome的值。 由于Tapestry没有标签库概念,只有组件或页面两个概念,因此,链接跳转目标要么是组件,要么是页面,简洁简单,它没有多余的path概念,就是组件名,也就是对象名称,组件名称和path名称合二为一。 总结 JSF在很大程度上类似Struts,而不是类似Tapestry,可以说是一种Struts 2.0,都是采取标签库+组件的形式,只是JSF的组件概念没有象Struts那样必须继承ActionForm的限制;JSF在事件粒度上要细腻,不象Struts那样,一个表单一个事件,JSF可以细化到表单中的每个字段上。 JSF只有在组件和事件机制这个概念上类似Tapestry,但是不似Tapestry那样是一个完全组件的框架,所以,如果你做一个对页面要求灵活度相当高的系统,选用Tapestry是第一考虑。 Struts/JSF则适合在一般的数据页面录入的系统中,对于Struts和JSF的选用,我目前个人观点是:如果你是一个新的系统,可以直接从JSF开始;如果你已经使用Struts,不必转换,如果需要切换,可以将JSF和Tapestry一起考虑。 另外,JSF/Tapestry不只是支持Html,也支持多种客户端语言如WML或XUI等。 这三者之间关系:如果说Struts是左派;那Tapestry则是右派;而JSF则是中间派,中庸主义是SUN联盟的一贯策略。 当然,你也可以发表你在实践中这三者任何一个的使用感受,以使得后来者有一个比较。 相关: 组件框架技术tapestry及简单对比 JSF与Struts的异同 用了Struts的体会 Java企业系统架构选择考量 更多表现层框架讨论 更多MVC专题 |
表现层框架Struts/Tapestry/JSF架构比较 [转]
转载于:https://www.cnblogs.com/elina/archive/2009/08/04/1538381.html
相关文章:

1022 Digital Library
1. 关键数据结构 map<string,vector<string> > mp[6] 其中mp[1]代表从书名映射到id(id可能无,可能不止一个,所以要用vector),mp[2]是从作者映射到id……mp[5]代表从year映射到id。 2. 卡住的第一个地方是…

event.keyCode用法及列表
用户名:<input type"text" id"UserAccount" onKeyPress"JumpByEnter(UserPwd)" />密码:<input name"UserPwd" type"password" onKeyPress"IsEnterKeyPress()"> JavaScript&…

网络游戏术语(转)
转自:https://site.douban.com/149989/widget/notes/8053161/note/231207595/ AC – Armor Class,盔甲等级、级别Account – 账号,与密码Password相对Add – 一只玩家加入到组队中,如果请求别人组队,可说Add me pls.AO…

vim的一些快捷键,备忘
vim的一些快捷键,备忘 快捷键 作用ctrlg 显示当前行的信息G 跳到某一行:%s/oldtxt/newtxt/g …

1051 Pop Sequence(两种双指针思路)
目录 思路一:以入栈序列为总纲,2层循环,外for内while 思路二:一层while 思路一:以入栈序列为总纲,2层循环,外for内while 注意弹栈之前要判空,不然会出现段错误。 AC代码 #inclu…

iOS底层原理 - 常驻线程
iOS底层原理 - 常驻线程 在 AFN 2.0 时代,会经常看到 AFN 创建一个常驻线程的方式: 0️⃣ AFN 2.0 时代的常驻线程 (NSThread *)networkRequestThread {static NSThread *_networkRequestThread nil;static dispatch_once_t oncePredicate;dispatch_on…

A monad tutorial for Clojure programmers (part 3)
Before moving on to the more advanced aspects of monads, let’s recapitulate what defines a monad (see part 1 and part 2 for explanations): A data structure that represents the result of a computation, or the computation itself. We haven’t seen an example…

Flex精华摘要--使用AS脚本
在MXML文件中实现ActionScript逻辑的几种方法:最简单的方法,在一个MXML文件中通过组件的事件直接书写简单的逻辑控制,但是并不推荐。 <?xml version"1.0" encoding"utf-8"?> <mx:Application xmlns:mx"h…

(C++)自定义链表并写入
确定链表节点的组成,一般由数据和指针构成 struct node{int data;//数据域node* next;//指针域 }; 使用new运算符为节点分配内存空间 node* p new node; 编写创建列表函数,参数为链表的长度(从用户输入读入),返回值为创建的列表的头指针…

Unicode转义(\uXXXX)的编码和解码
在涉及Web前端开发时, 有时会遇到\uXXXX格式表示的字符, 其中XXXX是16进制数字的字符串表示形式, 在js中这个叫Unicode转义字符, 和\n \r同属于转义字符. 在其他语言中也有类似的, 可能还有其它变形的格式. 多数时候遇到需要解码的情况多点, 所以会先介绍解码decode, 后介绍…

BZOJ 2004 [Hnoi2010]Bus 公交线路
题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id2004 题解 状压dp,记f[i][S]f[i][S]f[i][S]表示[1,i−p][1,i-p][1,i−p]的车都被安排好了,而[i−p1,i][i-p1,i][i−p1,i]的车中,SSS中有111的位置都安排有车停,并且恰…

【转载】C语言编译全过程
今天在blog.chinaunix.net/u3博客看到一篇关于语言编译过程的文章,觉得精简,清晰所以摘录下来我的blog。作为一个程序员了解编译过程对程序的编写也很有帮助。下面是博文的内容:编译的概念:编译程序读取源程序(字符流&…

5层模型中数据从源主机到目的主机之旅
报文是用户发送的数据 传输层可能对报文进行拆分,加上段头 网络层会加上网络层的头,构成的协议数据单元叫做数据报 链路层会加头加尾构造帧 路由器的链路层会去掉帧头帧尾,还原到网络层数据报 再次封装成链路层的数据帧 目的主机的链路层再…

JavaScript模式读书笔记 第5章 对象创建模式
1,命名空间模式 namespace <script>var myApp {};//通过全局变量来实现命名空间maApp.Parent function (){};myApp.Child function(){};</script>通用命名空间函数<script>//不安全代码var myApp {};//安全代码if(typeof myApp "undef…

174. Dungeon Game
一、题目 1、审题 2、分析 只能向右、向下移动的王子,从左上角要到右下角救公主,每经过一个方格,可能获得血瓶加血量,或者碰到怪物减血量,当王子血量 < 1 时就挂了,为了能成功救得公主,求王子…

DotNetNuke安装与下载
【下载专区】 DotNetNuke (DNN) 5.1 稳定版正式发布 http://www.dnnmix.com/dotnetnuke-dnn-51-released/ DotNetNuke (DNN) 资源共享 http://www.dnnmix.com/resources/ DotNetNuke官方下载 http://www.dotnetnuke.com/tabid/125/default.aspx 【安装教程】 DotNetNuke安装大…

1025 反转链表
1. 第一次做链表题,但是这题其实也就是套了个链表的壳子,虽然在结点的结构体里面有下一节点地址next这个属性,但是也只在最初给结点标序号时用到,由于没有真正对链表实施倒序,所以后面输出的下一结点的地址实际上只是算…

关于margin
<html><body><div style"width:200px;height:200px;background-color:red;> <div style"width:100px;height:100px;background-color:black;margin-left:300px;"></div></div></body></html> 左边是火狐显示&a…

DNS迭代式和递归式域名查询对比
背景知识:DNS数据库是树状的层次式的 本地域名服务器并不在这个体系当中,它相当于这个体系面向用户的代理。 迭代式:DNS server告诉用户:我不认识这域名,但我知道你可以问哪个DNS服务器 递归式:用户告诉D…

UIActionSheet在iOS8中被弃用造成的错误
UIActionSheet在iOS7.0中效果图如下: UIActionSheet在iOS8中效果图如下: 造成这样的原因,是因为此控件在iOS8中被弃用了,而使用了UIAlertViewController替代的原因,具…

SQL分页语句(转)
有关分页 SQL 的资料很多,有的使用存储过程,有的使用游标。本人不喜欢使用游标,我觉得它耗资、效率低;使用存储过程是个不错的选择,因为存储过程是经过预编译的,执行效率高,也更灵活。先看看单条…

一个考查作用域以及闭包的题目
var a 2;var func (function(){ var a 3; return function(){a;console.log(a); } })(); func();func(); 1.涉及的知识点: (1)JS变量的作用域 (2)闭包2.变量的作用域,通俗来说就是变量所能起到作用的范围…

弄懂“进程”(上):3个组成部分、4个基本特征、4个基本状态
目录 进程实体的三个部分 1.PCB 2.程序段 3.相关的数据段 进程的四大特征 1.动态性 2.并发性 3.独立性 4.异步性 进程的状态(3个基本挂起) 1.三个基本状态 2.挂起状态 进程实体的三个部分 1.PCB 作用是让参与并发执行的每个程序独立运行,或者说&…

解决Failed to execute goal org.apache.maven.plugins
1.Maven构建失败 Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin: 2.3 . 2 :compile ( default-compile) on project oecp: Compilation failure 2.解决方法 把jdk换成自己安装的jdk 换后,再maven install就可以了转载于:https://www.cnb…

P4722 【模板】最大流
P4722 【模板】最大流 加强版 / 预流推进 今日心血来潮,打算学习hlpp 然后学了一阵子。发现反向边建错了。容量并不是0.qwq 然后就荒废了一晚上。 算法流程的话。有时间补上 #include<cstdio> #include<algorithm> #include<iostream> #include&l…

与我们的书合影——在2009北京国际图书展(BIBF)
2009年9月5日,武汉博文编辑许莹、夏青观看了于国展旧馆(静安庄)举行的2009北京国际图书展(BIBF)“专业场”。在电子工业出版社展台,编辑兴奋地与我们的几本畅销书(《把时间当作朋友》、《走出软…

弄懂“进程”(下):进程的控制、同步和通信
进程控制 是进程管理的主要功能,负责创建和终止进程、进程执行过程中的状态转换。 由操作系统内核通过原语实现。 1.OS内核 常驻内存的、紧靠硬件的软件层次,运行在系统态(又称管态、内核态),以免遭到用户程序的破坏。 主要包括…

(转自Timon's wang blogs)C#实现web信息自动抓取
原文转自:http://www.csharp.net.cn/post/C实现web信息自动抓取.html主要为了学习一下相关的网络蜘蛛,为自己获取信息使用背景 随着Internet的普及,网络信息正以极高的速度增长,在这么多数据中找到自己需要的信息是一件很繁琐的事…

数据结构-栈与队列
栈的定义 栈是限定仅在表尾进行插入和删除操作的线性表 我们把允许插入和删除的一端称为栈顶 (top) ,另一端称为栈底 (bottom) ,不含任何数据元素的栈称为空栈。 栈又称为后进先出 (Last In Filrst Out) 的线性表,简称LIFO结构。 理解栈的定义…

雷观(七):靠谱的程序员,不是随便一个码农就可以做到的
在学习Web开发4年之后,我自己可以独立做一些基本的项目了。在加入前单位秒针,也做了几个Web项目。 我发现一个现象,很多公司大部分的Web项目,用到的技术很少,主要就是SSH等框架,实现一些行业的业务逻辑&…