<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆 - 24  文章 - 6  trackbacks - 0
    <2005年12月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    常用鏈接

    隨筆分類(23)

    積分與排名

    • 積分 - 13765
    • 排名 - 2082

    最新評論

    JSF開發實戰(一)

    bromon原創 請尊重版權

        JSF將是J2EE5.0中所 包含的web開發框架,這應該是第一個成為jcp標準,并且隨j2eesdk一起發布的web框架,可以看出sun對它的期望很高。JSF最大的競爭對手 是tapestry,是apache的產品,但是apache又弄出了個myfaces,是對jsf標準的一個實現。也許你也和我一樣,在jsf和 tapestry之間猶豫很久,將來從apache的態度上應該可以看出二者的走向。在tss上有一篇比較jsf 1.0與tapestry 3.0的文 章,內容很扎實到位:http://www.theserverside.com/articles/article.tss?l=JSFTapestry
    JSF的競爭對手不是struts/webwork之流,它們基本上已經是不同階段上的東西了,放在一起比較意義不大。

        JSF 的開發流程和asp.net中所倡導的code behind方式很相似,核心是事件驅動,組件和標簽的封裝程度非常高,很多典型應用已經不需要開發者去 處理http。頁面操作會被自動映射到對應的java bean中,后臺邏輯只需要同java bean發生交互。整個過程是通過“依賴注入(DI)”來 實現的,看來這是目前解偶合的最佳途徑啊,spring的影響真是深遠。不過正式因為jsf采用了這樣的方式,導致開發工作和以前的jsp/struts 等都有非常大的不同,需要一定的時間去學習。學習之前建議先對依賴注入有比較清楚的認識,可以參考我的learn Spring in spring系列 的第一篇。

        本系列將以兩個例子來講解jsf的基本開發,第一個例子當然是hello world。目前可用的jsf ide不 多,ibm要到06年才能放出支持jsf的wtp版本。所以我們的例子基本以手寫為主,這樣也能讓我們有更清楚的認識,同時推薦目前最好的jsf開發工 具:myeclipse 4.0 GA。后面的例子將會有jsf和hibernate的內容,它都能給予很好的支持。由于myeclipse并不免費,所 以我們除了講解在ide中如何操作外,還會敘述手動操作的具體內容,以免過于依賴開發工具。用什么服務器都可以,這里采用了jboss 4.0.2。如果 你的服務器是高版本的tomcat(5.5+),那么必須要刪除它自帶的一些包才能很好的支持jsf,具體細節請查看它的文檔。

        請自行下載jsf ri和JSTL 1.1。

    廢話少說,開始了。

        在myeclipse 4.0GA中新建一個web項目,命名為hello,為項目增加對JSTL的支持:


     
    在JSTL的版本中選擇1.1。
    該操作實際上是把jstl.jar和standard.jar加到工程中。

    采用類似的操作為項目添加對jsf的支持:myeclipse?add jsf capabilities
    如圖:
     


    其中的jsf implementation是選擇使用哪中JSF實現,我們采用的是sun的jsf ri
    JSF config path是配置文件的位置,保持不變
    URL pattern是jsf servlet的映射方式,有兩種選擇,具體細節后面說明。
    以 上操作上是為項目加入了jsf需要的jar和tld文件,并且創建了一個faces-config.xml的配置文件。涉及到的jar有:commons -beanutils.jar    commons-collections.jar        commons-digester.jar    commons-logging.jar    jsf-api.jar        jsf-impl.jar
    涉及到了jsf中所有的tld文件。

    當前的faces-config.xml文件的內容是:
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE faces-config PUBLIC "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.1//EN" "http://java.sun.com/dtd/web-facesconfig_1_1.dtd">

    <faces-config>

    </faces-config>

    環境已經建立好了,現在我們要建立一個程序,它的功能是讓用戶在表單中輸入名字,提交后系統會返回一個問候。使用jsf的以后好處是,開發人員會很自然的把mvc各層分開,不會像使用strtus那樣別扭,這一點在后面的開發中感覺得到。

    首先開發model層,它是個很簡單的bean:
    package org.bromon.jsf.model.hello;

    public class SayHello {
        public String say(String name)
        {
            return "你好,"+name;
        }
    }

    在model層中你可以隨意的實現業務的數據邏輯,不需要與web層有任何的關系。

    下面開發控制層,它負責存取web層的數據,并且調用model層的邏輯:
    /**
     * jsf的控制層方法
     * @author bromon
     */
    package org.bromon.jsf.control.hello;

    import org.bromon.jsf.model.hello.*;

    public class HelloDelegater {
        
        //------屬性---------
        private String name;//表單中的文本框數據會傳到這里
        private String result;//web頁會從這里取得運行結果
        private SayHello sayHello;//model層的對象,并不事例化,由系統注入
        
        //-----set/get--------
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public SayHello getSayHello() {
            return sayHello;
        }
        public void setSayHello(SayHello sayHello) {
            this.sayHello = sayHello;
        }
        public String getResult() {
            return result;
        }
        public void setResult(String result) {
            this.result = result;
        }
        
        //-----邏輯方法---------
        public String say()
        {
            this.setResult(sayHello.say(this.getName()));
            return "ok";
        }
    }

    需要注意的是,屬性的名字、set/get方法的名字必須嚴格按照java bean規范編寫,因為它們要被注入依賴時使用。sayHello對象并沒有被實例化,它會在運行時由系統注入。

    這兩個bean當然要在系統中申明,否則無法實現DI。在faces-config.xml文件中添加內容:
    <managed-bean>
            <managed-bean-name>SayHello</managed-bean-name>
            <managed-bean-class>
                org.bromon.jsf.model.hello.SayHello
            </managed-bean-class>
            <managed-bean-scope>request</managed-bean-scope>
        </managed-bean>
        <managed-bean>
            <managed-bean-name>HelloDelegater</managed-bean-name>
            <managed-bean-class>
                org.bromon.jsf.control.hello.HelloDelegater
            </managed-bean-class>
            <managed-bean-scope>request</managed-bean-scope>
            <managed-property>
                <property-name>sayHello</property-name>
                <value>#{SayHello}</value>
            </managed-property>
        </managed-bean>

        在后一個bean中,它的sayHello屬性被指定要在運行時注入一個org.bromon.jsf.model.hello.SayHello的實例。

    下面要編寫表示層的頁面,只有一個index.jsp:
    需要引入兩個標簽庫:

    <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
    <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
    下面是構造jsf標簽:

    <body>
        <f:view>
            <h:form>
                <h:panelGrid columns="3">
                     <h:outputLabel for="name" value="姓名: "/>
                    <h:inputText id="name" value="#{HelloDelegater.name}" required="true"/>
                    <h:message for="name"/>
                    
                    <h:outputLabel value="#{HelloDelegater.result}"/>
                </h:panelGrid>
                <h:panelGroup>
                     <h:commandButton action="#{HelloDelegater.say}"  value="提交"/>
                </h:panelGroup>
            </h:form>
        </f:view>
      </body>

    頁 面中包含了一個文本框和一個label,他們分別被綁定到了HelloDelegater類的兩個屬性上,具體的綁定工作有系統通過翻轉控制的方式調用對 應的set/get方式實現。提交按鈕被綁定到了HelloDelegater.say方法,該方法會把計算結果賦給result屬性,它會在頁面中顯示 出來。

    因為我們在url pattern中選擇了*.faces,所以我們應該訪問如下地址來查看程序:
    http://localhost:8080/hello/index.faces
    相應的,如果你選擇了/faces/*,那么就應該是:
    http://localhost:8080/hello/faces/index.jsp

    程序執行結果如下:

    posted on 2005-12-16 13:01 Sometimes Java 閱讀(441) 評論(0)  編輯  收藏 所屬分類: Tech Flow
    主站蜘蛛池模板: 国产精品亚洲lv粉色| 亚洲最大福利视频网站| 日本免费网站视频www区| 久久精品国产亚洲精品2020| 亚洲精品高清在线| 在线播放高清国语自产拍免费| 午夜不卡久久精品无码免费| 亚洲an日韩专区在线| 国产成人免费手机在线观看视频| 在线观看免费中文视频| 亚洲人成色777777老人头| 亚洲最新永久在线观看| 亚洲精品V欧洲精品V日韩精品| 亚洲精品456播放| 日本二区免费一片黄2019| 无人在线观看免费高清视频| 免费福利资源站在线视频| 亚洲精品无码日韩国产不卡av| 91亚洲自偷在线观看国产馆| 亚洲AV本道一区二区三区四区| 中文字幕精品亚洲无线码一区| 亚洲国产精品第一区二区三区| 四虎影视精品永久免费| 久久爰www免费人成| 久久www免费人成精品香蕉| 亚洲ⅴ国产v天堂a无码二区| 亚洲精品乱码久久久久久蜜桃不卡 | 水蜜桃视频在线观看免费| 亚洲经典千人经典日产| 亚洲国产精品精华液| 亚洲欧洲无码AV不卡在线| 亚洲欧美国产日韩av野草社区| 亚洲精品无码不卡在线播放| 亚洲午夜无码毛片av久久京东热| 亚洲国产AV无码专区亚洲AV| 麻豆精品国产免费观看| 成人看的午夜免费毛片| 日韩精品视频免费在线观看| 国产精品久久香蕉免费播放| 亚洲精品无码成人片在线观看| 久久久久亚洲精品无码网址|