我这里的Seam项目使用war方式部署,所以seam的action是POJO而不是EJB。
下面是最终的使用效果,在类上添加自定义的@MySeam, 在需要控制的Field上添加自定义的@SuperString
@Name("productAction")
@MySeam
public class ProductAction {
@SuperString
String name;
@SuperString(postfix="-product")
String product;
... ...
}
下面说说具体怎么做,先写一个Interceptor如下例
import org.jboss.seam.annotations.intercept.AroundInvoke;
import org.jboss.seam.annotations.intercept.Interceptor;
import org.jboss.seam.security.SecurityInterceptor;
import org.jboss.seam.core.EventInterceptor;
import org.jboss.seam.core.MethodContextInterceptor;
import org.jboss.seam.intercept.AbstractInterceptor;
import org.jboss.seam.intercept.InvocationContext;
import org.jboss.seam.util.Reflections;
/**
* MySeamInterceptor will be invoke
* before MethodContextInterceptor, EventInterceptor
* after SecurityInterceptor
*/
@Interceptor(around = {
MethodContextInterceptor.class,
EventInterceptor.class,
},
within = SecurityInterceptor.class
)
public class MySeamInterceptor extends AbstractInterceptor {
private static final long serialVersionUID = -3064515871691261357L;
private static final LogProvider log = Logging.getLogProvider(MySeamInterceptor.class);
private boolean reentrant; //OK, since all Seam components are single-threaded
@AroundInvoke
public Object aroundInvoke(InvocationContext invocation) throws Exception {
if (reentrant) {
if (log.isTraceEnabled()) {
log.trace("reentrant call to component: " + getComponent().getName());
}
return invocation.proceed();
} else {
reentrant = true;
try {
//Component component = getComponent();
changeStringValue(invocation.getTarget());
// you can add more method in here.
return invocation.proceed();
} finally {
reentrant = false;
}
}
}
private void changeStringValue(Object target) {
Field[] fieldArray = target.getClass().getDeclaredFields();
for (Field field : fieldArray) {
if (!field.isAccessible()) {
field.setAccessible(true);
}
if (field.isAnnotationPresent(SuperString.class)) {
SuperString superStr = field.getAnnotation(SuperString.class);
String newValue = System.currentTimeMillis() + superStr.postfix();
setFieldValue(field, target, newValue);
}
}
}
/**
* Set field value.
* @param field The value will be set for this field
* @param target The field belongs to this object
* @param value The field's value
*/
private void setFieldValue(Field field, Object target, Object value) {
try {
Reflections.set(field, target, value);
} catch (Exception e) {
throw new IllegalArgumentException("MySeamInterceptor.setFieldValue(): " +
target.getClass() + "; field: " + field.getName(), e);
}
}
}
继承AbstractInterceptor是比较容易的方式,@AroundInvoke是必须的。
这里的逻辑很简单:在所有标注了@MySeam的类中,寻找标注了@SuperString的Field,并给其赋值。
为了使用MySeamInterceptor,我们需要为它定义一个Annotation,如下:
import org.jboss.seam.annotations.intercept.Interceptors;
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Interceptors(MySeamInterceptor.class)
public @interface MySeam {
}
最后是@SuperString,这个就不多说了。
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface SuperString {
String postfix() default "-super";
}
分享到:
相关推荐
《JSF标签》简体中文版.pdf涵盖了JSF的各种组件、转换器、验证器以及与后台数据交互的方法,有助于提升开发者在JSF项目中的效率。 **4. A4J (Ajax for JSF)** A4J 是一个扩展JSF的库,提供了一套AJAX支持,允许...
- **在Jboss4.0下使用Seam**: - **安装JBoss4.0**:确保 JBoss 版本兼容。 - **安装JSF1.2RI**:满足 SEAM 的运行环境要求。 #### 四、上下文相关的组件模型 - **Seam上下文**: - **无状态上下文**:适用于一...
Seam入门部分介绍了如何在不同的服务器环境中部署和运行Seam应用实例,包括JBoss AS和Tomcat服务器。 **1.1.1 在JBoss AS上运行示例** 在JBoss AS上部署和运行Seam应用,首先需要确保JBoss AS服务器已经正确安装并...
Seam拦截器提供了一个统一的编程模型,能够将JSF、EJB、JPA等技术整合在一起,提供了一个强大且灵活的开发环境。 Seam异常处理 Seam异常处理是一个基于异常处理的编程模型,能够帮助开发者快速构建企业级应用程序...
seam 中文文档 pdf 格式 JSF+EJB3.0快速开发框架Seam的中文版向导。。。
- **拦截器**:在 Seam 中,拦截器被用来增强组件的行为,如权限检查、日志记录等。 - **组件名字**:每个 Seam 组件都需要有一个唯一的名称,以便于引用和配置。 - **定义组件作用域**:通过配置文件或注解,可以...
1. **Faces Context增强**: 在Seam 2.0中,对JSF的Faces Context进行了扩展,提供了更多的上下文信息和操作。 2. **CDI支持**: 虽然Seam 2.0发布时,Contexts and Dependency Injection (CDI)规范还未正式发布,但...
在这个“seam需要的jar包”压缩包中,包含了运行和开发Seam应用程序所需的各种库文件。 首先,Seam框架的核心依赖于JSF,这是Java EE中的一个用户界面组件框架,用于构建交互式Web应用。JSF提供了模型-视图-控制器...
在Seam框架中,注解和标签起着至关重要的作用,它们简化了代码并增强了可读性。下面我们将详细讨论Seam中的注解以及与之相关的标签。 1. **Seam注解** - `@Name`: 这是Seam的核心注解,用于为组件定义一个唯一的...
7. **国际化与本地化**:Seam支持多语言环境,对于中英文双语版本的书籍,这为开发者提供了跨越语言障碍的便利,帮助全球的开发者理解和使用Seam框架。 8. **测试支持**:Seam提供了一套完整的测试工具,包括单元...
此外,Seam还支持CDI,这使得开发者可以利用更多的Java EE特性,如拦截器和异步处理。 总之,拥有《Seam In Action》、《JBoss Seam》和《官方中文指南》这些资源,开发者可以系统地学习和精通Seam框架,从而在企业...
6. **国际化与本地化**:学习如何在Seam项目中实现多语言支持。 7. **测试与调试**:掌握Seam的测试工具和策略,确保代码质量。 8. **Seam组件**:了解如Conversation、Transactions、邮件服务等Seam内置组件的使用...
在Seam Security中,可以基于JAAS进行自定义配置以满足特定需求。 6. 安全需求:Seam Security的设计目标是让设置变得简单,易于管理,并确保应用程序不会因为安全性扩展而变得过于复杂,即应用程序不应该因安全...
这是Seam启动的基础,监听器会在JSF的生命周期中插入Seam特有的行为,比如对话管理。Seam通过这个监听器能够增强JSF的各个阶段,并引入CONVERSATION生命周期,这是Seam的一个核心特性。 ```xml ...
- **拦截器**: 为组件提供额外的行为扩展点,如日志记录、安全性检查等。 - **组件命名规则**: 为了确保组件名称的唯一性和易于识别,Seam定义了一套规范化的命名机制。 ##### 组件范围定义 - **定义组件作用域**: ...
在这个“seam级联菜单例子”中,我们将深入探讨如何在Seam应用中实现级联选择菜单,这种菜单在用户界面中常见于如国家/地区、省份/城市等层级结构的选择。 级联菜单通常涉及到Ajax技术,它允许部分页面更新而不是...
- **高级特性**:支持自定义事件、拦截器等功能。 4. **绝对反转控制(Absolute Inversion of Control)** - **概念解释**:AIOC是一种更高级的依赖注入模式,在Seam中允许组件在运行时动态决定其依赖关系。 - **...
这份资料提供了丰富的示例代码和项目,通过这些实例,开发者可以深入理解Seam的工作原理以及如何在实际项目中应用它。这种方法能够确保理论与实践相结合,使学习过程更加高效。 #### 四、核心特性详解 - **组件模型...
seam下一代web开发框架