- 浏览: 287752 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (121)
- jsf (16)
- 技术 (1)
- seam (27)
- jpa/hibernate (6)
- seam-对话 (3)
- 复用组件 (1)
- java基础 (18)
- JBOSS (1)
- Facelets (3)
- EL表达式 (2)
- 正则表达式 (1)
- sogi (2)
- 工具 (2)
- 设计模式/重构 (2)
- 项目管理-maven (5)
- EJB (1)
- ClassLoader (2)
- eclipse (1)
- jQuery (0)
- seam2源码分析 (0)
- osgi (0)
- TEST (0)
- 日志记录 (1)
- 批处理工作流 (0)
- 业务需求 (0)
- 语言 (2)
- 架构 (2)
- svn (1)
- sql (1)
- 异常处理 (1)
- mybatis (2)
- http (2)
- 代码可读性 (3)
- 配置化 (0)
- 错误恢复 (0)
- 状态查询 (1)
- 误操作恢复 (0)
- 工作安排 (0)
- 自动化 (0)
- 解耦 (1)
- 交流 (1)
- spring (6)
- 代码质量 (2)
- 方案 (1)
- 分布式 (1)
- mvc (2)
最新评论
-
luchuanbaker:
经过测试,实际上,mybatis并没有此问题,我也碰到了这样的 ...
mybatis 异常不友好 举例 -
huang882088:
jboss的war发布到tomcat里报这个错误怎么办?
classloader常见问题总结 -
yourenyouyu2008:
大型,可持续扩展的系统适合使用静态语言。大型系统中的部分地方可 ...
Nuxeo公司探秘:从Python迁移到Java -
yourenyouyu2008:
既然Nuxeo同时使用了Pytho ...
Nuxeo公司探秘:从Python迁移到Java -
panshunchang:
还有一种可能,真的缺这个jar包,在tomcat lib目录下 ...
classloader常见问题总结
实现原理
工厂的定义有三种方式 1)<factory method 2)<factory value 3)组件类中的@Factory(
Component.getInstance
所有组件的使用都是从Component.getInstance开始的,包括Name和factory
1) 首先从上下文中找组件
2) 如果找不到再通过工厂定义创建或组件定义newInstance
3) 将结果进行Unwrap处理,如果结果不是组件实例并且组件有Unwrap注释,就直接返回结果,否则报异常;如果结果是组件实例再进行Unwrap处理
Object result = Contexts.lookupInStatefulContexts(name);
if (result==null && create)
{
result = getInstanceFromFactory(name);
if (result==null)
{
if (component==null)
{
}
else if ( component.getScope().isContextActive() )
{
result = component.newInstance();
}
}
}
if (result!=null)
{
if (component!=null)
{
if ( !component.isInstance(result) )不是组件的实例,有Unwrap注释就直接返回,没有报异常
{
if ( component.hasUnwrapMethod() ) return result; ///best way???
throw new IllegalArgumentException( "….”);
}
result = component.unwrap(result);获取的是组件,再进行unwrap处理
}
}
getInstanceFromFactory(String name)
三种工厂定义都设置进Init中,配置优先与类中定义
Init init = Init.instance();
if (init==null) //for unit tests, yew!
{
return null;
}
else
{
Init.FactoryMethod factoryMethod = init.getFactory(name);
//组件方法工厂,执行组件的方法
Init.FactoryExpression methodBinding = init.getFactoryMethodExpression(name);
//配置方法工厂
Init.FactoryExpression valueBinding = init.getFactoryValueExpression(name);
//配置值工厂
if ( methodBinding!=null && getOutScope( methodBinding.getScope(), null ).isContextActive() ) //let the XML take precedence
{
Object result = methodBinding.getMethodBinding().invoke();
return handleFactoryMethodResult( name, null, result, methodBinding.getScope() );
}
else if ( valueBinding!=null && getOutScope( valueBinding.getScope(), null ).isContextActive() ) //let the XML take precedence
{
Object result = valueBinding.getValueBinding().getValue();
return handleFactoryMethodResult( name, null, result, valueBinding.getScope() );
}
else if ( factoryMethod!=null && getOutScope( factoryMethod.getScope(), factoryMethod.getComponent() ).isContextActive() )
{
Object factory = Component.getInstance( factoryMethod.getComponent().getName(), true );
if (factory==null)
{
return null;
}
else
{
Object result = factoryMethod.getComponent().callComponentMethod( factory, factoryMethod.getMethod() );
return handleFactoryMethodResult( name, factoryMethod.getComponent(), result, factoryMethod.getScope() );
}
}
else
{
return null;
}
}
handleFactoryMethodResult
result为工厂方法返回的值或值绑定的值,如果
handleFactoryMethodResult(String name, Component component, Object result, ScopeType scope)
{
Object value = Contexts.lookupInStatefulContexts(name); //see if a value was outjected by the factory method
if (value==null) //usually a factory method returning a value
{
ScopeType outScope = getOutScope(scope, component);
if ( outScope!=STATELESS )
{
outScope.getContext().set(name, result);
}
return result;
}
else //usually a factory method with a void return type
{
if (scope!=UNSPECIFIED)
{
throw new IllegalArgumentException("factory method with defined scope outjected a value: " + name);
}
return value;
在配置文件
1)<factory> 声明让你指定一个值或者方法来绑定一个表达式,当它第一次被引用时,将被执行用来初始化一个context变量的值。
<factory name="contact" method="#{contactManager.loadContact}" scope="CONVERSATION"/>
<factory name="user" value="#{actor}" scope="STATELESS"/>
<factory name="contact" value="#{contactManager.contact}" scope="STATELESS"/>
2)你也可以为Seam组件创建一个别名(第二个名字)
<factory name="user" value="#{actor}" scope="STATELESS"/>
<factory name="contact" value="#{contactManager.contact}" scope="STATELESS"/>
3)auto-create="true" 用在 <factory> 声明中尤其常见
<factory name="session" value="#{entityManager.delegate}" scope="STATELESS" auto-create="true"/>
在组件类中
有两种工厂方法。
第一种返回一个值,Seam会把它绑定到上下文里:
第二种方法返回 void,它自己把值绑定到上下文变量:
@Factory(scope=CONVERSATION)
public List<Customer> getCustomerList() {//没有指定工厂名字就按bean取方法名称
return ... ;
}
与类的属性配合使用
@DataModel List<Customer> customerList;
@Factory("customerList")
public void initCustomerList() {
customerList = ... ;
}
@Unwrap
一个组件只能有一个@Unwrap
两种情况下,当我们引用 customerList 上下文变量,而其值为null时,工厂方法被调用,然后对这个值生命周期的其他部分就无法操纵了。更加强大的模式是 manager component pattern(管理者组件模式)。 在这种情况下,有一个Seam组件绑定到上下文变量,它管理着上下文变量的值,对客户端不可见。
管理者组件可以是任何组件,它需要一个 @Unwrap 方法。 该方法返回对客户端可见的值,每次 上下文变量被引用的时候都会被调用。
@Name("customerList")
@Scope(CONVERSATION)
public class CustomerListManager
{
...</
发表评论
-
spring seam比较
2014-01-14 14:06 9621)获取框架中的bean spring通过静态方法中传递 ... -
Nuxeo公司探秘:从Python迁移到Java
2013-07-21 10:57 1091成立于2000年的Nuxeo公 ... -
自定义组件问题
2013-03-01 10:14 01)ios:dataTable组件中不加buttonPane ... -
seam中内嵌的事务回滚拦截器RollbackInterceptor
2012-12-28 15:17 2124seam中有两种事务管理方 ... -
使用JTA的事务同步机制实现分布式事务j的功能avax.transaction.Synchronization
2012-12-05 18:43 0分布式事务强大功能,但也会带来性能和管理上的压力(这是听专家门 ... -
seam中的test
2012-04-25 11:25 0seam中提供了一些非seam环境下的unit testing ... -
Hibernate的FlushMode 和seam对话中的FlushMode
2012-02-21 17:29 0hibernate提供了5种flushmode。 1) NE ... -
seam 中的注释分类
2012-02-14 11:08 0seam中注释主要分为2大类,seam组件对象构造阶段的注释和 ... -
seam2 热部署
2011-09-30 10:25 1206seam能很好地支持 页面(faceslet)、非ejb cl ... -
使用长对话的"manual" flush-mode ,多操作一次提交
2011-03-24 10:27 1549一次长对话访问中可以包括多个页面,每个页面只处理部分数据,但不 ... -
seam 属性配置与installed="false"的冲突
2011-03-08 15:09 1127问题 在测试和运行环境使用不同的事务配置,默认不需要指定事务 ... -
最简单的richfaces tree使用方式
2010-10-30 12:54 2368richfaces tree提供的示例都是一次全部构造出树,对 ... -
page scope介绍及用途
2010-06-02 00:13 6314jsf1.2只提供了3中作用域,application、ses ... -
seam框架中@Unwrap的使用示例
2009-09-07 10:07 16631) 把FacesContext当seam组件使用,可以直接 ... -
基于seam技术的中文网站
2009-09-05 16:28 1367基于seam的中文网站,欢迎大家提供实际的seam项目 ht ... -
在seam项目启动后执行数据库操作
2009-07-15 15:33 1798项目启动时执行些初始化数据操作,问题是事务不能提交,这样虽然方 ... -
基于seam-gen的热部署(hot deploy)相关问题
2009-07-06 12:04 1498使用seam-gen生成的seam项目是支持热部署的。 ... -
提升jsf/seam性能
2009-05-23 22:07 1467转载:http://www.jsfcentral.com/ar ... -
根据组件名字获取组件对象Component.getInstance(String name)
2009-05-05 22:02 4047Component.getInstance(String ... -
components.xml 配置seam组件
2009-04-29 12:21 2421components.xml 的配置采用反射机制来实现,组件类 ...
相关推荐
### SEAM 中文开发指南知识点概述 #### 一、SEAM 框架简介 - **SEAM**:SEAM 是一个基于 Java EE 的企业级应用框架,它简化了复杂的应用程序开发过程,并且提供了丰富的功能来支持业务逻辑的实现。 - **版本信息**...
JFreeChart-1.0.5-Ch.chm提供了详细教程和示例,帮助开发者利用JFreeChart在Seam应用中展示数据。 **7. ANTLR** ANTLR 是一个强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件。ANTLR中文...
seam 中文文档 pdf 格式 JSF+EJB3.0快速开发框架Seam的中文版向导。。。
Seam的主要目标是减少开发中的样板代码,提高生产力,同时保持灵活性和可扩展性。 **二、Seam核心概念** 1. **组件(Components)**: Seam的核心是组件模型,它允许开发者定义和管理应用中的对象。组件可以是简单的...
在这个“seam需要的jar包”压缩包中,包含了运行和开发Seam应用程序所需的各种库文件。 首先,Seam框架的核心依赖于JSF,这是Java EE中的一个用户界面组件框架,用于构建交互式Web应用。JSF提供了模型-视图-控制器...
Seam入门部分介绍了如何在不同的服务器环境中部署和运行Seam应用实例,包括JBoss AS和Tomcat服务器。 **1.1.1 在JBoss AS上运行示例** 在JBoss AS上部署和运行Seam应用,首先需要确保JBoss AS服务器已经正确安装并...
7. **国际化与本地化**:Seam支持多语言环境,对于中英文双语版本的书籍,这为开发者提供了跨越语言障碍的便利,帮助全球的开发者理解和使用Seam框架。 8. **测试支持**:Seam提供了一套完整的测试工具,包括单元...
- **理解 Seam 业务对话(Conversation)**:解释了业务对话在 Seam 中的作用和意义,以及如何设计有效的对话来提高用户体验。 - **Seam 的 UI 控制库**:介绍了 Seam 提供的一系列 UI 控件,这些控件可以帮助开发者...
seam下一代web开发框架
整理自jboss seam 中文站,压缩为chm格式,便于广大jboss seam爱好者阅读,所有版权归jboss seam中文站所有。
这份资料提供了丰富的示例代码和项目,通过这些实例,开发者可以深入理解Seam的工作原理以及如何在实际项目中应用它。这种方法能够确保理论与实践相结合,使学习过程更加高效。 #### 四、核心特性详解 - **组件模型...
1. **在JBoss AS上运行示例**:首先需要安装配置JBoss AS服务器,然后导入Seam项目到服务器中进行部署。 2. **在Tomcat服务器上运行示例**:Tomcat作为轻量级的应用服务器,可以快速部署简单的Seam应用,便于学习和...
在JSF项目中配置Seam,可以充分利用其优势,如组件管理、对话管理、事件处理等。 首先,配置Seam的关键在于以下几个方面: 1. **阶段监听器配置**:在`faces-config.xml`中添加`SeamPhaseListener`。这是Seam启动...
6. **国际化与本地化**:学习如何在Seam项目中实现多语言支持。 7. **测试与调试**:掌握Seam的测试工具和策略,确保代码质量。 8. **Seam组件**:了解如Conversation、Transactions、邮件服务等Seam内置组件的使用...
2. **寻找最佳路径**: 在确定能量函数后,算法会在图像中寻找一条能量最低的“拉链”(即 seam),这条拉链将沿着图像的垂直或水平方向穿过。在垂直方向上,拉链的每一像素与上一行的像素相对应,而在水平方向上,...
Seam是一个全面的Java开发框架,专...总之,拥有《Seam In Action》、《JBoss Seam》和《官方中文指南》这些资源,开发者可以系统地学习和精通Seam框架,从而在企业级Java应用开发中游刃有余,提高开发效率和应用质量。
在Seam框架中,注解和标签起着至关重要的作用,它们简化了代码并增强了可读性。下面我们将详细讨论Seam中的注解以及与之相关的标签。 1. **Seam注解** - `@Name`: 这是Seam的核心注解,用于为组件定义一个唯一的...
Seam是一个Java EE集成框架,它将JavaServer Faces(JSF)、Java Persistence API(JPA)、Enterprise JavaBeans(EJB)3.0以及其他组件统一在一个简化开发的环境中。这篇博客的链接虽然无法直接访问,但我们可以...
下面将详细阐述seam carving的基本原理、实现过程以及在MATLAB中的应用。 Seam Carving是一种基于能量的图像缩放技术,由Ariel Shamir和Shai Avidan在2007年提出。它的核心思想是找出图像中的一条或多条“能量最低...