千里冰封
          JAVA 濃香四溢
          posts - 151,comments - 2801,trackbacks - 0
          Seam是一個(gè)挺不錯(cuò)的框架,但是用netbeans來開發(fā)它,卻有點(diǎn)難度,因?yàn)槟壳皀etbeans沒有seam插件,不像Eclipse有jboss提供的官方插件,但是插件是死的,人是活的,它要能跑起起來,一定有它的配置,下面我們就用netbeans做為IDE來開發(fā)一個(gè)seam的應(yīng)用.

          當(dāng)然,我們還有另外一個(gè)方法,那就是利用seam自帶的seam-gen工具,生成一個(gè)工程的框架,然后可以用netbeans打開,但是有一些不太好的地方,那就是所有的工程內(nèi)容都混到一起去了,WEB的工程和EJB的工程都在同一個(gè)工程下面,并且由于是基于ant的,所以工程的目錄看得可能不太習(xí)慣.但它也有一個(gè)好處,那就是它會(huì)為你生成各種必須的配置文件,而不需要手工的編寫,但是它的壞處就是,如果你后面想要添加EJB或者添加網(wǎng)頁內(nèi)容,就不太方便了,因?yàn)槟夸浀慕M織是怪怪的,不是標(biāo)準(zhǔn)的Netbeans工程組織方式,所以我還是覺得自己建標(biāo)準(zhǔn)的netbeans工程,然后手工添加這些配置文件,并且這些配置文件也不一定需要自己全部手工編寫,完全可以復(fù)制過來,然后在一些細(xì)節(jié)的地方改動(dòng)一下就可以了.并且配置好以后,要添加工程內(nèi)容,就可以完全按照netbeans標(biāo)準(zhǔn)工程的方式來添加了.

          由于自己也是前幾天接觸的seam,所以錯(cuò)誤之處難免,還望大家指出.

          首先我們說一說周邊的東西,那就是要添加哪些配置文件,配置文件大概是什么內(nèi)容,以及各個(gè)工程都需要哪些庫,這些是基礎(chǔ),也是很重要的,否則布署工程的時(shí)候就會(huì)出現(xiàn)一大堆的錯(cuò)誤.
          在正式工作之前,先準(zhǔn)備好要用到的工具,我這里的工具列表如下:
          1,Netbeans6.1,可以到http://www.netbeans.org下載,下載的時(shí)候,選擇下載全部的版本,也就是最大的那個(gè)版本.
          2,Jboss-4.2.2.GA,可以到http://www.jboss.org下載.
          3,Jboss-seam-2.0.1.GA,也可以到http://www.jboss.org下載

          以上具體地址我就不給了,可以自己到首頁上去找,這個(gè)應(yīng)該不難吧.
          至于richfaces就不用準(zhǔn)備了,seam里面都帶了,什么spring,hibernate等等,它里面都有自帶.

          本文的流程如下,先是大概介紹每個(gè)工程的配置文件有哪些,以及它們需要哪些庫文件,然后才真正寫一個(gè)示例程序,所以前面的配置文件內(nèi)容僅供參考,讓我們知道,里面包括了哪些元素,因?yàn)閷?shí)際的工程和它不一定是一樣的.

          準(zhǔn)備工作做好以后,就可以開始了,打開我們熟悉的Netbeans,選擇新建工程,然后選擇新建Web工程,在建WEB工程的時(shí)候, 不要選擇使用任何框架,因?yàn)楝F(xiàn)在還沒有seam的netbeans插件,所以,一切的配置都得靠手寫.建好了WEB工程以后,在WEB-INF文件夾下面添加如下文:pages.xml,components.xml,faces-config.xml,而web.xml是我們本來就有的,但是我們要修改一下里面的內(nèi)容,好讓它可以配合seam框架運(yùn)行.更改好的web.xml內(nèi)容大致如下:
          如果你的WEB容器支持JAVAEE5,則下面的web-app version就可以等于2.5了,如果是支持J2EE1.4的,那么就要把它改成2.4的版本,建議是利用netbeans生成的web.xml基礎(chǔ)上改,也就是只改內(nèi)容,而不改xml的頭部說明,也就是下面的web-app部份,一般不要去改,我們只改動(dòng)里面的元素而已.
          <?xml version="1.0" encoding="UTF-8"?>
          <web-app version="2.5"
              xmlns
          ="http://java.sun.com/xml/ns/javaee"
              xmlns:xsi
          ="http://www.w3.org/2001/XMLSchema-instance"
              xsi:schemaLocation
          ="http://java.sun.com/xml/ns/javaee 

          http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
          >
              
              
          <display-name>Test</display-name>
              
              
          <!-- Seam -->
               
              
          <listener>
                  
          <listener-class>org.jboss.seam.servlet.SeamListener</listener-class>
              
          </listener>
              
              
          <servlet>
                  
          <servlet-name>Seam Resource Servlet</servlet-name>
                  
          <servlet-class>org.jboss.seam.servlet.SeamResourceServlet</servlet-class>
              
          </servlet>
              
              
          <servlet-mapping>
                  
          <servlet-name>Seam Resource Servlet</servlet-name>
                  
          <url-pattern>/seam/resource/*</url-pattern>
              
          </servlet-mapping>
              
              
          <filter>
                  
          <filter-name>Seam Filter</filter-name>
                  
          <filter-class>org.jboss.seam.servlet.SeamFilter</filter-class>
              
          </filter>

              
          <filter-mapping>
                  
          <filter-name>Seam Filter</filter-name>
                  
          <url-pattern>/*</url-pattern>
              
          </filter-mapping>
              
              
          <!-- 這里用了facelets的技術(shù),我們的例子里面沒有用到 -->
              
              
          <context-param>
                  
          <param-name>javax.faces.DEFAULT_SUFFIX</param-name>
                  
          <param-value>.xhtml</param-value>
              
          </context-param>

              
          <context-param>
                  
          <param-name>
                      javax.faces.STATE_SAVING_METHOD
                  
          </param-name>
                  
          <param-value>server</param-value>
              
          </context-param>

              
          <context-param>
                  
          <param-name>facelets.DEVELOPMENT</param-name>
                  
          <param-value>true</param-value>
              
          </context-param>
              
              
          <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>*.seam</url-pattern>
              
          </servlet-mapping>

              
          <session-config>
                  
          <session-timeout>10</session-timeout> 
              
          </session-config>    
              
          </web-app>

          在添加其它三個(gè)文件的內(nèi)容之前,先說一下那三個(gè)文件是干什么用的,首先components.xml,這個(gè)文件里面寫的是seam組件的配置,它是必不可少的,一般來說,它可以放在很多地方,但是最好還是放在WEB-INF下面,下面來看看它里面的內(nèi)容:

          <?xml version="1.0" encoding="UTF-8"?>
          <components xmlns="http://jboss.com/products/seam/components"
                      xmlns:core
          ="http://jboss.com/products/seam/core"
                      xmlns:xsi
          ="http://www.w3.org/2001/XMLSchema-instance"
                      xsi:schemaLocation
          =
                        "http://jboss.com/products/seam/core
                         http://jboss.com/products/seam/core-2.0.xsd
                         http://jboss.com/products/seam/components
                         http://jboss.com/products/seam/components-2.0.xsd"
          >
              
          <core:init jndi-pattern="Seam6/#{ejbName}/local" debug="true"/>
              
          <core:manager conversation-timeout="120000"/>
          </components>

          上面的配置幾乎是最簡單的配置,它給出了查找EJB的時(shí)候,JNDI的形式,以及對話(conversation)的超時(shí)時(shí)間.
          然后我們再來看faces-config.xml,它是標(biāo)準(zhǔn)的JSF的說明文件,但是它在SEAM里面并沒有完全起到在JSF里面的作用,在JSF里面,它定義backingbean,并且定義導(dǎo)航規(guī)則,但是在SEAM里面,它總是很小,backingbean不需要在這里定義了,因?yàn)樵赟EAM里面,我們可以把EJB做為backingbean,并且用注釋的方式來指定它的名字以及范圍,另外一個(gè),導(dǎo)航規(guī)則也不用在這里定義了,我們可以用另外一個(gè)專門的文件來定義,那就是pages.xml,所以在SEAM的應(yīng)用里面,雖然用到了JSF的技術(shù),但是JSF的主要配置文件faces-config.xml卻不用怎么配置了,當(dāng)然,你也可以在這里面配置導(dǎo)航規(guī)則,只有當(dāng)我們使用了facelets技術(shù)以后,才確定要在這個(gè)文件里面配置一些東西,否則,這個(gè)文件空在那里也沒什么關(guān)系,facelets是SEAM框架里面推薦使用的技術(shù),當(dāng)然,我們也可以不用,也可以只用JSF,如果我們使用facelets的話,就需要要faces-config.xml里面添加如下的聲明以支持facelets:
          <?xml version='1.0' encoding='UTF-8'?>
          <faces-config version="1.2"
                        xmlns
          ="http://java.sun.com/xml/ns/javaee"
                        xmlns:xsi
          ="http://www.w3.org/2001/XMLSchema-instance"
                        xsi:schemaLocation
          ="http://java.sun.com/xml/ns/javaee 

          http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd"
          >
              
              
          <application>
                  
          <view-handler>com.sun.facelets.FaceletViewHandler</view-handler>
              
          </application>

          </faces-config>

          最后我們再來看pages.xml,它是定義頁面之間的導(dǎo)航規(guī)則的,這個(gè)文件是可有可無的,SEAM啟動(dòng)的時(shí)候,會(huì)找這個(gè)文件,找到了就讀里面的配置,找不到也沒關(guān)系,就當(dāng)什么也沒有發(fā)生.
          它的大概內(nèi)容如下:

          <?xml version="1.0" encoding="UTF-8"?>
          <pages xmlns="http://jboss.com/products/seam/pages"
                 xmlns:xsi
          ="http://www.w3.org/2001/XMLSchema-instance"
                 xsi:schemaLocation
          ="http://jboss.com/products/seam/pages 

          http://jboss.com/products/seam/pages-2.0.xsd"


                 no-conversation-view-id
          ="/main.xhtml"
                           login-view-id
          ="/home.xhtml">

              
          <page view-id="/register.xhtml">
              
                  
          <action if="#{validation.failed}"
                     execute
          ="#{register.invalid}"/>
              
                  
          <navigation>
                      
          <rule if="#{register.registered}">
                          
          <redirect view-id="/home.xhtml"/>
                      
          </rule>
                  
          </navigation>
                  
              
          </page>

              
          <page view-id="/home.xhtml">
              
                  
          <navigation>
                      
          <rule if="#{identity.loggedIn}">
                          
          <redirect view-id="/main.xhtml"/>
                      
          </rule>
                  
          </navigation>
                  
              
          </page>
              
              
          <page view-id="/password.xhtml"
                    login-required
          ="true">
              
                  
          <navigation>
                      
          <rule if="#{changePassword.changed}">
                          
          <redirect view-id="/main.xhtml"/>
                      
          </rule>
                  
          </navigation>
                  
              
          </page>

              
          <page view-id="/main.xhtml" 
                    login-required
          ="true">
              
                  
          <navigation from-action="#{hotelBooking.selectHotel(hot)}">
                      
          <redirect view-id="/hotel.xhtml"/>
                  
          </navigation>
                  
                  
          <navigation from-action="#{bookingList.cancel}">
                      
          <redirect/>
                  
          </navigation>
                  
              
          </page>
              
              
          <page view-id="/hotel.xhtml" 
                    conversation-required
          ="true" 
                    login-required
          ="true">
                    
                  
          <description>View hotel: #{hotel.name}</description>
                  
                  
          <navigation from-action="#{hotelBooking.bookHotel}">
                      
          <redirect view-id="/book.xhtml"/>
                  
          </navigation>
                  
              
          </page>

              
          <page view-id="/book.xhtml" 
                    conversation-required
          ="true" 
                    login-required
          ="true">
                    
                  
          <description>Book hotel: #{hotel.name}</description>
                  
                  
          <navigation from-action="#{hotelBooking.setBookingDetails}">
                      
          <rule if="#{hotelBooking.bookingValid}">
                          
          <redirect view-id="/confirm.xhtml"/>
                      
          </rule>
                  
          </navigation>
                  
              
          </page>

              
          <page view-id="/confirm.xhtml" 
                    conversation-required
          ="true" 
                    login-required
          ="true">
                    
                  
          <description>Confirm booking: #{booking.description}</description>
                  
                  
          <navigation from-action="#{hotelBooking.confirm}">
                      
          <redirect view-id="/main.xhtml"/>
                  
          </navigation>
                  
              
          </page>
              
              
          <page view-id="*">
              
                  
          <navigation from-action="#{identity.logout}">
                      
          <redirect view-id="/home.xhtml"/>
                  
          </navigation>

                  
          <navigation from-action="#{hotelBooking.cancel}">
                      
          <redirect view-id="/main.xhtml"/>
                  
          </navigation>
                  
              
          </page>
              
              
          <exception class="org.jboss.seam.security.NotLoggedInException">
                  
          <redirect view-id="/home.xhtml">
                      
          <message severity="warn">You must be logged in to use this feature</message>
                  
          </redirect>
              
          </exception>

          </pages>

          一般來講,SEAM可以配合richfaces來使用,這樣可以補(bǔ)充標(biāo)準(zhǔn)的JSF組件不足的情況,并且richfaces和seam都是一家產(chǎn)品,所以運(yùn)用起來可能會(huì)方便一些,在做SEAM應(yīng)用的時(shí)候,推薦用richfaces做JSF的組件庫,當(dāng)然,你也可以用別的組件庫,如apache的MyFaces.在配置文件建好模型以后,再為WEB工程添加項(xiàng)目所需要的庫,一般來說,需要添加的庫如下:
          jboss-seam-debug.jar 調(diào)試的時(shí)候用
          jboss-seam-ui.jar    調(diào)用seam的組件,比如<s:validate 等等
          jsf-facelets.jar     JSF的facelets技術(shù)
          richfaces-impl.jar   richfaces的實(shí)現(xiàn)庫
          richfaces-ui.jar     richfaces的UI庫
          richfaces-api.jar    richfaces的API庫
          jboss-el.jar         jboss的EL庫
          當(dāng)然,根據(jù)不同的應(yīng)用,可能所要包含的庫會(huì)有點(diǎn)不同,具體庫的依賴性,可以查看SEAM的官方說明.WEB項(xiàng)目的部份大概就這些,下一章,我們再說一說EJB項(xiàng)目的部份.







          盡管千里冰封
          依然擁有晴空

          你我共同品味JAVA的濃香.
          posted on 2008-05-06 15:53 千里冰封 閱讀(4200) 評(píng)論(5)  編輯  收藏 所屬分類: JAVAEE 、Netbeans

          FeedBack:
          # re: 使用Netbeans開發(fā)Seam應(yīng)用(一)
          2008-05-06 17:01 | 日月雨林
          如果要用RichFaces的話,現(xiàn)在已經(jīng)有NetBeans的插件了,
          http://plugins.netbeans.org/PluginPortal/faces/PluginDetailPage.jsp?pluginid=8934

          如果有興趣可以看看Geertjan's 的博客!里面介紹了如何使用這個(gè)插件!
          http://blogs.sun.com/geertjan/entry/richfaces_for_netbeans_ide_6

          還有ICEfaces,現(xiàn)在官方只有6.0的插件,還沒有6.1的。我想應(yīng)該很快就會(huì)有了,呵呵!
          http://www.icefaces.org/main/downloads/os-downloads.iface  回復(fù)  更多評(píng)論
            
          # re: 使用Netbeans開發(fā)Seam應(yīng)用(一)
          2008-05-06 17:46 | 千里冰封
          @日月雨林
          是的,但是現(xiàn)在還沒有Seam的插件啊,所以配置有點(diǎn)麻煩,并且用Richfaces插件不一定適用于Seam,沒配好可能會(huì)庫沖突  回復(fù)  更多評(píng)論
            
          # re: 使用Netbeans開發(fā)Seam應(yīng)用(一)
          2008-05-06 17:54 | 日月雨林
          還有個(gè)好消息就是現(xiàn)在已經(jīng)有人在開發(fā)seam的NetBeans的插件了
          不過現(xiàn)在還沒有什么動(dòng)靜,郵件列表業(yè)很長時(shí)間沒有更新了
          https://nbseam.dev.java.net/
          還有myfaces
          https://nbmyfaces.dev.java.net/  回復(fù)  更多評(píng)論
            
          # re: 使用Netbeans開發(fā)Seam應(yīng)用(一)
          2008-05-06 18:25 | 日月雨林
          這個(gè)或許可以

          28 November 2007
          Many people ask me, when a version of facelets support will be available for NetBeans 6.0. Here you can donwload it.

          https://nbfaceletssupport.dev.java.net/files/documents/5684/77220/nbfaceletssupport-0-6.zip
            回復(fù)  更多評(píng)論
            
          # re: 使用Netbeans開發(fā)Seam應(yīng)用(一)
          2009-08-06 09:33 | 魚中魚
          怎么會(huì)找不到類呢?org.jboss.seam.servlet.SeamListener
          我有jboss-seam2.1.jar這個(gè)文件啊

          java.lang.NoClassDefFoundError: javassist/util/proxy/MethodHandler
          at org.jboss.seam.contexts.Contexts.destroy(Contexts.java:243)
          at org.jboss.seam.contexts.Lifecycle.endApplication(Lifecycle.java:56)
          at org.jboss.seam.contexts.ServletLifecycle.endApplication(ServletLifecycle.java:135)
          at org.jboss.seam.servlet.SeamListener.contextDestroyed(SeamListener.java:40)
          at org.apache.catalina.core.StandardContext.listenerStop(StandardContext.java:3882)
          at org.apache.catalina.core.StandardContext.stop(StandardContext.java:4523)
          at org.apache.catalina.core.StandardContext.start(StandardContext.java:4387)
          at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:791)
          at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:771)
          at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:525)
          at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:926)
          at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.java:889)
          at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:492)
          at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1149)
          at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:311)
          at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)
          at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053)
          at org.apache.catalina.core.StandardHost.start(StandardHost.java:719)
          at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
          at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
          at org.apache.catalina.core.StandardService.start(StandardService.java:516)
          at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
          at org.apache.catalina.startup.Catalina.start(Catalina.java:578)
          at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
          at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
          at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
          at java.lang.reflect.Method.invoke(Method.java:597)
          at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288)
          at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)
          Caused by: java.lang.ClassNotFoundException: javassist.util.proxy.MethodHandler
          at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1387)
          at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1233)
          at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
          ... 29 more  回復(fù)  更多評(píng)論
            
          主站蜘蛛池模板: 浦东新区| 柏乡县| 兴山县| 疏勒县| 手游| 敦化市| 偃师市| 锦州市| 邛崃市| 常州市| 正阳县| 龙胜| 保德县| 广水市| 威宁| 旅游| 克山县| 杭锦后旗| 南溪县| 昌平区| 北票市| 康乐县| 天峻县| 兴海县| 宁陕县| 青海省| 惠州市| 武宁县| 通州市| 佛坪县| 冷水江市| 小金县| 天镇县| 晋宁县| 济阳县| 秦安县| 南乐县| 察哈| 上蔡县| 独山县| 木里|