`

Spring结合JSF使用时的组件命名支持

阅读更多
之前和打倒小日本做项目的时候,用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>

这样,就可以在页面上用表达式引用带命名空间的组件了。
分享到:
评论

相关推荐

    jsf框架入门视频资料

    它可以访问JavaBeans属性,执行方法,并且可以与JSF组件属性结合使用。例如,`#{bean.property}`可以获取或设置JavaBean的属性值。 **5. JSF和Java Servlets** 尽管JSF提供了一种更高级别的抽象,但其底层仍然依赖...

    jsf2(primefaces3)+spring+hibernate案例下载

    标题中的“jsf2(primefaces3)+spring+hibernate案例下载”指的是一个集成应用,使用了JavaServer Faces 2.0 (JSF 2.0),PrimeFaces 3,Spring框架以及Hibernate ORM技术。这个案例可能是为了教学或者演示如何在...

    JSF登录的实例 Eclipse

    创建一个名为`login.xhtml`的新文件,在这个文件中,我们将定义登录表单的HTML结构以及JSF组件。这些组件包括`h:inputText`(用于输入用户名)和`h:password`(用于输入密码),以及一个`h:commandButton`作为提交...

    JSF2.0快速入门的基本教程.ppt

    JSF将是J2EE5.0中所包含的web开发框架,这应该是第一个成为jcp标准,并且随j2eesdk一起发布的web框架,...在myeclipse 4.0GA中新建一个web项目,命名为hello,为项目增加对JSTL的支持: 在JSTL的版本中选择1.1。

    Spring中文帮助文档

    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. 便利的切入...

    Spring2.5.6 参考文档

    - **支持@AspectJ风格的切面**:除了Spring的原生AOP之外,还支持使用@AspectJ注解来定义切面,增强了与传统AspectJ代码的兼容性。 - **支持bean name pointcut元素**:新增了基于bean名称的pointcut,便于在AOP中...

    Spring API

    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. 便利的切入...

    第十四章 开发JSF应用.pdf

    在受管Bean中定义的方法可以被用来响应JSF组件触发的事件。这些方法通常使用`@ManagedProperty`注解与组件绑定,并通过`@PostConstruct`注解初始化。 ##### 14.5.2 基于导航规则的命令按钮action 通过在JSP页面中...

    Spring Framework Reference Documentation

    - 使用 Spring 的 IoC 容器可以轻松实现组件之间的解耦。 - **2.2 框架模块** - **2.2.1 核心容器** - 包括核心、Beans、上下文和表达式语言模块,是整个框架的基础。 - 核心容器负责管理 Bean 的生命周期,...

    spring-framework-reference4.3.1

    - **Maven依赖管理**:使用Maven作为构建工具时,可以通过添加依赖项到pom.xml文件中来引入Spring框架和其他相关库。 - **Maven "Bill Of Materials" (BOM) 依赖**:这是一种便捷的方法,通过引入BOM可以自动解决...

    Spring4.X最新帮助文档带视图结构树的

    - **Java EE 6 和 7 支持(Java EE 6 and 7):** 支持最新的Java EE标准,包括JSF、EJB、JPA等。 - **Groovy Bean Definition DSL(Groovy Bean Definition DSL):** 使用Groovy语言定义Bean配置。 - **核心容器...

    Spring攻略(第二版 中文高清版).part1

    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 工作...

    jboss as 7 support jsf2.2.1 modules

    虽然只是小版本的升级,但对于希望在JSF应用中使用HTML5技术的开发人员而言,JSF 2.2带来的更新很重要,尤其是pass through能力,它允许在JSF组件不知情的情况下传递HTML属性。 HTML5中增加了很多新特性,其中有些...

    spring-reference2.5pdf

    - **支持AspectJ运行时织入**:除了编译期织入,Spring 2.5还支持运行时织入,这使得在不修改源代码的情况下添加或更改AOP行为成为可能。 ### 中间层 Spring框架在中间层方面的更新主要集中在事务管理和数据访问上...

    spring2.5.pdf

    - **JMX支持**:集成了Java Management Extensions,便于管理和监控运行时的Spring应用。 - **Spring应用上下文作为JCA适配器部署**:支持将Spring应用上下文作为JCA适配器部署到企业应用服务器中。 - **任务调度**...

    spring-framework-reference-4.0.1

    4. **Java EE 6 和 7**:增强了与 Java EE 标准的兼容性,包括 CDI、JSF、JPA 等技术的支持。 5. **Groovy Bean Definition DSL**:提供了基于 Groovy 语言的配置 DSL,使配置更加灵活多样。 6. **核心容器改进*...

    spring reference2.5

    - **支持AspectJ运行时织入**:通过使用AspectJ的运行时织入机制,可以在不修改源代码的情况下添加横切关注点。 **2.4 中间层** - **简化XML中的声明式事务配置**:提供了更简单的XML配置选项来管理事务。 - **...

    Spring攻略(第二版 中文高清版).part2

    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 工作...

Global site tag (gtag.js) - Google Analytics