国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

表現層框架之爭 JSF與Struts框架的異同

2024-07-21 02:14:28
字體:
來源:轉載
供稿:網友

struts和jsf/tapestry都屬于表現層框架,這兩種分屬不同性質的框架,后者是一種事件驅動型的組件模型,而struts只是單純的mvc模式框架,我們下面進行詳細分析比較。

首先事件是指從客戶端頁面(瀏覽器)由用戶操作觸發的事件,struts使用action來接受瀏覽器表單提交的事件,這里使用了command模式,每個繼承action的子類都必須實現一個方法execute。

在struts中,實際是一個表單form對應一個action類(或dispatchaction),換一句話說:在struts中實際是一個表單只能對應一個事件,struts這種事件方式稱為application event,application event和component event相比是一種粗粒度的事件。

struts重要的表單對象actionform是一種對象,它代表了一種應用,這個對象中至少包含幾個字段,這些字段是jsp頁面表單中的input字段,因為一個表單對應一個事件,所以,當我們需要將事件粒度細化到表單中這些字段時,也就是說,一個字段對應一個事件時,單純使用struts就不太可能,當然通過結合javascript也是可以轉彎實現的。

而這種情況使用jsf就可以方便實現,

<h:inputtext id="userid" value="#{login.userid}">  <f:valuechangelistener type="logindemo.userloginchanged" /></h:inputtext>

#{login.userid}表示從名為login的javabean的getuserid獲得的結果,這個功能使用struts也可以實現,name="login" property="userid"

關鍵是第二行,這里表示如果userid的值改變并且確定提交后,將觸發調用類userloginchanged的processvaluechanged(...)方法。

jsf可以為組件提供兩種事件:value changed和 action. 前者我們已經在上節見識過用處,后者就相當于struts中表單提交action機制,它的jsf寫法如下:

<h:commandbutton id="login" commandname="login">  <f:actionlistener type=”logindemo.loginactionlistener” /></h:commandbutton>

從代碼可以看出,這兩種事件是通過listerner這樣觀察者模式貼在具體組件字段上的,而struts此類事件是原始的一種表單提交submit觸發機制。如果說前者比較語言化(編程語言習慣做法類似swing編程);后者是屬于web化,因為它是來自html表單,如果你起步是從perl/php開始,反而容易接受struts這種風格。

基本配置

struts和jsf都是一種框架,jsf必須需要兩種包jsf核心包、jstl包(標簽庫),此外,jsf還將使用到apache項目的一些commons包,這些apache包只要部署在你的服務器中既可。

jsf包下載地址:http://java.sun.com/j2ee/javaserverfaces/download.html選擇其中reference implementation。

jstl包下載在http://jakarta.apache.org/site/downloads/downloads_taglibs-standard.cgi

所以,從jsf的驅動包組成看,其開源基因也占據很大的比重,jsf是一個sun伙伴們工業標準和開源之間的一個混血兒。

上述兩個地址下載的jar合并在一起就是jsf所需要的全部驅動包了。與struts的驅動包一樣,這些驅動包必須位于web項目的web-inf/lib,和struts一樣的是也必須在web.xml中有如下配置:

<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>    <servlet-name>faces servlet</servlet-name>    <url-pattern>*.faces</url-pattern>  </servlet-mapping> </web-app>

這里和struts的web.xml配置何其相似,簡直一模一樣。

正如struts的struts-config.xml一樣,jsf也有類似的faces-config.xml配置文件:

<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>     <managed-bean-name>user</managed-bean-name>    <managed-bean-class>com.corejsf.userbean</managed-bean-class>     <managed-bean-scope>session</managed-bean-scope>   </managed-bean></faces-config>

在struts-config.xml中有actionform action以及jsp之間的流程關系,在faces-config.xml中,也有這樣的流程,我們具體解釋一下navigation:

在index.jsp中有一個事件:

<h:commandbutton label="login" action="login" />

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返回是假,那么這一行標簽就不用顯示,多干凈利索!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 二连浩特市| 嫩江县| 鹤庆县| 应城市| 灵台县| 德昌县| 重庆市| 都安| 商都县| 连平县| 江口县| 大安市| 马关县| 神木县| 阿拉善右旗| 昌乐县| 垫江县| 若羌县| 海原县| 南溪县| 沙雅县| 建始县| 尤溪县| 华阴市| 斗六市| 讷河市| 东阳市| 桦川县| 甘洛县| 临桂县| 土默特左旗| 华池县| 磴口县| 洪洞县| 财经| 阿拉善盟| 玉山县| 土默特右旗| 凯里市| 崇明县| 溆浦县|