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)变得非常容易。
通过上述简介可知JBoss Seam是一个基于JSF的、功能强大的Web开发框架,而OperaMasks提供标准的JSF引擎,并提供了支持AJAX的Rich Components,如果能将两者的优势结合起来,一定是一种非常理想的开发组合。事实上,由于两者都符合JSF标准,OperaMasks与Seam的集成非常简单。
以下我们会详细讲述如何改造Seam的重要示例Booking,使其成功地运行于OperaMasks和Apusic应用服务器上。我们只是将Booking使用的JSF引擎简单地替换为OperaMasks,这样可以减少对Booking代码的改动。考虑到Seam目前对Toplink的支持不太理想,我们将Apusic的JPA实现换为Hibernate的实现。
我们假设你已经下载了Booking项目,所以下面步骤是从使用Apusic Studio建立OperaMasks项目开始:
1、 创建Apusic标准工程。这里将标准工程命名为aom-booking,需要注意:由于hibernate的原因,当保存工程的目录名存在空格,则运行工程会出错。因此在创建工程时请确认文件路径不存在空格,以避免发生错误。
2、创建ejb和web模块。注意:需要删除工程META-INF目录下的apusic-application.xml和web模块下的WebContent/META-INF目录。
3、在工程目录下创建lib文件夹,将jboss-seam.jar、jboss-el.jar(jar.zip下lib中jar包)拷到lib文件夹。
4、将lib目录下的所有jar包加入工程的Build Path。
5、将jboss-seam-ui.jar、jboss-seam-debug.jar、commons-digester-*.jar、commons-beanutils-*.jar(jar.zip下web-inf_lib中jar包)拷贝到web模块的WEB-INF/lib目录下。
6、 修改META-INF/application.xml,加入:
<module>
<ejb>jboss-seam.jar</ejb>
</module>7、 修改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>
8、将Seam examples/booking/resources/WEB-INF目录下的 component.xml 和 pages.xml 拷贝到web模块的WEB-INF 目录下。把 component.xml 文件修改为:
<?xml version="1.0" encoding="UTF-8"?>
<components xmlns="http://jboss.com/products/seam/components"
xmlns:core="http://jboss.com/products/seam/core"
xmlns:persistence="http://jboss.com/products/seam/persistence"
xmlns:security="http://jboss.com/products/seam/security"
xmlns:web="http://jboss.com/products/seam/web"
xmlns:transaction="http://jboss.com/products/seam/transaction"
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/persistence http://jboss.com/products/seam/persistence-2.0.xsd
http://jboss.com/products/seam/security http://jboss.com/products/seam/security-2.0.xsd
http://jboss.com/products/seam/web http://jboss.com/products/seam/web-2.0.xsd
http://jboss.com/products/seam/transaction http://jboss.com/products/seam/transaction-2.0.xsd
http://jboss.com/products/seam/components http://jboss.com/products/seam/components-2.0.xsd">
<core:init jndi-pattern="java:ejb30/#{ejbName}" debug="true" />
<core:manager conversation-timeout="120000"
concurrent-request-timeout="500"
conversation-id-parameter="cid"/>
<transaction:ejb-transaction/>
<security:identity authenticate-method="#{authenticator.authenticate}"/>
<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}" />
</components>
9、将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.hbm2ddl.auto" value="create-drop" />:
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect" />
<property name="hibernate.transaction.manager_lookup_class"
value="com.apusic.persistence.hibernate.ApusicTransactionManagerLookup" />10、将Seam examples/booking/resources目录下的 import.sql 和 seam.properties 拷贝到ejbJar/src目录下。
11、在ejbJar/src下创建package,包名为:org.jboss.seam.example.booking。然后将Seam examples/booking/src/org/jboss/example/booking 目录下的所有 java 文件拷贝到此package下。将 java 文件中的所有 @PersistenceContext 改为 @In
12、将Seam examples/booking/view下的所有目录和文件拷贝到web模块的WebContent目录下
13、去掉xhtml文件中与ajax4jsf相关的代码,因为ajax4jsf与OperaMasks两者是不兼容的(如引用xmlns:a="http://richfaces.org/a4j"的代码)
14、根据import.sql创建MySQL数据库booking和数据表
15、修改Apusic服务器的domains/mydomain/config/datasources.xml,增加数据源,为了讲解的简便,我们把JNDI名设为jdbc/aom-booking(注意driver-classpath的路径,用户名和密码的修改):
<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>16、将与Hibernate和Facelets相关的jar包(jar.zip下ext中jar包)拷到Apusic应用服务器的lib/ext目录下:
17、将commons-logging-1.0.4.jar拷贝到Apusic应用服务器的lib目录下
18、Run As->在Apusic应用服务器上运行,将项目部署到Apusic应用服务器上
19、访问http://localhost:6888/aom-booking/home.faces,查看结果:
你可能注意到我们没有用OperaMasks的Managed Bean,这是由于Managed Bean是JSF标准的一部分,Seam的Component其实也是Managed Bean,因此完全可以和OperaMasks的Managed Bean混合使用。 同时你还可以对这个示例稍作清理,作为开发新项目的起点,节省开发时间。