隨筆-199  評論-203  文章-11  trackbacks-0
            Struts和JSF/Tapestry都屬于表現層框架,這兩種分屬不同性質的框架,后者是一種事件驅動型的組件模型,而Struts只是單純的MVC模式框架,老外總是急吼吼說事件驅動型就比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返回是假,那么這一行標簽就不用顯示,多干凈利索!

            先寫到這里,我會繼續對JSF深入比較下去,如果研究過Jdon框架的人,可能會發現,Jdon框架的jdonframework.xml中service配置和managed-bean一樣都使用了依賴注射,看來對Javabean的依賴注射已經迅速地成為一種新技術象征,如果你還不了解Ioc模式,趕緊補課。

          附Jsf核心教程一個JSF案例:login.rar

          http://www.jdon.com/idea/jsf-struts.htm
          posted on 2009-04-28 07:59 Werther 閱讀(2444) 評論(6)  編輯  收藏 所屬分類: 20.Struts

          評論:
          # re: JSF與Struts的比較 2009-04-28 09:19 | advincenting
          好像哪里看到過 拷貝的吧 呵呵  回復  更多評論
            
          # re: JSF與Struts的比較 2009-04-28 10:25 | dede
          你用strtus什么版本。大哥,有點落后哦  回復  更多評論
            
          # re: JSF與Struts的比較 2009-04-28 12:41 | UP
          好像很struts版本確實落后哈!現在我用的struts2!  回復  更多評論
            
          # re: JSF與Struts的比較 2009-04-28 13:05 | dgdg
          建議你看看s2吧,1早過時了!  回復  更多評論
            
          # re: JSF與Struts的比較 2009-04-29 08:54 | hongyong
          其實JSF和Struts或者Struts2各有優勢了。JSF就像asp.net,基于事件驅動,雙擊一下前端控件就會直接到后端產生一個對應事件的方法。個人感覺這種方式進行大型企業運用開發比較不好。感覺使用struts/strut2來的更直觀一些,層次感更強。如果是小型應用開發,我覺得也還不錯。不需要什么配置(框架已隱藏配置好了)就可以開發了。入門的門檻相對低一點。就像進行Java Swing/swt開發一樣。我覺得各有優劣了。如果有絕對的好的話,微軟也不會再現在基于時間驅動的asp.net的基礎上,還發布了一個和struts2模式差不多的一個MVC框架。SUN也不會再已有很流行的struts/struts2后,還發布一個JSF出來。可能是都看到對方的閃光點吧。當然也有可能考慮到不同人的開發習慣。  回復  更多評論
            
          # re: JSF與Struts的比較 2009-04-29 13:37 | dede
          各有千秋,不過個人偏向于struts2,根據項目來定吧,畢竟好多公司用struts,組隊成本也會低點。要是jsf能封裝一些特色的組件,驗證機制,listener就爽了,免了js和ajax。這樣真的就干凈利落了。hoho  回復  更多評論
            

          I'm reading...

          Java 60

          Head  First SQL

          寶貝連接


          If you need these books,pls send me emails.
          Email:kunpeng.niu@163.com
          <2009年4月>
          2930311234
          567891011
          12131415161718
          19202122232425
          262728293012
          3456789

          留言簿(10)

          隨筆分類(178)

          隨筆檔案(208)

          文章檔案(1)

          新聞檔案(6)

          相冊

          1.Java Official Website

          2.Java Study Website

          3.Java Technic Website

          4.Java Video Website

          5.Database Website

          6.Bookshop Website

          7.English Website

          8.Friends Link

          9.Other Web

          積分與排名

          • 積分 - 686094
          • 排名 - 67

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 修水县| 南昌县| 河池市| 利辛县| 攀枝花市| 岑巩县| 浦城县| 泸西县| 高邑县| 黄梅县| 安塞县| 平阳县| 荆门市| 雅安市| 乌拉特后旗| 华阴市| 连山| 龙江县| 肥乡县| 渑池县| 金溪县| 九台市| 满洲里市| 桂阳县| 苍梧县| 宁明县| 浦北县| 肇东市| 太谷县| 武安市| 石棉县| 嘉善县| 县级市| 新竹县| 莲花县| 常德市| 靖州| 沛县| 清丰县| 衡山县| 高台县|