刚到公司上班第三天,头儿让我总结一下JSF和Struts的区别。自己在网上搜了一些资料和自己的一些经验写了下面的表格。自己也留一份吧。
| Struts | Jsf |
相 同 点 | 都是表示层的框架。MVC模式使系统的层次更加的清楚。都采用了bean来作为和jsp页面对应的model层。该model层保存了jsp页面上的数据,同时可以作一些验证工作。都采用xml配置文件来处理bean的配置,页面导航等问题,增加了系统的灵活性。 | |
不
同
点
不
同
点
不
同
点 | Struts 是一个成熟的、被证实了的框架。它已经使用了几年,且被成功部署到许多项目中。 | JSF 仍是相当新的并处于发展过程中。要看到成功的部署和广泛的应用还需要一段时间。另外,组件供应商可能并不能做您想让他们完成的所有事情。 |
Struts是一个开源产品 | JSF 是一个来自 Sun 的规范,将会被包括在 J2EE 规范的未来版本之中。各主要供应商都保证对 JSF 提供强力支持。做得比较好的常用的像riceface,myface等。 | |
Struts使用Action来接受浏览器表单提交的事件,每个继承Action的子类都必须实现一个方法execute。一个表单Form对应一个Action类,在Struts中实际是一个表单只能对应一个事件,相比于JSF是一种粗粒度的事件。 | jsf为事件驱动的框架。在一个form内 一个按钮,一个链接,或者一个下拉列表都可以去驱动一个事件。<h:commandLink action="#{user.addUser}"> <x:commandButton action="#{user.addUser}" value="查 询"/> | |
每个要跳转的页面都有一个别名,在程序中通过别名进行跳转。另外Struts中的跳转是在ActionBean中发生,execute方法最后返回一个actionForward来进行跳转。 | 在事件处理方法中最后返回一个字符串,由系统在xml文件中匹配自动进行跳转。在JSF中也可以通过在JSP页面的CommandButton的action属性中直接填写跳转的别名直接跳转,而不必经过事件处理方法的处理。 | |
页面所关联的数据和页面所做的action分开 | 通常把和jsp对应的model层和jsp所提交的action放在同一个backing bean中,即业务逻辑和业务逻辑所处理的数据在同一个bean中。
| |
| jsf是显示层基于组件 像一些日历,或者数据表格,分页等通过一个组件就可以轻松的实现。许多开源的组件可以轻松的拿来就用。但是JSF自定义组件很麻烦 | |
| JSF的一些缺点像数据表格的样式由于受组件的控制比较难调整。还有如页面上的组件ID为form的名称+“:”+组件的id。性能上也有JSF也有他的一些局限性。如用到分页的BEAN都必须放到session范围内的。 | |
| 和AJAX的结合。Ajax4jsf是riceface的一个组件。Ajax4jsf能够实现整个页面范围的AJAX支持。能让JSF和AJAX无缝的结合。例子<%@ taglib uri="https://ajax4jsf.dev.java.net/ajax" prefix="a4j"%> <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%> <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%> <html> <head> <title>repeater </title> </head> <body> <f:view> <h:form> <h:inputText size="50" value="#{bean.text}" > <a4j:support event="onchange" reRender="rep"/> </h:inputText> <h:outputText value="#{bean.text}" id="rep"/> </h:form> </f:view> </body> </html> | |
| 在index.jsp中有一个事件:<h:commandButton label="Login" action="login" /> action的值必须匹配form-outcome值,上述Navigation配置表示:如果在index.jsp中有一个login事件,那么事件触发后下一个页面将是welcome.jspJSF有一个独立的事件发生和页面导航的流程安排,这个思路比struts要非常清晰。 | |
| managed-bean类似Struts的ActionForm,正如可以在struts-config.xml中定义ActionForm的scope一样,这里也定义了managed-bean的scope为session。但是如果你只以为JSF的managed-bean就这点功能就错了,JSF融入了新的Ioc模式/依赖性注射等技术。<managed-bean> |