我的一个客户不知道该选用Struts还是JSF
就像你预料的那样
我通常会问
这
中框架之间有什么区别?当然
除了我的这个客户外很多人都面临这样的选择
总的来说我建议在新项目中优先考虑JSF虽然常常有一些商业上的因素迫使我们为现有的项目选择了Struts而且那些解决方案还有待考验但是让我们面对一个事实JSF比Struts好多了
下面是我选择JSF而不选Struts的十大理由
Components(组件)
Render Kits
Renderers
Value Binding Expressions(值绑定表达式)
Event Model(事件模型)
Extensibility(可扩展性)
Managed Beans(Dependency Injection 依赖注入)
POJO Action Methods
JSF is the standard Javabased web app framework (JSF是java web应用程序的标准框架)
Theres only one Struts(只有一个Struts)
Theres only one Struts(只有一个Struts)
Struts是一个开源产品然而JSF是一个标准这个细节常常被新的JSF学习者忽略其实这是显而易见的因为我们有多个JSF的实现虽然JSF还很不成熟但是我们已经有了个优秀的JSF实现可以选择Sun的参考实现和Apache的MyFaces另一方面我们只有一个Struts
JSF is the standard(JSF是标准)
JEE 要提供一个JSF的实现这表明JSF不久将会无处不在这可能与你无关但是和工具供应商密切相关现在大概有个java web应用程序框架工具供应商不会情愿去支持一个特别的框架但是他们会毫不犹豫的去支持一个标准而且不止供应商开源项目也会迅速的聚集在JSF的四周争先恐后的去实现相同的功能比如说直到我们去实现本质上和Shale的Tapestry差不多的视图的时候我才知道Facalets(从长远来看我相信这种冗余是件好事会给我们带来好处)
POJO Action Methods
Struts的行为是和Struts的API绑定在一起的但是JSF的行为方法可以在POJPO中实现这意味着你不用在表单和模型对象之间实现一个多余的行为层顺便说一下在JSF里面没有行为对象行为在模型对象中实现但是也请注意一点如果你愿意你也可以生成与JSF独立的行为对象在Struts里面你有Form Bean和Action BeanForm Bean包含数据而Action Bean包含逻辑OO狂会想去合并前者在Struts你办不到但是在JSF中你可以分开数据和逻辑也可以合并到一个对象中一切由你决定
Managed Beans(Dependency Injection 依赖注入)
和Spring一样JSF也使用了依赖注入(DJ)(或控制反转(IoC))去实例化和初始化BeanStruts的确为你生成了Form Bean和Action Bean但是JSF可以为你生成各种各样的Managed Bean
Extensibility(可扩展性)
这个很重要JSF有个对象实现了这个框架的大部分功能而且你可以很容易的用你自己的实现代替原有实现比如你想加一个自定义参数在JSF表达式语言里面或是添加一个自己的视图控制器以便于区分组件和HTML事实上Shale实现了上面的功能如果你还没有满足JSF提供了几个地方你可以轻松的控制JSF的生命周期Shale给你的会更多
Event Model(事件模型)
JSF的事件模型使你可以对值改变动作JSF生命周期阶段变换等作出反应在JSF中那些事件都是在服务器端处理的这肯定是一个缺陷好在JSF计划支持客户端事件拭目以待吧
Value Binding Expressions(值绑定表达式)
在Struts中你负责把数据从Form传递到模型对象你实现的Action的execute方法是把Form作为一个参数然后你再手动的把数据从Form Bean里面取出放到模型对象里面你要为应用里面的每个Form做这些事情然而在JSF里面你只需像这样#{modelproperty} 就够了其他的交给JSF来处理
Renderers
你有看过Struts的标签的源代码吗?它直接生成HTMLJSF组件标签什么都不生成它和服务器上的一对componentrenderer对应Component维护组件状态rendered负责获得视图重点是renderers是可插拔的即你可以根据自己需求实现然后替代掉默认实现比如说我在NFJS上面的Felix谈话中举例说明了怎么去实现一个自定义的label renderer你只需要配置你的rendererJSF就会自动在你的应用程序里面使用他
Render Kits
在几年前我曾经有份Struts咨询工作我们必须同时支持浏览器和无线设备非常痛苦但是用JSF来完成那个任务非常容易因为你可以生成你自己的render kit-为一种特定显示技术的renderers的集合-然后配置到JSF里面
Components(组件)
组件是Struts和JSF之间最大的区别就像Swing一样JSF提供丰富的底层构件去开发组件然后添加到标准的组件集那些底层构件让你很容易的生成自己的组件并且和别人共享现在我们到处都能看到自定义组件跳出来比如说Oracle的ADF和MyFaces两者都提供了丰富的组件集就像javascript日历tree等等当然组件只是一部分典型的是组件都和一个独立的renderer对应这给我们带来了真正的好处(看第条)但是和JSF中的很多东西一样你不一定要墨守成规只要你愿意你可以实现render自己的组件虽然这样你会失去给组件加入别的renderer的能力