Q题讎ͼ与友天提及JSF的概念,转蝲一文章供日后参?/p>
Struts和JSF/Tapestry都属于表现层框架Q这两种分属不同性质的框Ӟ后者是一U事仉动型的组件模型,而Struts只是单纯的MVC模式框架Q老外L急吼D事g驱动型就比MVC模式框架好,何以见得Q我们下面进行详l分析比较一下到底是怎么回事Q?/p>
首先事g是指从客L面Q浏览器Q由用户操作触发的事ӞStruts使用Action来接受浏览器表单提交的事Ӟq里使用了Command模式Q每个承Action的子c都必须实现一个方法execute?/p>
在struts中,实际是一个表单Form对应一个Actionc?或DispatchAction)Q换一句话_在Struts中实际是一个表单只能对应一个事Ӟstrutsq种事g方式UCؓapplication eventQapplication event和component event相比是一U粗_度的事件?/p>
struts重要的表单对象ActionForm是一U对象,它代表了一U应用,q个对象中至包含几个字D,q些字段是Jsp面表单中的input字段Q因Z个表单对应一个事Ӟ所以,当我们需要将事g_度l化到表单中q些字段Ӟ也就是说Q一个字D对应一个事件时Q单U用Struts׃太可能,当然通过l合JavaScript也是可以转弯实现的?/p>
而这U情况用JSF可以方便实玎ͼ
<h:inputText id="userId" value="#{login.userId}"> <f:valueChangeListener type="logindemo.UserLoginChanged" /> </h:inputText> |
#{login.userId}表示从名为login的JavaBean的getUserId获得的结果,q个功能使用struts也可以实玎ͼname="login" property="userId"
关键是第二行Q这里表C如果userId的值改变ƈ且确定提交后Q将触发调用cUserLoginChanged的processValueChanged(...)Ҏ?/p>
JSF可以为组件提供两U事ӞValue Changed?Action. 前者我们已l在上节见识q用处,后者就相当于struts中表单提交Action机制Q它的JSF写法如下Q?/p>
<h:commandButton id="login" commandName="login"> <f:actionListener type=”logindemo.LoginActionListener?/> </h:commandButton> |
从代码可以看出,q两U事件是通过Listernerq样观察者模式脓在具体组件字D上的,而Struts此类事g是原始的一U表单提交Submit触发机制。如果说前者比较语a化(~程语言习惯做法cMSwing~程Q;后者是属于WEB化,因ؓ它是来自Html表单Q如果你h是从Perl/PHP开始,反而容易接受Strutsq种风格?/p>
基本配置
Struts和JSF都是一U框ӞJSF必须需要两U包JSF核心包、JSTL包(标签库)Q此外,JSFq将使用到Apache目的一些commons包,q些Apache包只要部|在你的服务器中既可?/p>
JSF包下载地址Q?a target="_blank">http://java.sun.com/j2ee/javaserverfaces/download.html选择其中Reference Implementation?/b>
JSTL包下载在http://jakarta.apache.org/site/downloads/downloads_taglibs-standard.cgi
所以,从JSF的驱动包l成看,其开源基因也占据很大的比重,JSF是一个SUN伙伴们工业标准和开源之间的一个血ѝ?/p>
上述两个地址下蝲的jar合ƈ在一起就是JSF所需要的全部驱动包了。与Struts的驱动包一Pq些驱动包必M于Web目的WEB-INF/libQ和Struts一L是也必须在web.xml中有如下配置Q?/p>
<web-app> <servlet> <servlet-name>Faces Servlet</servlet-name> <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> |
q里和Struts的web.xml配置何其怼Q简直一模一栗?/p>
正如Struts的struts-config.xml一PJSF也有cM的faces-config.xml配置文gQ?/p>
<faces-config> <navigation-rule> <from-view-id>/index.jsp</from-view-id> <navigation-case> <from-outcome>login</from-outcome> <to-view-id>/welcome.jsp</to-view-id> </navigation-case> </navigation-rule> <managed-bean>
|
在Struts-config.xml中有ActionForm Action以及Jsp之间的流E关p,在faces-config.xml中,也有q样的流E,我们具体解释一下NavigationQ?/p>
在index.jsp中有一个事Ӟ
<h:commandButton label="Login" action="login" />
action的值必d配form-outcome|上述Navigation配置表示Q如果在index.jsp中有一个login事gQ那么事件触发后下一个页面将是welcome.jsp
JSF有一个独立的事g发生和页面导航的程安排Q这个思\比struts要非常清晰?/p>
managed-beancMStruts的ActionFormQ正如可以在struts-config.xml中定义ActionForm的scope一Pq里也定义了managed-bean的scope为session?/p>
但是如果你只以ؓJSF的managed-beanp点功能就错了QJSF融入了新的Ioc模式/依赖性注等技术?/p>
Ioc模式
对于Userbeanq样一个managed-beanQ其代码如下Q?/p>
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> |
faces-config.xmlq段配置其实是将"me"赋值给nameQ将secret赋值给passwordQ这是采?a target="_blank">Ioc模式中的Setter注射方式?/p>
Backing Beans
对于一个web formQ我们可以用一个bean包含其涉及的所有组Ӟq个beanq为Backing BeanQ?Backing Bean的优ҎQ一个单个类可以装相关一pd功能的数据和逻辑?/p>
说白了,是一个Javabean里包含其他JavabeanQ互相调用,属于Facade模式或Adapter模式?/p>
对于一个Backing Beans来说Q其中包含了几个managed-beanQmanaged-bean一定是有scope的,那么q其中的几个managed-beans如何配置它们的scope呢?
<managed-bean> ... <managed-property> <property-name>visit</property-name> <value>#{sessionScope.visit}</value> </managed-property> |
q里配置了一个Backing Beans中有一个setVisitҎQ将q个visit赋gؓsession中的visitQ这样以后在E序中我们只访问visit对象Q从中获取我们希望的数据Q如用户登陆注册信息Q,而visit是保存在sessionq是application或request只需要配|既可?/p>
UI界面
JSF和Struts一P除了JavaBeanscM外,q有面表现元素Q都是是使用标签完成的,Struts也提供了struts-faces.tld标签库向JSFq渡?/p>
使用Struts标签库编E复杂页面时Q一个最大问题是会大量用logic标签Q这个logic如同if语句Q一旦写hQ搞的JSP面象俄|斯方块一P但是使用JSF标签qz优:
<jia:navigatorItem name="inbox" label="InBox" |
如果authenticationBean中inboxAuthorizedq回是假Q那么这一行标{ְ不用昄Q多q净利烦Q?/p>
先写到这里,我会l箋对JSF深入比较下去Q如果研I过Jdon框架的hQ可能会发现QJdon框架的jdonframework.xml中service配置和managed-bean一样都使用了依赖注,看来对Javabean的依赖注已l迅速地成ؓ一U新技术象征,如果你还不了解Ioc模式Q赶紧补课?/p>