posts - 189,comments - 115,trackbacks - 0

          利用MyEclipse JSF開發實戰(一)

          JSF開發實戰(一)


          ????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

          程序執行結果如下:


          ?
          bromon原創

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

          評論

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

          按照你的方法,怎么最后是500內部錯誤?

          服務器控制臺是:
          java.lang.NullPointerException

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



          比較郁悶:(

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

          如果是,應該怎么修正,文檔在哪里-

          posted on 2006-03-20 11:01 MEYE 閱讀(729) 評論(0)  編輯  收藏 所屬分類: JAVA
          主站蜘蛛池模板: 博乐市| 常州市| 南靖县| 阳信县| 长春市| 宣恩县| 华蓥市| 荃湾区| 股票| 大洼县| 永年县| 琼结县| 甘德县| 修文县| 霸州市| 出国| 昌平区| 凤翔县| 星子县| 夹江县| 右玉县| 洛阳市| 留坝县| 大庆市| 潞西市| 龙井市| 汝城县| 馆陶县| 大丰市| 崇阳县| 察雅县| 乐都县| 财经| 沽源县| 明星| 新巴尔虎右旗| 汾西县| 固安县| 白河县| 钟山县| 若尔盖县|