据说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都类似于formcompnentid即form的名称+ +组件的id这样通过javascript访问组件就不是很方便通过formid形式好像不能访问到组件不知道各位有没有好的解决方案
控制层Struts 中通过form的action来提交请求通过ActionServlet来分发请求最后由ActionBean来处理请求在Action中实现业务 逻辑或者调用其他的业务逻辑bean来完成用户的请求并返回客户端在这里一个form只有一个action即一个页面只能提交到一个action Bean对于页面上有多个按钮都需要提交的情况就需要使用一些变通的方法了和传统的web开发的模式比较接近
对于JSF采用了事件模 式来处理用户提交的请求JSF实现了事件监听器来监测事件例如当用户单击了一个按钮就会触发一个按钮单击事件还有valuechange事件监听器 来监测数值改变的事件等例如在页面中通过通过CommandButton按钮的action属性来关联到backing bean的方法来执行相应的操作 每个不同的按钮都可以关联不同的方法当然也可以关联相同的方法(这样就和Action Bean非常类似了)这中开发模式比较接近于传统的c/s模式或者的开发模式对于那些从c/s架构程序或者架构转过来的 开发者来说这种方式可能更自然一些
在JSF的一些简单的示例程序中通常把和jsp对应的model层和jsp所提交的action放在 同一个backing bean中即业务逻辑和业务逻辑所处理的数据在同一个bean中本人认为这样的结构只能用在简单的应用中对于企业级的开发并不适合应该将页面所 关联的数据和页面所做的action分开这样的结构更好一些比较类似于struts的结构
JSF的backing bean中的方法访问sessionrequest等没有struts中的直观笔者找了很多例子才知道如何访问session中的数据
页面的导航关于页面的导航struts和JSF比较类似都是在xml的配置文件中配置导航规则每个要跳转的页面都有一个别名在程序中通过别名进行 跳转另外Struts中的跳转是在ActionBean中发生execute方法最后返回一个actionForward来进行跳转而JSF则在事 件处理方法中最后返回一个字符串由系统在xml文件中匹配自动进行跳转在JSF中也可以通过在JSP页面的CommandButton的action 属性中直接填写跳转的别名直接跳转而不必经过事件处理方法的处理
资源文件的管理Struts和JSF对于资源文件的管理比较类似Struts中在strutsconfigxml中对资源文件进行配置实现整个程 序的统一管理而对于JSF则可以在每个JSP页面中分别定义资源文件然后通过资源文件的别名来访问资源文件中的内容两者的格式也不相同在 Struts中格式为 gradegradegrade = your information通过来表示级别而在JSF中则必须通过下划线来表示级别例如grade_grade_grade= your information本人认为还是struts的方案更直观一些另外在Struts的资源文件中可以定义信息的显示格式例如 errorheadererrorfooter而JSF中如何定义还不太清楚或者可以通过定义Messages标记的属性来定义