个人工具

JBoss Seam集成支持

Evan Zeng

1. JBoss Seam简介

JBoss Seam是一个强大的应用框架,通过整合流行的面向服务架构(SOA)技术如AJAX、JSF、Enterprise Java Beans(EJB3)、Java Portlets、业务过程管理(BPM)和工作流,来构建下一代web2.0应用。 Seam被设计成在架构和API级彻底消除复杂度。它使得开发者用简单的声明POJOs组件化的UI小部件和非常少量的XML文件就可以组建复杂的web应用。Seam 的简单性使得将来整合JBoss企业服务总线(ESB)和Java业务集成(JBI)变得非常容易。

2. AOM与JBoss Seam的无缝集成

通过上述简介可知JBoss Seam是一个基于JSF的、功能强大的Web开发框架,而AOM提供标准的JSF引擎,并提供了支持Ajax的Rich Components,如果能将两者的优势结合起来,一定是一种非常理想的开发组合。事实上,由于两者都符合JSF标准,AOM与Seam的集成非常简单。

以下我们会详细讲述如何改造Seam的重要示例Booking,使其成功地运行于AOM和Apusic应用服务器上。我们只是将Booking使用的JSF引擎简单地替换为AOM,这样可以减少对Booking代码的改动。考虑到Seam目前对Toplink的支持不太理想,我们将Apusic的JPA实现换为Hibernate的实现。

我们假设你已经下载了Booking项目,所以下面步骤是从使用Apusic Studio建立AOM项目开始:

1、 创建Apusic标准工程。这里将标准工程命名为aom-booking,需要注意:由于hibernate的原因,当保存工程的目录名存在空格,则运行工程会出错。因此在创建工程时请确认文件路径不存在空格,以避免发生错误。

2、创建ejb和web模块。注意:需要删除META-INF目录下的apusic-application.xml和web模块下的WebContent/META-INF目录。

3、在工程目录下创建lib文件夹。

4、将jboss-seam.jar、jboss-el.jar拷贝到lib文件夹。

5、将lib目录下的所有jar包加入工程的Build Path。

6、将jboss-seam-ui.jar、jboss-seam-debug.jar、commons-digester-*.jar、commons-beanutils-*.jar拷贝到web模块的WEB-INF/lib目录下。

7、 修改META-INF/application.xml,加入:

<module>
    <ejb>jboss-seam.jar</ejb>
</module>

8、 修改WEB-INF/faces-config.xml,加入:

<application>
    <view-handler>com.sun.facelets.FaceletViewHandler</view-handler>
</application>

9、 修改WEB-INF/web.xml,加入:

<listener>
    <listener-class>org.jboss.seam.servlet.SeamListener</listener-class>
</listener>

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

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

<context-param>
    <param-name>javax.faces.DEFAULT_SUFFIX</param-name>
    <param-value>.xhtml</param-value>
</context-param>

<context-param>
    <param-name>facelets.DEVELOPMENT</param-name>
    <param-value>true</param-value>
</context-param>

<servlet>
    <servlet-name>ResourceServlet</servlet-name>
    <servlet-class>org.operamasks.faces.render.resource.ResourceServlet</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>ResourceServlet</servlet-name>
    <url-pattern>/_global/*</url-pattern>
</servlet-mapping>

10、将Seam examples/booking/resources/WEB-INF目录下的 component.xml 和 pages.xml 拷贝到web模块的WEB-INF 目录下。把 component.xml 文件中的 jndi-pattern 改为 java:ejb30/#{ejbName},并添加:

<persistence:entity-manager-factory name="apusicEntityManagerFactory"
    auto-create="true"
    persistence-unit-name="aom-booking" />
<persistence:managed-persistence-context name="em"
    auto-create="true"
    entity-manager-factory="#{apusicEntityManagerFactory}" />

11、将Seam examples/booking/resources/META-INF目录下的 ejb-jar.xml 和 persistence.xml 拷贝到 ejbJar/src/META-INF 目录下。修改 persistence.xml,将 jta-data-source 改为 jdbc/aom-booking,将属性 hibernate.dialect 的值改为 org.hibernate.dialect.MySQL5InnoDBDialect,将属性 hibernate.transaction.manager_lookup_class 的值改为 com.apusic.persistence.hibernate.ApusicTransactionManagerLookup:

<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect" />
<property name="hibernate.transaction.manager_lookup_class"
    value="com.apusic.persistence.hibernate.ApusicTransactionManagerLookup" />

12、将Seam examples/booking/resources目录下的 import.sql 和 seam.properties 拷贝到ejbJar/src目录下。

13、在ejbJar/src下创建package,包名为:org.jboss.seam.example.booking。然后将Seam examples/booking/src/org/jboss/example/booking 目录下的所有 java 文件拷贝到此package下。将 java 文件中的所有 @PersistenceContext 改为 @In

14、将Seam examples/booking/view下的所有目录和文件拷贝到web模块的WebContent目录下

15、去掉xhtml文件中与ajax4jsf相关的代码,因为ajax4jsf与AOM两者是不兼容的

16、创建MySQL数据库booking

17、修改Apusic服务器的domains/mydomain/config/datasources.xml,增加数据源,为了讲解的简便,我们把JNDI名设为jdbc/aom-booking:

<datasource name="aom-booking"
    jndi-name="jdbc/aom-booking"
    driver-class="org.gjt.mm.mysql.Driver"
    driver-classpath="E:\mysql-connector\mysql-connector-java-5.0.7-bin.jar"
    url="jdbc:mysql://localhost:3306/booking"
>
    <property name="user" value="root"/>
    <property name="test-before-reused" value="false"/>
    <property name="password" value=""/>
    <property name="stmt-cache-size" value="0"/>
    <property name="test-command" value=""/>
    <property name="pre-fetch-size" value="0"/>
</datasource>

18、将与Hibernate和Facelets相关的jar包拷到Apusic应用服务器的lib/ext目录下:

19、将commons-logging-1.0.4.jar拷贝到Apusic应用服务器的lib目录下

20、Run As->在Apusic应用服务器上运行,将项目部署到Apusic应用服务器上

21、访问http://localhost:6888/aom-booking,查看结果:

你可能注意到我们没有用AOM的Managed Bean,这是由于Managed Bean是JSF标准的一部分,Seam的Component其实也是Managed Bean,因此完全可以和AOM的Managed Bean混合使用。 同时你还可以对这个示例稍作清理,作为开发新项目的起点,节省开发时间。

3. 参考

为了方便用户部署aom-booking,将本文中的应用资源分开,用户可根据实际下载所需资源。

本文中的 aom-booking 应用,可以从这里直接下载获取。

本文所有与Hibernate和Facelets相关的jar包,可以从这里直接下载获取。

本文中的commons-logging-1.0.4.jar包,可以从这里直接下载获取。