之前和打倒小日本做项目的时候,用seam,曾经定过一条规则,Service/Manager/DAO这个层面上由于组件数量不是特别多,所以组件命名不需要空间前缀,但是对于action层面的组件,由于可能很多,所以按功能模块划分命名空间,例如:
@Compoenent("treasure.selector"),@Component("store.main")等等,在Seam的支持下,在页面上写表达式语言的时候,没有任何问题,例如#{store.main.entity.name}
后来在某环境下,不用seam,用Spring了,发现如下的代码会有问题:
@Component("auth.main")//Spring的Annotation
public class MainAction{........}
在页面上用#{auth.main.xx}这样的表达式的时候,会出现找不到对象的错误。跟代码发现Spring提供的SpringBeanFacesELResolver里面解析的时候,先解析"auth",找不到,于是后面就解析不下去了。
问题的关键点在于这个EL解析器。Seam的ELResolver能够正确解析带命名空间的组件,而Spring的这个不行。
于是,扩展之。
首先第一步是要让系统知道有哪些命名空间,这里用了Spring的一个接口,叫做BeanFactoryPostProcesser,看名字应该能看的出来,和我们常用的BeanPostProcess道理一样,只不过实现了BeanFactoryPostProcesser接口的组件会在整个beanFactory初始化之前和之后调用。
看代码:
@Component
public class BeanNamespacePostProcesser implements BeanFactoryPostProcessor {
@Override
public void postProcessBeanFactory(
ConfigurableListableBeanFactory beanFactory) throws BeansException {
String[] beanNames = beanFactory.getBeanDefinitionNames();
for(String beanName : beanNames){
if(beanName.indexOf('.') == -1)
continue;
else{
String[] terms = beanName.split("\\.");
Namespace space = Namespace.rootNamespace;
for(int i = 0;i<terms.length - 1; i++){
space = space.getOrCreateChild(terms[i]);
}
}
}
}
}
这样,在系统启动的时候分析所有的bean的名字,把命名空间记录下来。
然后,创建一个ELResolver,让他能够解析命名空间:
public class JSFELResolver extends SpringBeanFacesELResolver {
@Override
public Object getValue(ELContext elContext, Object base, Object property) throws ELException {
if (base == null) {
return resolveBase(elContext, property);
} else if (base instanceof Namespace) {
return resolveInNamespace(elContext, (Namespace) base, property);
}else {
return null;
}
}
private Object resolveInNamespace(ELContext elContext, Namespace base,
Object property) {
Object result = base.get((String) property);
elContext.setPropertyResolved(true);
return result;
}
private Object resolveBase(ELContext elContext, Object property) {
if(this.getWebApplicationContext(elContext).containsBean(property.toString())){
elContext.setPropertyResolved(true);
return this.getWebApplicationContext(elContext).getBean(property.toString());
}else{
Object result = Namespace.rootNamespace.get(property.toString());
if(result != null)
elContext.setPropertyResolved(true);
return result;
}
}
}
在JSF的配置文件中启用这个ELResolver:
<el-resolver>el.JSFELResolver</el-resolver>
这样,就可以在页面上用表达式引用带命名空间的组件了。
分享到:
相关推荐
它可以访问JavaBeans属性,执行方法,并且可以与JSF组件属性结合使用。例如,`#{bean.property}`可以获取或设置JavaBean的属性值。 **5. JSF和Java Servlets** 尽管JSF提供了一种更高级别的抽象,但其底层仍然依赖...
标题中的“jsf2(primefaces3)+spring+hibernate案例下载”指的是一个集成应用,使用了JavaServer Faces 2.0 (JSF 2.0),PrimeFaces 3,Spring框架以及Hibernate ORM技术。这个案例可能是为了教学或者演示如何在...
创建一个名为`login.xhtml`的新文件,在这个文件中,我们将定义登录表单的HTML结构以及JSF组件。这些组件包括`h:inputText`(用于输入用户名)和`h:password`(用于输入密码),以及一个`h:commandButton`作为提交...
JSF将是J2EE5.0中所包含的web开发框架,这应该是第一个成为jcp标准,并且随j2eesdk一起发布的web框架,...在myeclipse 4.0GA中新建一个web项目,命名为hello,为项目增加对JSTL的支持: 在JSTL的版本中选择1.1。
6.8.4. 在Spring应用中使用AspectJ加载时织入(LTW) 6.9. 更多资源 7. Spring AOP APIs 7.1. 简介 7.2. Spring中的切入点API 7.2.1. 概念 7.2.2. 切入点运算 7.2.3. AspectJ切入点表达式 7.2.4. 便利的切入...
- **支持@AspectJ风格的切面**:除了Spring的原生AOP之外,还支持使用@AspectJ注解来定义切面,增强了与传统AspectJ代码的兼容性。 - **支持bean name pointcut元素**:新增了基于bean名称的pointcut,便于在AOP中...
6.8.4. 在Spring应用中使用AspectJ加载时织入(LTW) 6.9. 更多资源 7. Spring AOP APIs 7.1. 简介 7.2. Spring中的切入点API 7.2.1. 概念 7.2.2. 切入点运算 7.2.3. AspectJ切入点表达式 7.2.4. 便利的切入...
- 使用 Spring 的 IoC 容器可以轻松实现组件之间的解耦。 - **2.2 框架模块** - **2.2.1 核心容器** - 包括核心、Beans、上下文和表达式语言模块,是整个框架的基础。 - 核心容器负责管理 Bean 的生命周期,...
- **Maven依赖管理**:使用Maven作为构建工具时,可以通过添加依赖项到pom.xml文件中来引入Spring框架和其他相关库。 - **Maven "Bill Of Materials" (BOM) 依赖**:这是一种便捷的方法,通过引入BOM可以自动解决...
- **Java EE 6 和 7 支持(Java EE 6 and 7):** 支持最新的Java EE标准,包括JSF、EJB、JPA等。 - **Groovy Bean Definition DSL(Groovy Bean Definition DSL):** 使用Groovy语言定义Bean配置。 - **核心容器...
3.10 Spring中的AspectJ加载时织入aspect 140 3.10.1 问题 140 3.10.2 解决方案 141 3.10.3 工作原理 141 3.11 在Spring中配置AspectJ aspect 146 3.11.1 问题 146 3.11.2 解决方案 146 3.11.3 工作...
虽然只是小版本的升级,但对于希望在JSF应用中使用HTML5技术的开发人员而言,JSF 2.2带来的更新很重要,尤其是pass through能力,它允许在JSF组件不知情的情况下传递HTML属性。 HTML5中增加了很多新特性,其中有些...
- **支持AspectJ运行时织入**:除了编译期织入,Spring 2.5还支持运行时织入,这使得在不修改源代码的情况下添加或更改AOP行为成为可能。 ### 中间层 Spring框架在中间层方面的更新主要集中在事务管理和数据访问上...
- **JMX支持**:集成了Java Management Extensions,便于管理和监控运行时的Spring应用。 - **Spring应用上下文作为JCA适配器部署**:支持将Spring应用上下文作为JCA适配器部署到企业应用服务器中。 - **任务调度**...
4. **Java EE 6 和 7**:增强了与 Java EE 标准的兼容性,包括 CDI、JSF、JPA 等技术的支持。 5. **Groovy Bean Definition DSL**:提供了基于 Groovy 语言的配置 DSL,使配置更加灵活多样。 6. **核心容器改进*...
- **支持AspectJ运行时织入**:通过使用AspectJ的运行时织入机制,可以在不修改源代码的情况下添加横切关注点。 **2.4 中间层** - **简化XML中的声明式事务配置**:提供了更简单的XML配置选项来管理事务。 - **...
3.10 Spring中的AspectJ加载时织入aspect 140 3.10.1 问题 140 3.10.2 解决方案 141 3.10.3 工作原理 141 3.11 在Spring中配置AspectJ aspect 146 3.11.1 问题 146 3.11.2 解决方案 146 3.11.3 工作...