技术开发 频道

JSF与Struts的比较

在Struts-config.xml中有ActionForm Action以及Jsp之间的流程关系,在faces-config.xml中,也有这样的流程,我们具体解释一下Navigation:

  在index.jsp中有一个事件:


  action的值必须匹配form-outcome值,上述Navigation配置表示:如果在index.jsp中有一个login事件,那么事件触发后下一个页面将是welcome.jsp

  JSF有一个独立的事件发生和页面导航的流程安排,这个思路比struts要非常清晰。

  managed-bean类似Struts的ActionForm,正如可以在struts-config.xml中定义ActionForm的scope一样,这里也定义了managed-bean的scope为session。

  但是如果你只以为JSF的managed-bean就这点功能就错了,JSF融入了新的Ioc模式/依赖性注射等技术。

Ioc模式

  对于Userbean这样一个managed-bean,其代码如下:
public class UserBean {   private String name;   private String password;   // PROPERTY: name   public String getName() { return name; }   public void setName(String newValue) { name = newValue; }   // PROPERTY: password   public String getPassword() { return password; }   public void setPassword(String newValue) { password = newValue; } } <managed-bean>   <managed-bean-name>user</managed-bean-name>   <managed-bean-class>com.corejsf.UserBean</managed-bean-class>   <managed-bean-scope>session</managed-bean-scope>   <managed-property>     <property-name>name</property-name>     <value>me</value>   </managed-property>   <managed-property>     <property-name>password</property-name>     <value>secret</value>   </managed-property> </managed-bean>

  faces-config.xml这段配置其实是将"me"赋值给name,将secret赋值给password,这是采取Ioc模式中的Setter注射方式。

Backing Beans

  对于一个web form,我们可以使用一个bean包含其涉及的所有组件,这个bean就称为Backing Bean, Backing Bean的优点是:一个单个类可以封装相关一系列功能的数据和逻辑。

  说白了,就是一个Javabean里包含其他Javabean,互相调用,属于Facade模式或Adapter模式。


  对于一个Backing Beans来说,其中包含了几个managed-bean,managed-bean一定是有scope的,那么这其中的几个managed-beans如何配置它们的scope呢?
<managed-bean>   ...   <managed-property>     <property-name>visit</property-name>     <value>#{sessionScope.visit}</value>   </managed-property>

  这里配置了一个Backing Beans中有一个setVisit方法,将这个visit赋值为session中的visit,这样以后在程序中我们只管访问visit对象,从中获取我们希望的数据(如用户登陆注册信息),而visit是保存在session还是application或request只需要配置既可。

UI界面

  JSF和Struts一样,除了JavaBeans类之外,还有页面表现元素,都是是使用标签完成的,Struts也提供了struts-faces.tld标签库向JSF过渡。

  使用Struts标签库编程复杂页面时,一个最大问题是会大量使用logic标签,这个logic如同if语句,一旦写起来,搞的JSP页面象俄罗斯方块一样,但是使用JSF标签就简洁优美:
<jia:navigatorItem name="inbox" label="InBox"   icon="/images/inbox.gif"   action="inbox"   disabled="#{!authenticationBean.inboxAuthorized}"/>

如果authenticationBean中inboxAuthorized返回是假,那么这一行标签就不用显示,多干净利索!

原文地址

0
相关文章