`
40020072
  • 浏览: 72562 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Seam上下文

阅读更多

Seam上下文是由框架创建和销毁的。应用程序不能通过显式的Java API调用来控制上下文划分。上下文通常是隐含的。然而,在某些情况下,上下文可以通过annotation(注解)划分。

基本的Seam上下文有:

  • Stateless context

  • Event (or request) context

  • Page context

  • Conversation context

  • Session context

  • Business process context

  • Application context

你可能在servlet及相关规范中已经见过其中一些上下文了,但其中有两个可能从未见过:conversation context(业务对话上下文),和 business process context(业务流程上下文)。 在Web应用程序中,状态管理如此凌乱和容易出错的原因就是,内置的三个上下文(request, session 和application)从业务逻辑的角度来看不是很有意义。 例如,用户登录session的构建,对应用实际的工作流程来说就是相当随意的。 因此,大部分的Seam组件被限定在业务会话或者业务流程上下文中,因为这些上下文从应用的角度来说最有意义。

让我们按顺序来考察每个context(上下文)。

业务会话上下文是Seam中最核心的概念。conversation(业务会话)是从用户的视角看待的一个工作单元。 它可能跨越与用户交互的多个Servlet、多个请求,和多个数据库事务。但是对用户来说,一个业务会话解决一个单一的问题。 例如说:“预订酒店”,“批准合同”,“创建订单”都是业务会话。 你可以将业务会话理解成对一个“use case(用例)”或“user story(用户故事)”的实现,当然特定的业务关联并非与此类例子完全一致。

业务会话保存关于“在此窗口中,用户正在干什么”的状态。在任何时间,一个用户可能同时位于多个业务会话活动中,一般是在几个不同窗口中。 业务会话上下文让我们可以确保不同业务会话的状态不会互相干扰,不会导致Bug。

你可能要花上一点时间才能习惯以这一业务会话的观点来思考你的应用程序。 但一旦你习惯于它,你会喜欢上这个术语,并且再不会不用业务会话来思考了!

一些业务会话仅存在在一次请求中。跨域多个请求的业务会话必须通过Seam提供的annotation注解来划分。

一些业务会话同时也是tasks(任务)。任务是一种业务会话,它特指一个长时间运行的业务流程,当正确完成后,可能会触发一个业务流程状态的转换。Seam为任务划分提供了专门的注解。

业务对话可以是nested(嵌套)的,一个业务对话嵌套“在”一个更大的业务对话中。这是一项高级特性。

通常,业务对话状态实际上由Seam保存在Servlet Session 中,跨越请求。Seam实现了可配置的 conversation timeout,可以自动销毁不活动的业务会话,这就可以确保,如果用户取消对话,用户的登录Session中保存的状态不会无限增长。

对于在一个长时间运行的业务会话中所产生的并发请求,Seam按顺序执行。

除此之外,Seam也可以配置成把对话状态保存在客户端浏览器中。

Servlet和EJB规范都没有定义任何关于如何管理来自同一个客户端的并发请求的条款。 Servlet容器简单地让所有的线程并发运行,把线程资源安全共享的任务交给应用程序代码。 EJB容器允许无状态组件并发访问,但如果并发访问一个有状态Session Bean,就会抛出一个异常。

旧式的Web应用程序是围绕细粒度的同步请求编写的,因此这种行为可能还OK。 但是对现代的程序而言,由于大量使用了很多细粒度的异步(AJAX)请求,并发是实际存在的,并且必须被程序模型支持。 Seam在其上下文模型中加入了并发管理层。

Seam Session 和应用上下文是多线程的。Seam允许在一个上下文中并发请求,并发处理。事件(Event)和页面(Page)上下文自然是单线程的。 业务流程(business process)上下文严格而言是多线程的,但实际情况中并发很少见,因此大多数情况不会出现并发。 最后,Seam为Conversation Context提供了 每对话每进程单线程 模型,这是通过把同一个长时间运行的对话上下文中的并发请求序列化实现的。

因为Session上下文是多线程的,并且经常包含不稳定的状态,所以Session范围内的组件总是被Seam保护以防止并发操作。 Seam默认把针对Session范围的Session Bean和JavaBean的请求序列化(并且检测、解决任何发生的死锁)。 对Application Scoped的组件来说,这却不是默认行为,因为Application Scoped的组件通常不会包含的不稳定状态,并且在全局级别进行同步代价 极其 高昂。但是,你可以强制对任何Session Bean或JavaBean组件采用序列化的线程模型,要做的就是加上 @Synchronized 注解。

并发模型意味着AJAX客户端可以安全的使用不稳定的Session和会话状态,并且不需要开发者做任何特别的工作。

评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    seam参考手册中文版

    ##### Seam上下文层次 - **无状态上下文**:主要用于临时性的交互操作,不保留任何状态信息。 - **事件上下文**:处理特定事件,通常在事件触发时创建,事件处理完毕即销毁。 - **页面上下文**:对应Web页面的生命...

    SEAM 中文开发指南

    - **Seam上下文**: - **无状态上下文**:适用于一次性的操作。 - **事件上下文**:处理特定的事件触发。 - **页面上下文**:维护当前页面的状态。 - **业务会话上下文**:管理长时间的会话。 - **Session上...

    Jboss Seam中文版

    1. **Seam上下文**:介绍了Seam如何通过不同层次的上下文来管理应用的状态,包括无状态上下文、事件上下文、页面上下文、会话上下文、业务流程上下文、应用上下文等。 2. **组件类型**:详细列举了Seam支持的各种...

    seam的注解和标签

    - `@Destroy`: 类似于`@Create`,当Seam上下文销毁时调用`@Destroy`标记的方法,常用于资源清理。 2. **JPA注解** - `@Entity`: 表示一个Java类映射到数据库表。这是JPA的基础注解,定义了一个实体类。 - `@...

    Seam Framework 2.0 Reference中文版

    - **Seam 上下文**:介绍了 Seam 上下文的概念,它是 Seam 中的一个核心概念,用于管理应用程序的状态。 - **Statelesscontext(无状态上下文)**:不保存任何状态的上下文。 - **Eventcontext(事件上下文)**:...

    近两个星期seamtest的学习

    通过使用SeamTest,开发者可以避免手动配置测试环境,因为它能自动创建和管理Seam上下文,这大大减少了设置和维护测试用例的时间。 在源码层面,SeamTest提供了JUnit扩展,使得在JUnit测试类中可以直接使用Seam的...

    seam 框架整合hibernate+jsf

    Seam通过提供对Hibernate的无缝集成,使得开发者可以在不脱离Seam上下文的情况下方便地处理持久化操作。例如,Seam可以自动管理Hibernate的Session,提供事务控制,以及实现基于注解的实体管理和查询。 JavaServer ...

    JbossSeam中文开发指南.docx

    Seam上下文提供了一个统一的编程模型,能够将JSF、EJB、JPA等技术整合在一起,提供了一个强大且灵活的开发环境。 Seam事件 Seam事件是一个基于事件驱动的编程模型,能够帮助开发者快速构建企业级应用程序。Seam...

    seam2.0 中文文档

    ##### 3.1 Seam上下文 - **Statelesscontext(无状态上下文)**: 临时保存当前请求的信息。 - **Eventcontext(事件上下文)**: 记录触发事件的相关信息。 - **Pagecontext(页面上下文)**: 保持当前页面的状态...

    Seam入门

    #### 三、Seam上下文相关的组件模型 Seam框架的一个重要特点是其强大的上下文管理功能。这一部分将详细讨论Seam中的各种上下文以及它们如何协作以提供一致的应用程序体验。 ##### 3.1 上下文介绍 - **Stateless ...

    JBoss Seam 工作原理、seam和hibernate的范例、RESTFul的seam、seam-gen起步、seam组件、配置组件、jsf,jboss、标签、PDF、注解等等

    Seam - 语境相关的组件[满江红20071230]............................................................................................................................ 1 Java EE 框架...........................

    Jboss_seam 中英文文档

    2. **组件和依赖注入**:Seam 使用CDI(在早期版本中称为Seam上下文)来管理组件,实现了依赖注入,让开发者能够声明性地配置和管理对象的生命周期。 3. **事件驱动**:Seam 支持事件驱动的编程模式,允许组件之间...

    jboss seam 中文文档

    - **Seam 上下文**:Seam 提供了一套完整的上下文管理机制,用于存储不同层次的信息,如页面级别的状态、会话级别的状态等。 - **无状态 SessionBean**:介绍了一种不保留任何状态的组件类型,通常用于处理短暂的...

    jboss-seam2.0文档.rar

    3. CDI(Contexts and Dependency Injection):虽然Seam 2.0在Java EE 6之前发布,但它已经实现了CDI的前身,即Seam上下文和依赖注入。这使得开发者可以方便地管理对象的生命周期和依赖关系。 二、Seam 2.0的主要...

    jboss-seam2.1

    Seam 是一种业级 企 Java 的应规用程序框架。它的灵感源自下列原 : 只有一种“工具” Seam为 应 业务业业 义 种统 ...下文、持久化上下文、业务流程上下文, 以及用户够交互中能 跨多个 Web请求保存的务 务上下文。

    Seam框架文档简述

    Seam扩展了Java Servlet规范中的上下文模型,引入了对话上下文和业务流程上下文的概念。这些上下文扩展有助于更好地管理组件的状态。 ##### 5. 双向注射(Bijection) Seam使用Java 5的注解实现了双向注射机制。...

    JBoss Seam入门介绍

    组件可以是无状态或有状态的,有状态的组件可与多种预定义上下文关联,如业务流程上下文或方法上下文,这为Seam赋予了统一的组件模型。 #### 2. JSF集成 Seam将Java EE 5.0组件与JSF托管bean紧密集成,即使不使用...

    为Seam做好准备

    9. **Seam事件和上下文**:Seam引入了一种独特的事件模型和组件上下文,使得组件间的通信和状态管理更为简单,这是Seam区别于其他框架的一大特色。 10. **Seam安全性和事务管理**:Seam提供了内置的安全框架和事务...

Global site tag (gtag.js) - Google Analytics