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

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

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

    posts - 189,comments - 115,trackbacks - 0

    利用MyEclipse JSF開發(fā)實戰(zhàn)(一)

    JSF開發(fā)實戰(zhàn)(一)


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

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

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

    ????請自行下載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實現(xiàn),我們采用的是sun的jsf?ri
    JSF?config?path是配置文件的位置,保持不變
    URL?pattern是jsf?servlet的映射方式,有兩種選擇,具體細(xì)節(jié)后面說明。
    以上操作上是為項目加入了jsf需要的jar和tld文件,并且創(chuàng)建了一個faces-config.xml的配置文件。涉及到的jar有:commons-beanutils.jar????commons-collections.jar????????commons-digester.jar????commons-logging.jar????jsf-api.jar????????jsf-impl.jar
    涉及到了jsf中所有的tld文件。

    當(dāng)前的faces-config.xml文件的內(nèi)容是:
    <?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>

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

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

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

    在model層中你可以隨意的實現(xiàn)業(yè)務(wù)的數(shù)據(jù)邏輯,不需要與web層有任何的關(guān)系。

    下面開發(fā)控制層,它負(fù)責(zé)存取web層的數(shù)據(jù),并且調(diào)用model層的邏輯:
    /**
    ?*?jsf的控制層方法
    ?*?@author?bromon
    ?*/
    package?org.bromon.jsf.control.hello;

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

    public?class?HelloDelegater?{
    ????
    ????//------屬性---------
    ????private?String?name;//表單中的文本框數(shù)據(jù)會傳到這里
    ????private?String?result;//web頁會從這里取得運行結(jié)果
    ????private?SayHello?sayHello;//model層的對象,并不事例化,由系統(tǒng)注入
    ????
    ????//-----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方法的名字必須嚴(yán)格按照java?bean規(guī)范編寫,因為它們要被注入依賴時使用。sayHello對象并沒有被實例化,它會在運行時由系統(tǒng)注入。

    這兩個bean當(dāng)然要在系統(tǒng)中申明,否則無法實現(xiàn)DI。在faces-config.xml文件中添加內(nèi)容:
    <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:
    需要引入兩個標(biāo)簽庫:

    <%@?taglib?uri="http://java.sun.com/jsf/html"?prefix="h"?%>
    <%@?taglib?uri="http://java.sun.com/jsf/core"?prefix="f"?%>
    下面是構(gòu)造jsf標(biāo)簽:

    <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類的兩個屬性上,具體的綁定工作有系統(tǒng)通過翻轉(zhuǎn)控制的方式調(diào)用對應(yīng)的set/get方式實現(xiàn)。提交按鈕被綁定到了HelloDelegater.say方法,該方法會把計算結(jié)果賦給result屬性,它會在頁面中顯示出來。

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

    程序執(zhí)行結(jié)果如下:


    ?
    bromon原創(chuàng)

    posted on 2005-10-15 11:16 風(fēng) 閱讀(2246) 評論(4) ?編輯?收藏收藏至365Key 所屬分類: JSF

    評論

    # ?re: 利用MyEclipse JSF開發(fā)實戰(zhàn)(一) 2005-12-15 19:49 冉翔:)

    按照你的方法,怎么最后是500內(nèi)部錯誤?

    服務(wù)器控制臺是:
    java.lang.NullPointerException

    頁面顯示:
    org.apache.jasper.JasperException



    比較郁悶:(

    是用的JBOSS,不過是JBOSS4.0.3,自帶的tomcat5.5,是不是這里的問題啊?

    如果是,應(yīng)該怎么修正,文檔在哪里-

    posted on 2006-03-20 11:01 MEYE 閱讀(729) 評論(0)  編輯  收藏 所屬分類: JAVA
    主站蜘蛛池模板: 国产一卡二卡3卡四卡免费| 日韩毛片在线免费观看| 亚洲综合无码一区二区三区| 国产精品亚洲A∨天堂不卡| 国产亚洲精品精品国产亚洲综合| 老湿机一区午夜精品免费福利| 亚洲国产成人久久综合一区77| 野花香高清在线观看视频播放免费 | 一级黄色片免费观看| 久久青草亚洲AV无码麻豆| 欧美大尺寸SUV免费| 岛国精品一区免费视频在线观看| 亚洲精品在线不卡| 亚洲精品网站在线观看你懂的| 免费一级大黄特色大片| 91在线手机精品免费观看| 老司机午夜精品视频在线观看免费 | 国产精品免费久久| 亚洲美国产亚洲AV| 亚洲AV成人片无码网站| 亚洲国产高清国产拍精品| 国产精品亚洲专区无码牛牛| 免费人成动漫在线播放r18| 国产精品免费看久久久香蕉| 免费无码黄网站在线看| 91香蕉国产线在线观看免费| 国产成人yy免费视频| 久久国产精品免费网站| 亚洲精品偷拍视频免费观看| 日本卡1卡2卡三卡免费| 18成禁人视频免费网站| 卡一卡二卡三在线入口免费| 国产四虎免费精品视频| 免费看美女让人桶尿口| 亚洲男人av香蕉爽爽爽爽| 国精无码欧精品亚洲一区| 久久久婷婷五月亚洲97号色 | 天黑黑影院在线观看视频高清免费 | 亚洲AV无码成人精品区大在线| 2022年亚洲午夜一区二区福利| 无码不卡亚洲成?人片|