ONJava.com -- JBoss Seam --> page 1

本文介绍了如何使用JBoss Seam框架整合JavaServer Faces (JSF) 和 Enterprise JavaBeans (EJB) 3.0,简化复杂Web应用开发。通过示例展示Seam如何改善组件生命周期管理和业务流程处理。

JBoss Seam

作者 Thomas Heute 03/15/2006
翻译 墩子 01/25/2007

JavaServer Faces (JSF) 和 Enterprise JavaBeans (EJB) 3.0 是用于构建 Web 应用程序的强大技术。 如果能将两个框架结合起来,无疑它们会相得益彰:无态和有态 EJB 是用于 JSF 的极好的事件处理支持 Bean。 EJB 实体 Bean 可以提供自动且透明的对象关系型数据库映射;因此,它们是实现面向对象域模型的一个很好的解决方案。 可视的 JSF 组件可以将自己的状态绑定到实体 Bean 上。 你还可能需要在应用程序中添加一些业务流程管理(BPM)。

然而,将 EJB3.0 与JSF 结合起来的想法虽然很诱人,但是目前还无法在 Java Enterpries Edition(JEE) 5.0 框架中加以实现。 在纯 JEE 中,如果你希望为一个 Web 应用程序添加完美的 BPM,则需要添加大量粘合代码才能将 JSF 和 EJB 3.0 结合起来。 特别的是,这些粘合代码造成的问题极有可能危及到应用程序,比如令人担心的“后退按钮问题”或者多窗口操作,这需要在基础框架上花大量的时间,从而分散了开发者对实际业务问题的关注。

JBoss Seam 框架正是用于解决现有框架(包括 EJB 3.0, JSF 和 BPM)之间存在的这一问题。 Seam 有态组件模型为开发精密的有态 Web 应用程序带来了一阵清风。 在这篇文章中,我将介绍如何使用“接缝(Seam)”来创建一个电子商务应用程序 -- “JBoss Seam DVD 商店”应用程序。

将 EJB 和 Web 捆绑在一起

一般情况下,开发者会在一个精密的 Web 应用程序中应用多种设计模式,创建多层的代码,这通常是对框架的要求,而不是应用程序设计的任务。 Seam 将摧毁这些框架创建的层,并使 EJB 更接近 Web 层。 它允许您将 EJB 做为 JSF 支持 Bean 来访问。 因此,开发者可以根据应用程序基础结构的要求来自由选择需要哪些层,而不是被框架所迫做出选择。

Seam 自动管理应用程序组件的生命周期。 开发者可以在 Seam 上下文中检索和存储组件。 这种设计方法也称作“倒置控制(Inversion of Control)”,将开发者从手动管理组件间的关系中解放出来。

为了说明以上要点,让我们看一个虚拟 DVD 商店的例子。 这个示例展示了如何检索一个已登录的用户在单个网页上发出的定单。 首选看一下有态会话 Bean, 它用来执行业务逻辑并完成所有与数据库有关的操作。 此会话 Bean 将负责查找一个已登录用户的所有定单。 请注意我们选择了一个简单的方法来执行此任务。 您当然可以依照自己的习惯完成任务,但是请记住缝合的组件可以是任何组件,并不仅仅是 EJB。

 

package  com.jboss.dvd.seam;
import  [...]

@Stateful
@Name(
" showorders " )
@Interceptors(SeamInterceptor.
class )
public   class  ShowOrdersAction
    
implements  ShowOrders,
               Serializable
{
    @In(value
="currentUser",required=false)
    Customer customer;

    @PersistenceContext(unitName
="dvd")
    EntityManager em;

    @DataModel
    List 
<Order> orders;    

    @Factory(
"orders")
    
public String findOrders() {
        orders 
= em.createQuery(
   
"from Order o where o.customer = :customer")
            .setParameter(
"customer", customer)
            .getResultList();
        
return "showorders";
    }


    @Destroy 
    @Remove
    
public void destroy() {}
}

这是一个标准的 EJB3 有态 Bean。 @Stateful 标识用于声明有态会话 Bean,而 @Remove 标识用于在调用 destroy 方法时要求服务器删除该 Bean。

这个会话 Bean 类还包含一些 EJB 3.0 规范以外的标识。 它们是接缝 (Seam) 标识。 @Name 标识给会话 Bean 一个引用名称,以便可以从任何 JSF 网页或其他 Seam 调用该名称。 我们还将 SeamInterceptor 指定为此会话 Bean 的唯一拦截器。 这是 Seam 发挥接缝作用所必须的。

1, 2, 3, 4, 5

             

下一页箭头

下载方式:https://pan.quark.cn/s/a4b39357ea24 布线问题(分支限界算法)是计算机科学和电子工程领域中一个广为人知的议题,它主要探讨如何在印刷电路板上定位两个节点间最短的连接路径。 在这一议题中,电路板被构建为一个包含 n×m 个方格的矩阵,每个方格能够被界定为可通行或不可通行,其核心任务是定位从初始点到最终点的最短路径。 分支限界算法是处理布线问题的一种常用策略。 该算法与回溯法有相似之处,但存在差异,分支限界法仅需获取满足约束条件的一个最优路径,并按照广度优先或最小成本优先的原则来探索解空间树。 树 T 被构建为子集树或排列树,在探索过程中,每个节点仅被赋予一次成为扩展节点的机会,且会一次性生成其全部子节点。 针对布线问题的解决,队列式分支限界法可以被采用。 从起始位置 a 出发,将其设定为首个扩展节点,并将与该扩展节点相邻且可通行的方格加入至活跃节点队列中,将这些方格标记为 1,即从起始方格 a 到这些方格的距离为 1。 随后,从活跃节点队列中提取队首节点作为下一个扩展节点,并将与当前扩展节点相邻且未标记的方格标记为 2,随后将这些方格存入活跃节点队列。 这一过程将持续进行,直至算法探测到目标方格 b 或活跃节点队列为空。 在实现上述算法时,必须定义一个类 Position 来表征电路板上方格的位置,其成员 row 和 col 分别指示方格所在的行和列。 在方格位置上,布线能够沿右、下、左、上四个方向展开。 这四个方向的移动分别被记为 0、1、2、3。 下述表格中,offset[i].row 和 offset[i].col(i=0,1,2,3)分别提供了沿这四个方向前进 1 步相对于当前方格的相对位移。 在 Java 编程语言中,可以使用二维数组...
源码来自:https://pan.quark.cn/s/a4b39357ea24 在VC++开发过程中,对话框(CDialog)作为典型的用户界面组件,承担着与用户进行信息交互的重要角色。 在VS2008SP1的开发环境中,常常需要满足为对话框配置个性化背景图片的需求,以此来优化用户的操作体验。 本案例将系统性地阐述在CDialog框架下如何达成这一功能。 首先,需要在资源设计工具中构建一个新的对话框资源。 具体操作是在Visual Studio平台中,进入资源视图(Resource View)界面,定位到对话框(Dialog)分支,通过右键选择“插入对话框”(Insert Dialog)选项。 完成对话框内控件的布局设计后,对对话框资源进行保存。 随后,将着手进行背景图片的载入工作。 通常有两种主要的技术路径:1. **运用位图控件(CStatic)**:在对话框界面中嵌入一个CStatic控件,并将其属性设置为BST_OWNERDRAW,从而具备自主控制绘制过程的权限。 在对话框的类定义中,需要重写OnPaint()函数,负责调用图片资源并借助CDC对象将其渲染到对话框表面。 此外,必须合理处理WM_CTLCOLORSTATIC消息,确保背景图片的展示不会受到其他界面元素的干扰。 ```cppvoid CMyDialog::OnPaint(){ CPaintDC dc(this); // 生成设备上下文对象 CBitmap bitmap; bitmap.LoadBitmap(IDC_BITMAP_BACKGROUND); // 获取背景图片资源 CDC memDC; memDC.CreateCompatibleDC(&dc); CBitmap* pOldBitmap = m...
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值