因为初学,想通过一个例子尽快了解seam的大致开发过程,但是seam自己带的例子,配置麻烦(只想研究booking例子,但是其配置文件涉及了好几个其他配置文件,真是牵一发而动全身) ,后来下载Michael Yuan和Thomas Heute所著的JBoss Seam: Power and Flexibility Beyond Java EE 5.0所带的booking,内容一样,但是配置文件很干净。
导入开发环境(Eclipse3.3 + JBOSSTools 2.0.0 CR1 + JBoss seam 2.0.1 CR1),通过调试跟踪,了解了下seam的基本工作过程。几点体会:
1. seam是有状态的。通过SFSB,JSF,Hibernate配合工作。状态好象是保存在facesContext中。
2. AOP编程?调试中发现很多的interceptor.( org.jboss.seam.ejb.SeamInterceptor)
3. 表示层使用JSF, faces。 servlet 配置为.seam文件,faces为xhtml文件。jsf的taglib, <h: 表示html, <f:表示jsf/core, <s:表示seam。
页面控件和EOS非常相似,
如输入框: <h:inputText id="username" value="#{identity.username}" /> EOS的tag则是: <html:text property="CUST/PHONE" ></html:text>。 这里的属性value和property可以相对应。
上面的jsf标签中, jsf 的页面请求由seam进行变量解析,如identity. 请求调用的会话bean动作监听器方法,过程中首先会被seam拦截器截获(类似于Spring),进行out注入后,再执行会话bean动作监听器方法。
4. 导航文件navigation.xml可以可视化方式展示页面的流转。 如 /booking/resources/WEB-INF/navigation.xml
seam部署描述符文件component.xml,告知seam在JNDI中找到EJB组件。
web部署描述符文件web.xml配置seam和MyFaces.
JSF配置,faces-config.xml
5. 持久层使用Hibernate:/booking/resources/META-INF/persistence.xml中, org.hibernate.ejb.HibernatePersistence。 使用EntityManager管理数据,没看到数据库连接和具体实现,只看到方法调用。
6. identity作为安全配置的角色,传递输入参数. 通过login.login进行认证。
/booking/resources/WEB-INF/components.xml
在resources/WEB-INF/pages.xml中做了页面访问配置。
7. 会话Bean充当动作监听器,SLSB直接访问EntityManager,对传统J2EE的突破。
8. 常用的注解:
EJB3: @stateless, @PersistenceContext, @Entity, @Table, @Id, @Local;
Seam: @Name, @Scope, @In;
Hibernate: @NotNull, @Length;
总结: 对seam宣传的在“Web应用中集成业务流程”的特性还没有体验到。
补充:
9 关于BPM: component.xml: 过程定义process definition和页面流定义pageflow definition。
9.1 关于页面流:使用jPDL定义了页面的流向,参数。配合action动作。
10 seam的事件类型
通过绑定了表达式的JSF EL方法映射到Seam组件去。
10.1 JSF事件:在JSF模板中定义;
<h:commandButton value="Click me!" action="#{helloWorld.sayHello}"/>
10.2 jBPM的转换事件:在jBPM过程定义或页面流定义中指定;</start-page>
10.3 Seam页面动作:在我们渲染页面之前发生的事件。在 WEB-INF/pages.xml 中声明页面动作。
<pages>
<page view-id="/hello.jsp" action="#{helloWorld.sayHello}"/>
</pages>
10.4 Seam组件驱动事件:在 components.xml 里指定了事件监听器(观察者)。
<components>
<event type="hello">
<action execute="#{helloListener.sayHelloBack}"/>
<action execute="#{logger.logHello}"/>
</event>
</components>
10.5 Seam上下文事件:内置事件
最后给出总体框图: 看看seam的地位和作用: