任何一个框架都必须拥有一个非常重要的功能:可扩展性。JBoss Seam在这个方面得到了最高的分数。理由非常简单。The main goal, to introduce consistent programming model that will make various frameworks to work together, is not just promoted for application developer, but also used through-out Seam itself.所以,通过了解如何使用组件模型并快速深入其内部原理后,你就能便捷地开始扩展内置组件。
首先,你需要了解组件开发的流程。Seam程序由context listener启动,context listener则通过根据配置实例化Initialization对象来生成。而这些配置依次来自于以下几个部分:
1、WEB-INF/components.xml和不建议使用的WEB-INF/events.xml
2、servlet context和classpath根目录下的seam.properties
3、用@Name注解的Seam组件
然后,依赖管理器通过评估组件依赖关系来决定加载哪些组件。
在这里,Seam会用到另外一个注解——@Install。它并不仅仅指定是否加载某个组件及其依赖的组件(该功能还可以通过配置文件来覆盖),同时还指定了组件的优先权。如果两个组件拥有相同的名称,并且同时存在,依赖管理器就会加载具有更高优先级的那个。
这里的优先级是由预先定义的整型常量指定:
1、BUILT_IN [0]用于内置组件
2、FRAMEWORK [10]用于继承自Seam的框架
3、APPLICATION [20],默认的优先级,用于程序中的组件
4、DEPLOYMENT [30]用于在particular deployment中复写的组件
5、MOCK [40]用于在测试中使用到的对象
以下两个注解提供了组件在部署过程中的更多控制功能:
1、@BypassInterceptors:让Seam拦截在某个个类或者方法上失效
2、@Startup在相应的scope中初始化组件,让其生效
通过了解以上部分,你就可以扩展任何组件,不管是Seam内置的组件还是第三方提供的框架或程序。
扩展Identity对象
作为示例,我将向你展示,如何扩展内置的Identity对象,让其能够支持自定义的JAAS登录模块...
As example I’ll show you how to extend built-in identity object to support custom JAAS Login Module that requires custom callback handler to be used to obtain/provide further information. This particular implementation adds functionality to support NTLM as other authentication method (together with customized jCIFS library) and NTLM support iself is not part of this code snapshot.
@Name(”org.jboss.seam.security.identity”)
@Scope(SESSION)
@Install(precedence = APPLICATION)
@BypassInterceptors
@Startup
public class NTLMIdentity extends Identity {
//
// custom code
//
@Override
public String login() {
try {
retrieveNTLMAuthenticationDetails();
} catch (LoginException le) {
log.error(”Unable to retrieve NTLM authentication details!”, le);
return null;
}
}
@Override
protected CallbackHandler getDefaultCallbackHandler() {
return new CallbackHandler() {
public void handle(Callback[] callbacks)
throws IOException, UnsupportedCallbackException {
for (int i = 0; i < callbacks.length; i++) {
if (callbacks[i] instanceof NameCallback) {
((NameCallback) callbacks[i]).setName(getUsername());
} else if (callbacks[i] instanceof PasswordCallback) {
((PasswordCallback) callbacks[i]).setPassword(getPassword() != null ?
getPassword().toCharArray() : null);
} else if (callbacks[i] instanceof SFSIdentityCallbackHandler) {
processSFSCallbackHandler((SFSIdentityCallbackHandler) callbacks[i]);
} else {
throw new UnsupportedCallbackException(callbacks[i], “Unsupported callback”);
}
}
}
};
}
//
// custom code
//
}
这里@Name注解覆盖了Seam内置的Identity组件名称,并且给他比BUILT_IN更高的优先级。所以当你运行程序的时候,#{identity}和Identity.instance()将调用NTLMIdentity对象。
分享到:
相关推荐
**JBoss Seam组件中文手册** **一、Seam框架概述** Seam是一个开源的企业级Java框架,由JBoss公司开发,旨在简化Java EE应用程序的开发。它将多种技术如JavaServer Faces (JSF),Java Persistence API (JPA),EJB 3...
4. 编写Seam组件:Seam组件是应用程序的核心部分,它们可以是JSF页面上的UI组件,也可以是业务逻辑层的服务组件。通过使用`@Name`注解来定义组件名,`@In`和`@Out`注解来注入和暴露依赖。 5. 创建JSF页面:Seam与...
通过学习和理解Seam,开发者可以更有效地构建可扩展、可维护的Java EE应用,利用其强大的上下文相关组件模型和事件驱动架构,提高开发效率,减少代码的复杂性。无论是对于企业级应用开发还是个人项目,Seam都是一个...
- **第5章:Seam组件描述符**:介绍如何使用 Seam 组件描述符来定义组件的行为和配置。 - **第6章:绝对控制反转**:详细介绍 Seam 的绝对控制反转机制,以及它如何优化组件间的依赖管理。 ### 三、Seam的特点与...
Seam与JSF的结合,通过Seam组件,可以轻松处理复杂的数据绑定和事件处理,提高了UI开发的效率。 Seam中的EJB支持则允许开发者利用Enterprise JavaBeans进行业务逻辑处理。Seam简化了EJB的使用,不需要繁琐的接口和...
- **Component Context**:管理Seam组件的实例,确保每个请求或会话有独立的组件实例。 - **Event Context**:处理事件的发布和订阅,允许组件之间的通信。 **2. 依赖注入(Dependency Injection, DI)** Seam的DI...
此外,Seam还扩展了JSF的功能,提供了更多定制化和高级的组件,以满足复杂应用的需求。 ##### 2. 支持EJB 3.0但也可以独立于EJB 尽管Seam紧密集成了EJB 3.0,但它并不强制使用EJB 3.0。这意味着开发者可以选择使用...
1. **代码理解**:重点介绍了如何定义业务流程,并将其与Seam组件关联起来。 2. **工作原理**:深入探讨了Seam与jBPM之间的交互机制,以及如何利用Seam的特性来增强工作流的灵活性和易用性。 ##### 1.5 Seam页面流...
首先,Seam提供了组件模型,允许开发者将应用拆分为小而独立的部分,每个部分都称为一个Seam组件。这些组件可以很容易地进行交互和组合,降低了复杂性。通过使用 Seam的注解驱动编程,如`@Name`和`@In`,可以轻松地...
- 组件模型:Seam组件是可注入、可管理的对象,支持声明式依赖注入。 - 事件处理:Seam提供了一种强大的事件发布和订阅机制,允许组件之间通过事件进行通信。 - 集成性:与JSF、EJB、Hibernate等Java EE技术无缝集成...
Seam将Java EE 5.0组件与JSF托管bean紧密集成,即使不使用Java EE 5.0,也可以选择POJO作为Seam组件,这种灵活性使得Seam适用于更多场景。 #### 3. AJAX支持 Seam支持多个开源JSF AJAX库,如JBoss RichFaces和JBoss...
#### 四、Seam组件配置 ##### 配置方式 - **通过属性设置**: 在组件类中直接定义属性值。 - **通过components.xml文件**: 更灵活地配置组件行为,无需修改源代码。 - **细粒度配置文件**: 为特定组件或组件组提供...
- **定义与作用**:Seam组件描述符是对组件行为的一种描述方式,它定义了组件如何被创建、配置以及与其他组件交互。 - **配置示例**:通常通过XML文件或者注解的方式来进行配置。 - **高级特性**:支持自定义事件...
除此之外,Seam UI组件扩展了JSF的功能,提供了一系列高级组件和功能,如数据绑定、国际化、验证和转换等。这些组件通常以`.jar`文件形式存在,例如`seam-components.jar`,包含了各种UI相关的组件和工具。 还有...
Seam与JSF的整合进一步强化了UI层的开发效率,它提供了更好的事件处理机制,使得JSF组件可以直接与Seam组件交互,降低了数据绑定的复杂性。 在Seam中,JSF和Hibernate的整合主要体现在以下几个方面: 1. **数据...
5. 编写必要的配置文件,如faces-config.xml、persistence.xml等,以连接数据库和配置Seam组件。 6. 运行工程,Seam会自动处理依赖注入和事件处理,你可以通过浏览器查看和测试JSF页面。 **总结** "Eclipse工程的...
Seam是一个强大的Java EE框架,它集成了多种技术,如JavaServer Faces (JSF)、Enterprise JavaBeans (EJB)、Java Persistence API (JPA)以及 Seam自身的组件模型,旨在简化企业级应用的开发过程,提高开发效率。...
它在Seam组件描述符中声明。 10. JSF登录表单创建:创建原生的JSF登录表单,将凭证绑定到表单输入,并将表单动作与身份组件的登录方法进行有线连接。Seam还内置了“记住我”的支持功能,简化了登录过程。 在设计和...
2. **JSF集成**:学习如何将Seam与JSF整合,包括使用Seam的增强JSF组件,如richfaces,以及如何在JSF页面中访问和操作Seam组件。 3. **EJB集成**:探索如何利用Seam轻松地在JSF页面中调用EJB服务,以及如何处理EJB...