`
mozhenghua
  • 浏览: 319498 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

spring自定义标签实现 之一对多实体解析

阅读更多

       通过上一篇博客(http://mozhenghua.iteye.com/blog/1830842),我们了解到了如何通过spring来解析如下,只有一个子标签(一对一实体关系)的需求

 

<tsearcher:parent id="testparent">  
        <tsearcher:child name="alex" age="12"/>
</tsearcher:parent> 

 

    那么如果子标签如果有n个(上不封顶)的话(一对多实体关系)有应该如何解析呢?标签如下:

    <tsearcher:parent id="testparent">  
        <tsearcher:child name="alex" age="12"/>
        <tsearcher:child name="joe" age="11"/>
        <tsearcher:child name="kid"  age="13"/>  
    </tsearcher:parent>  

 

首先,创建Parent和Child类,给标签映射时使用。

   

public class Child {
	private String name;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Child() {
		super();
	}
}

 

public class Parent {
	private Map<String,Child> child;
	public Map<String, Child> getChild() {
		return child;
	}
	public void setChild(Map<String, Child> child) {
		this.child = child;
	}
}

 

 Parent中的属性是Map<String,Child>类型的,key是Child的name,value就是Child类型。

以下就是解析Parent标签的解析器代码:

import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.RuntimeBeanReference;
import org.springframework.beans.factory.config.TypedStringValue;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.ManagedMap;
import org.springframework.beans.factory.xml.AbstractSimpleBeanDefinitionParser;
import org.springframework.beans.factory.xml.ParserContext;
import org.springframework.util.StringUtils;
import org.springframework.util.xml.DomUtils;
import org.w3c.dom.Element;
import org.w3c.dom.Node;

public class ParentParser extends AbstractSimpleBeanDefinitionParser {
	protected void doParse(Element element, ParserContext parserContext,
			BeanDefinitionBuilder builder) {
		try {
			builder.addPropertyValue("child", parseMapElement(element,
					parserContext, builder));
		} catch (Exception e) {
			parserContext.getReaderContext()
					.error(
							"class " + Parent.class.getName()
									+ " can not be create", element, e);
		}
	}

	@SuppressWarnings("all")
	public Map parseMapElement(Element mapEle, 
			ParserContext parserContext, BeanDefinitionBuilder builder) {

		List entryEles = DomUtils.getChildElementsByTagName(mapEle, "child");
                // 关键是以下这个ManagedMap类型,充当着一个map类型的beandefinition类型的说明对象
		ManagedMap map = new ManagedMap(entryEles.size());
		map.setMergeEnabled(true);
		map.setSource(parserContext.getReaderContext().extractSource(mapEle));

		for (Iterator it = entryEles.iterator(); it.hasNext();) {
			Element entryEle = (Element) it.next();
	
			String name = entryEle.getAttribute("name");

			map.put(key, parserContext.getDelegate().parseCustomElement(
					entryEle, builder.getRawBeanDefinition()));

		}

		return map;
	}

	@Override
	protected Class<Parent> getBeanClass(Element element) {
		return Parent.class;
	}

}

 以下就是解析Child的解析器:

import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.xml.AbstractSimpleBeanDefinitionParser;
import org.springframework.beans.factory.xml.ParserContext;
import org.w3c.dom.Element;

public class ChildParser extends AbstractSimpleBeanDefinitionParser {

	@Override
	protected void doParse(Element element, ParserContext parserContext,
			BeanDefinitionBuilder builder) {

		super.doParse(element, parserContext, builder);

		builder.addPropertyValue("name", element.getAttribute("name"));
		builder.addPropertyValue("age", Integer.parseInt(element
				.getAttribute("age")));
	}

	@Override
	protected Class<Child> getBeanClass(Element element) {
		return Child.class;
	}

}

 以上只给出parent和client类的相关代码,如果要了解如何将这些类是怎么配置的,请查阅上一篇博客(http://mozhenghua.iteye.com/blog/1830842

分享到:
评论

相关推荐

    SpringCloud-Demo:springcloud演示

    自定义注解实现实体类参数校验 添加mybatis自定生成映射实体类、mapper等 添加全局异常处理 添加fegin自定义数据解析 20180907 添加注解,作为参数校验入口 20180910 解决服务之间调用fegin+hystrix 熔断异常拦截...

    Spring面试题

    组成 Spring 框架的每个模块(或组件)都可以单独存在,或者与其他一个或多个模块联合实现。每个模块的功能如下: ☆ 核心容器:核心容器提供 Spring 框架的基本功能。核心容器的主要组件是 BeanFactory,它是工厂...

    Spring in Action(第2版)中文版

    5.5.2创建一个实体管理器工厂 5.5.3建立使用jpa的dao 5.6spring和ibatis 5.6.1配置ibatis客户模板 5.6.2建立基于ibatis的dao 5.7缓存 5.7.1配置缓存方案 5.7.2缓存的代理bean 5.7.3注解驱动的缓存 5.8小结 ...

    Spring in Action(第二版 中文高清版).part2

    第一部分 Spring的核心 第1章 开始Spring之旅 1.1 Spring是什么 1.2 开始Spring之旅 1.3 理解依赖注入 1.3.1 依赖注入 1.3.2 DI应用 1.3.3 企业级应用中的依赖注入 1.4 应用AOP 1.4.1 AOP介绍 1.4.2 AOP...

    Spring in Action(第二版 中文高清版).part1

    第一部分 Spring的核心 第1章 开始Spring之旅 1.1 Spring是什么 1.2 开始Spring之旅 1.3 理解依赖注入 1.3.1 依赖注入 1.3.2 DI应用 1.3.3 企业级应用中的依赖注入 1.4 应用AOP 1.4.1 AOP介绍 1.4.2 AOP...

    本项目实现了对hql集合进行静态分析,获取hql对应的血缘图(表血缘 + 字段血缘)

    在数据仓库建设中,经常会使用到数据血缘追中方面的功能,本项目实现了对hql集合进行静态分析,获取hql对应的血缘图(表血缘 + 字段血缘);删除hive-exec与hadoop-common的maven依赖,使得项目更加的轻量级。重构...

    HiveSqlBloodFigure:hive血缘关系解析工具

    规范化接口输入输出,血缘图均为自定义实体,方便进行JSON序列化。 新增接口层,方便Spring的注入,同时也提供静态方式调用。 下个版本升级内容 引入JDBC获取元数据信息,使血缘图更加丰富,同时可以解决Sql中有...

    java面试题

    答:Servlet与CGI的区别在于Servlet处于服务器进程中,它通过多线程方式允许其service方法,一个实例可以服务于多个请求,并且其实例一般不会被销毁,而CGI对每个请求都产生新的进程,服务完后就销毁,所以效率上...

    asp.net知识库

    关于能自定义格式的、支持多语言的、支持多数据库的代码生成器的想法 发布Oracle存储过程包c#代码生成工具(CodeRobot) New Folder XCodeFactory3.0完全攻略--序 XCodeFactory3.0完全攻略--基本思想 XCodeFactory...

    Java EE常用框架.xmind

    2,cascade属性表示与此实体一对一关联的实体的级联样式类型。 3,fetch属性是该实体的加载方式,默认为即时加载EAGER 4,optional属性表示关联的该实体是否能够存在null值,默认为ture,如果设置为false,则该实体不...

    JAVA上百实例源码以及开源项目

    5个目标文件,演示Address EJB的实现,创建一个EJB测试客户端,得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化的上下文,用client的getHome()函数调用Home接口...

    JAVA上百实例源码以及开源项目源代码

    5个目标文件,演示Address EJB的实现,创建一个EJB测试客户端,得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化的上下文,用client的getHome()函数调用Home接口...

    J2EE应用开发详解

    124 8.5.2 拦截器的实现原理 124 8.5.3 Struts2的内置拦截器 124 8.5.4 拦截器的配置和使用 125 8.5.5 自定义拦截器 126 8.6 一个简单的Struts2应用 130 8.7 小结 140 第9章 JSF 141 9.1 JSF技术简介 141 9.1.1 JSF...

    达内java培训目录

    JavaSE核心 异常处理、多线程基础、IO系统、网络编程、Java反射机制、JVM性能调优(JVM内存结构剖析、GC分析及调优、JVM内存参数优化)、Java泛型、JDK新特性 熟练掌握JavaSE核心内容,特别是IO和多线程;...

    kellerMapper.jar

    SqlFieldReader.java:Sql 字段解析类,用于解析实体类中的自定义注解,为生成 Sql 语句服务 TypeCaster.java:类型转换,用于将 Java 中的数据类型转换成相应的 MySql 数据类型 util:工具类相关 Console.java...

    Java语言基础下载

    映射多对一多态关联 702 内容总结 705 独立实践 705 第三十六章:HQL介绍 706 学习目标 706 HQL的出现 707 进入HQL世界 707 聚合 708 分组 709 在Java中使用HQL 709 内容总结 712 独立实践 712 第三十七章 Spring...

    基于JavaScript的数据可视化实验室后台管理系统源码+项目说明(期末大作业).zip

    最后在spring-mvc配置文件中配置参数解析器,直接在controller类中需要用这个注解的方法or参数上添加注解就可以自动验证token。 1.2 分页功能 * 后端按照前端的需求将分页所需数据查询出来。后端只需要提供总页数...

Global site tag (gtag.js) - Google Analytics