Seam是一個挺不錯的框架,但是用netbeans來開發它,卻有點難度,因為目前netbeans沒有seam插件,不像Eclipse有jboss提供的官方插件,但是插件是死的,人是活的,它要能跑起起來,一定有它的配置,下面我們就用netbeans做為IDE來開發一個seam的應用.
當然,我們還有另外一個方法,那就是利用seam自帶的seam-gen工具,生成一個工程的框架,然后可以用netbeans打開,但是有一些不太好的地方,那就是所有的工程內容都混到一起去了,WEB的工程和EJB的工程都在同一個工程下面,并且由于是基于ant的,所以工程的目錄看得可能不太習慣.但它也有一個好處,那就是它會為你生成各種必須的配置文件,而不需要手工的編寫,但是它的壞處就是,如果你后面想要添加EJB或者添加網頁內容,就不太方便了,因為目錄的組織是怪怪的,不是標準的Netbeans工程組織方式,所以我還是覺得自己建標準的netbeans工程,然后手工添加這些配置文件,并且這些配置文件也不一定需要自己全部手工編寫,完全可以復制過來,然后在一些細節的地方改動一下就可以了.并且配置好以后,要添加工程內容,就可以完全按照netbeans標準工程的方式來添加了.
由于自己也是前幾天接觸的seam,所以錯誤之處難免,還望大家指出.
首先我們說一說周邊的東西,那就是要添加哪些配置文件,配置文件大概是什么內容,以及各個工程都需要哪些庫,這些是基礎,也是很重要的,否則布署工程的時候就會出現一大堆的錯誤.
在正式工作之前,先準備好要用到的工具,我這里的工具列表如下:
1,Netbeans6.1,可以到http://www.netbeans.org下載,下載的時候,選擇下載全部的版本,也就是最大的那個版本.
2,Jboss-4.2.2.GA,可以到http://www.jboss.org下載.
3,Jboss-seam-2.0.1.GA,也可以到http://www.jboss.org下載
以上具體地址我就不給了,可以自己到首頁上去找,這個應該不難吧.
至于richfaces就不用準備了,seam里面都帶了,什么spring,hibernate等等,它里面都有自帶.
本文的流程如下,先是大概介紹每個工程的配置文件有哪些,以及它們需要哪些庫文件,然后才真正寫一個示例程序,所以前面的配置文件內容僅供參考,讓我們知道,里面包括了哪些元素,因為實際的工程和它不一定是一樣的.
準備工作做好以后,就可以開始了,打開我們熟悉的Netbeans,選擇新建工程,然后選擇新建Web工程,在建WEB工程的時候, 不要選擇使用任何框架,因為現在還沒有seam的netbeans插件,所以,一切的配置都得靠手寫.建好了WEB工程以后,在WEB-INF文件夾下面添加如下文:pages.xml,components.xml,faces-config.xml,而web.xml是我們本來就有的,但是我們要修改一下里面的內容,好讓它可以配合seam框架運行.更改好的web.xml內容大致如下:
如果你的WEB容器支持JAVAEE5,則下面的web-app version就可以等于2.5了,如果是支持J2EE1.4的,那么就要把它改成2.4的版本,建議是利用netbeans生成的web.xml基礎上改,也就是只改內容,而不改xml的頭部說明,也就是下面的web-app部份,一般不要去改,我們只改動里面的元素而已.
<?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的技術,我們的例子里面沒有用到 -->
<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>
在添加其它三個文件的內容之前,先說一下那三個文件是干什么用的,首先components.xml,這個文件里面寫的是seam組件的配置,它是必不可少的,一般來說,它可以放在很多地方,但是最好還是放在WEB-INF下面,下面來看看它里面的內容:
<?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的時候,JNDI的形式,以及對話(conversation)的超時時間.
然后我們再來看faces-config.xml,它是標準的JSF的說明文件,但是它在SEAM里面并沒有完全起到在JSF里面的作用,在JSF里面,它定義backingbean,并且定義導航規則,但是在SEAM里面,它總是很小,backingbean不需要在這里定義了,因為在SEAM里面,我們可以把EJB做為backingbean,并且用注釋的方式來指定它的名字以及范圍,另外一個,導航規則也不用在這里定義了,我們可以用另外一個專門的文件來定義,那就是pages.xml,所以在SEAM的應用里面,雖然用到了JSF的技術,但是JSF的主要配置文件faces-config.xml卻不用怎么配置了,當然,你也可以在這里面配置導航規則,只有當我們使用了facelets技術以后,才確定要在這個文件里面配置一些東西,否則,這個文件空在那里也沒什么關系,facelets是SEAM框架里面推薦使用的技術,當然,我們也可以不用,也可以只用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,它是定義頁面之間的導航規則的,這個文件是可有可無的,SEAM啟動的時候,會找這個文件,找到了就讀里面的配置,找不到也沒關系,就當什么也沒有發生.
它的大概內容如下:
<?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來使用,這樣可以補充標準的JSF組件不足的情況,并且richfaces和seam都是一家產品,所以運用起來可能會方便一些,在做SEAM應用的時候,推薦用richfaces做JSF的組件庫,當然,你也可以用別的組件庫,如apache的MyFaces.在配置文件建好模型以后,再為WEB工程添加項目所需要的庫,一般來說,需要添加的庫如下:
jboss-seam-debug.jar 調試的時候用
jboss-seam-ui.jar 調用seam的組件,比如<s:validate 等等
jsf-facelets.jar JSF的facelets技術
richfaces-impl.jar richfaces的實現庫
richfaces-ui.jar richfaces的UI庫
richfaces-api.jar richfaces的API庫
jboss-el.jar jboss的EL庫
當然,根據不同的應用,可能所要包含的庫會有點不同,具體庫的依賴性,可以查看SEAM的官方說明.WEB項目的部份大概就這些,下一章,我們再說一說EJB項目的部份.
盡管千里冰封
依然擁有晴空
你我共同品味JAVA的濃香.
posted on 2008-05-06 15:53
千里冰封 閱讀(4198)
評論(5) 編輯 收藏 所屬分類:
JAVAEE 、
Netbeans