据说JSF的主要负责人就是
struts的主要作者,所以二者的相似点还是有很多的。
-
都采用taglib来处理表示层:在jsp页面中,二者都是采用一套标记库来处理页面的表示和model层的交
互。
-
二者都采用了bean来作为和jsp页面对应的model层。该model层保存了jsp页面上的数
据,同时可以作一些验证工作,在struts中就是FormBean,在JSF中就是back bean。
-
都
采用bean作为控制层,Struts中采用ActionBean来处理业务逻辑,对于简单的应用可以直接在ActionBean中编写业务逻辑代码,也
可以调用另外的bean或者EJB来处理业务逻辑;对于JSF则采用backing bean来处理业务逻辑,同样,backing
bean也可以直接编写业务逻辑或者调用其他的bean来处理业务逻辑。
-
都采用xml配置文件来处理bean的配置,页面导航等问题,增加了系统的灵活性。
-
都采用资源文件来处理国际化和本地化的问题。
然而,二者的不同点也很多,下面分别说明:
-
首
先二者的侧重点不同,Struts侧重于控制层,侧重于如何分派和处理用户的请求,所以表示层的taglib功能不够强大。而JSF则侧重于表示层,实现
了大量的标准组件,允许开发人员对表示层有更多的控制权,同时JSF实现了一个开放的架构,允许开发人员创建自己的组件,或者在现有的组件上继承,开发功
能更强大的组件。本人认为这是JSF最大的一个特色。(有点类似于vcl和.net组件)
-
和jsp
对应的model层,在Struts中采用FormBean来保存用户输入的数据,基本上一般字段的类型都是String。而且可以进行简单的验证,当然
如果采用动态的FormBean就不能在FormBean中进行验证了。在Struts中,jsp和FormBean是紧密结合在一起的,只要写一个
jsp就必须对应一个FormBean,同时jsp上的每个组件都对应FormBean中相同名字的字段。本人认为这里不太灵活,比如,开发页面的时候就
必须考虑后台的FormBean的实现,但此时如果该页面没有FormBean的化则程序运行时会出错。在JSF中,JSP页面中的组件通过value属
性和backing bean的字段关联,这样就有比较大的灵活性,页面上的每个组件可以对应相同的backing
bean,也可以对应不同的backing bean(当然本人认为在一般的应用中,一个页面上的组件还是都对应到一个backing
bean较好),而且在设计页面的时候可以不考虑backing bean如何设计,可以在设计完页面之后再考虑backing bean的实现问题。
-
关于数据验证,Struts可以采用在FormBean中的验证函数中进
行验证,也可以使用validator进行验证(关于这种验证方法,本人没有测试过,不知效果如何,希望有经验的朋友指教!)。在JSF中,提供了一些标
准的validator。可以对输入的数据做一些简单的验证,例如验证数值数据的范围,字段是否必填等。但其验证的反馈信息为英文。如果该信息不能自定义
的化,那么针对国内的应用就不太适合了,目前本人还没有找到该反馈信息是否能够自定义的办法。另外对于input类型的组件可以通过validator属
性关联到backing bean的一个验证方法上。在事件处理方法中进行验证也是一个办法。
在JSF中还有一个问题就是在JSF生成的页面
中,组件的Id命名比较怪异,所有的组件的id都类似于“form:compnentid”即form的名称+“:”
+组件的id。这样通过javascript访问组件就不是很方便,通过form.id形式好像不能访问到组件。不知道各位有没有好的解决方案。
-
控制层:Struts
中通过form的action来提交请求,通过ActionServlet来分发请求,最后由ActionBean来处理请求,在Action中实现业务
逻辑或者调用其他的业务逻辑bean来完成用户的请求并返回客户端。在这里,一个form只有一个action,即一个页面只能提交到一个action
Bean。对于页面上有多个按钮都需要提交的情况就需要使用一些变通的方法了。和传统的web开发的模式比较接近。
对于JSF,采用了事件模
式来处理用户提交的请求。JSF实现了事件监听器来监测事件,例如当用户单击了一个按钮就会触发一个按钮单击事件,还有valuechange事件监听器
来监测数值改变的事件等。例如在页面中通过通过CommandButton按钮的action属性来关联到backing
bean的方法来执行相应的操作。 每个不同的按钮都可以关联不同的方法,当然也可以关联相同的方法(这样就和Action
Bean非常类似了)。这中开发模式比较接近于传统的c/s模式或者Asp.net的开发模式。对于那些从c/s架构程序或者Asp.net架构转过来的
开发者来说,这种方式可能更自然一些。
在JSF的一些简单的示例程序中,通常把和jsp对应的model层和jsp所提交的action放在
同一个backing
bean中,即业务逻辑和业务逻辑所处理的数据在同一个bean中。本人认为,这样的结构只能用在简单的应用中,对于企业级的开发并不适合。应该将页面所
关联的数据和页面所做的action分开,这样的结构更好一些,比较类似于struts的结构。
JSF的backing
bean中的方法访问session,request等没有struts中的直观。笔者找了很多例子才知道如何访问session中的数据。
-
页
面的导航:关于页面的导航,struts和JSF比较类似。都是在xml的配置文件中配置导航规则。每个要跳转的页面都有一个别名,在程序中通过别名进行
跳转。另外Struts中的跳转是在ActionBean中发生,execute方法最后返回一个actionForward来进行跳转。而JSF则在事
件处理方法中最后返回一个字符串,由系统在xml文件中匹配自动进行跳转。在JSF中也可以通过在JSP页面的CommandButton的action
属性中直接填写跳转的别名直接跳转,而不必经过事件处理方法的处理。
-
资
源文件的管理:Struts和JSF对于资源文件的管理比较类似,Struts中在struts-config.xml中对资源文件进行配置,实现整个程
序的统一管理。而对于JSF则可以在每个JSP页面中分别定义资源文件,然后通过资源文件的别名来访问资源文件中的内容。两者的格式也不相同,在
Struts中,格式为: grade1.grade2.grade3 = your
information,通过“.”来表示级别。而在JSF中则必须通过下划线来表示级别,例如grade1_grade2_grade3= your
information。本人认为还是struts的方案更直观一些。另外在Struts的资源文件中可以定义信息的显示格式,例如:
error.header,error.footer。而JSF中如何定义还不太清楚,或者可以通过定义Messages标记的属性来定义。
分享到:
相关推荐
JSF与Struts的区别,JSF是面向组件编程的,Struts不是面向组件编程。JSF使用范围没有Struts普及。
JSF与Struts的区别.doc
基于J2EE下的JSF与Struts框架比较分析
详细介绍JSF与Struts的异同 详细介绍JSF与Struts的异同
JSF 已经可以完成 Struts 可以做的任何事,而且做的更多。Struts 并不是来自于强制性的需求。它是开发人员厌烦了一次次的编写相同的逻辑而创造的。JSF 的出现,既是必然的需要也是竞争的结果。
word文档。 <br>这里我们要将 Tapestry 与其它主要的 Java Web 框架做一番比较,包括 Struts,JSF。 ……
JSF与Struts的异同.rar
MVC模式JSF与Struts的异同小结,仅仅是学习则以!
jsf struts
先简单的介绍jsf和struts.接着详细的分析了jsf和struts的优缺点.对如何改进,结合jsf和struts各自的优点,并对中间的可行性做出了详细的分析. 最后是对该中间件的详细构架设计和实现. 希望对学jsf和struts,or开发...
Struts+Spring+Hibernate+Jsf
Struts和JSF/Tapestry都属于表现层框架,这两种分属不同性质的框架,后者是一种事件驱动型的组件模型,而Struts只是单纯的MVC模式框架,老外总是急吼吼说事件驱动型就比MVC模式框架好,何以见得,我们下面进行详细...
基于Struts,应用JSF的一个登陆DEMO
struts2.0集成JSF插件,完全可以运行
struts和jsf分页
中文详述 strut2 jsf 用法 均为chm格式
我的J2ee成功之路 第20章源码,解压导入eclipse里,配置好即可运行
就像Struts框架一样,JSF定义了一套JSF标签 JSF的全称 1、Joint Strike Fighter (JSF) 2、Java Server Faces (JSF) Java Server Faces (JSF) JSF是一种用于构建Java Web 应用程序的标准框架(是Java ...
包内有一个jsf例子,多个struts tiles例子 是学习框架不错的例子!
一个关于ssha最基础的集合的例子,还用到了json。这个小项目用到了struts,spring,hibernate,异步刷新(ajax),json等技术。如果你刚接触这几个框架,或是想尝试结合这几个框架,那这个项目对你来说很有用。