08_Spring自定义标签
【 项目工程 】
【 Person.java 模型类 】
package com.spring.selfxml.model; /**
* Created by HigginCui on 2018/9/9.
*/
public class Person { private int age; private String name; public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} @Override
public String toString() {
return "Person{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
}
【 自定义的person.xsd文件 】
<xsd:schema
xmlns="http://higgin.com/schema"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://higgin.com/schema">
<xsd:complexType name="complexType1">
<xsd:attribute name="name" type="xsd:string">
<xsd:annotation>
<xsd:documentation><![CDATA[ The elementname1 name. ]]></xsd:documentation>
</xsd:annotation>
</xsd:attribute>
<xsd:attribute name="age" type="xsd:int">
<xsd:annotation>
<xsd:documentation><![CDATA[ The elementname1 age. ]]></xsd:documentation>
</xsd:annotation>
</xsd:attribute>
</xsd:complexType> <xsd:element name="elementname1" type="complexType1">
<xsd:annotation>
<xsd:documentation><![CDATA[ elementname1的文档 ]]></xsd:documentation>
</xsd:annotation>
</xsd:element>
</xsd:schema>
[ 说明 ]
1.定义targetNamespace="http://higgin.com/schema"中,targetNamespace表示目标命名空间,xmlns的值要和这个相同
2.xsd:element定义的就是待会会在xml文件中用到的元素,例如<dubbo:application>中的application。
3.xsd:attribute定义的就是模型中的属性,例如<dubbo:application name="xxx">中的name,并且可以指定属性类型,进而起到检测的作用
【 spring.schemas文件 】
作用:该文件用来指定xsd文件的位置
http\://higgin.com/schema/person.xsd=META-INF/person.xsd
spring.schemas文件中的http://http/://higgin.com/schema/与person.xsd文件中的targetName相同。
【 PersonBeanDefinitionParser.java解析器 】
作用:用来解析自定义的xml标签
package com.spring.selfxml.shcema; import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.beans.factory.xml.BeanDefinitionParser;
import org.springframework.beans.factory.xml.ParserContext;
import org.w3c.dom.Element; /**
* Created by HigginCui on 2018/9/9.
*/
public class PersonBeanDefinitionParser implements BeanDefinitionParser{ private final Class<?> beanClass; public PersonBeanDefinitionParser(Class<?> beanClass) {
this.beanClass = beanClass;
} public BeanDefinition parse(Element element, ParserContext parserContext) {
RootBeanDefinition beanDefinition = new RootBeanDefinition();
beanDefinition.setBeanClass(beanClass);
beanDefinition.setLazyInit(false);
beanDefinition.getPropertyValues().add("name", element.getAttribute("name"));
beanDefinition.getPropertyValues().add("age", element.getAttribute("age"));
BeanDefinitionRegistry beanDefinitionRegistry = parserContext.getRegistry();
//注册bean到BeanDefinitionRegistry中
beanDefinitionRegistry.registerBeanDefinition(beanClass.getName(),beanDefinition);
return beanDefinition;
}
}
【 PersonNamespaceHandler.java命名空间处理器 】
作用:主要用来注册BeanDefinition解析器。
package com.spring.selfxml.shcema; import com.spring.selfxml.model.Person;
import org.springframework.beans.factory.xml.NamespaceHandlerSupport; /**
* Created by HigginCui on 2018/9/9.
*/
public class PersonNamespaceHandler extends NamespaceHandlerSupport { public void init() {
registerBeanDefinitionParser("elementname1",new PersonBeanDefinitionParser(Person.class));
}
}
说明:通常为每一个xsd:element都要注册一个BeanDefinitionParser
【 spring.handlers文件 】
作用:用于关联命名空间处理器PersonNamespaceHandler 和person.xsd中的targetNamespace
http\://higgin.com/schema=com.spring.selfxml.shcema.PersonNamespaceHandler
说明:这里的红色部分的key即xsd文件中的targetNamespace
【 person.xml 】
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:person="http://higgin.com/schema"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://higgin.com/schema http://higgin.com/schema/person.xsd"> <person:elementname1 name="zhangsan" age="18"/> </beans>
[ 说明 ]
1. xmlns:person 的 value值是 person.xml文件中的targetNamespace
2. xmlns:person可以写成 xmlns:xxx,此时<person:elementname1 ..../>就要改成<xxx:elementname1 ....>
【 Test.java 】
package com.spring.selfxml; import com.spring.selfxml.model.Person;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; /**
* Created by HigginCui on 2018/9/9.
*/
public class Test {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("person.xml");
Person person = (Person)context.getBean(Person.class.getName());
System.out.println(person.toString());
}
}
【 运行结果 】
【 小结 】
Spring自定义xml代码的流程:
1.使用ResourceLoader将配置文件xml装在为Resource对象
2.使用BeanDefinitionReader解析配置信息:将每一个<bean>解析为一个BeanDefinition对象,然后存储到BeanDefinitionRegistry中,实际上BeanDefinitionReader调用BeanDefinitionParser进行了解析操作,解析完成后注册到BeanDefinitionRegistry。
08_Spring自定义标签的更多相关文章
- [JSP]自定义标签库taglib
自定义标签的步骤 自定义标签的步骤大概有三步: 1.继承javax.servlet.jsp.tagext.*下提供的几个标签类,如Tag.TagSupport.BodyTagSupport.Simpl ...
- [Java] JSP笔记 - 自定义标签
自定义标签的创建步骤: 自定义标签的四大功能: 自定义标签的类结构: 在 1.0 中呢, 可以将 <body-content> 的值设置为 JSP, 2.0中则不允许在自定义标签体中出现j ...
- thinkphp自定义标签库
thinkphp ~ php中 的类, 的成员变量, 本身是没有类型说明的, 那么我怎么知道它的类型呢? 或初始值呢? 通常在类定义中, 如果能给一个初始值的(对于已知简单类型的),最好给一个初始值, ...
- 12 自定义标签/JSTL标签库/web国际化/java web之设计模式和案例
EL应用 自定义一个标签,实现两个字符串的相加 1回顾 1.1servlet生命周期 init(ServletConfig) service ...
- EL函数以及自定义标签的应用
一.EL函数(调用普通类的静态方法) 编写步骤(自定义EL函数的编写步骤即自定义标签的编写步骤): ①编写一个普通的java类,提供一个静态方法,功能自定,例如下: package cn.wzbril ...
- JSTL 自定义标签
编写描述标签的tld文件,把这个文件放到web-inf/目录下,才能在jsp页面上调用自定义的标签 package test.yz; import java.io.IOException; impor ...
- 使用自定义标签模拟jstl的<c:for each>标签
一.自定义标签的基本编写 下面编写一个自定义标签,它可以输出当前的时间. 1.编写标签类 类可以通过继承SimpleTagSupport类实现一个标签类编写.父类为我们提供了一些编写自定义标签的快捷的 ...
- JSP自定义标签/自定义标签打包
有这样一个业务需求: 当我们在编辑某个用户时,需要设置该用户的角色,在转到编辑页面时,就需要自动勾选上该用户已经选择的角色,如下图: 当我们点击编辑时,会查询用户详细信息,以及角色集合传到编辑页面. ...
- JSP自定义标签
在JSP网页编程中,我们通常不满足于jstl或其他的框架,我们也可以自己写属于自己专用的标签. 在这里介绍一下表格中展示JavaBean的自定义标签的使用 第一步:写一个父标签,用来显示获取数据 新建 ...
随机推荐
- HTML attribute 与 DOM property 的对比
HTML attribute vs. DOM property 要想理解 Angular 绑定如何工作,重点是搞清 HTML attribute 和 DOM property 之间的区别. attri ...
- centos的基本命令01
01:创建用户命令 useradd liulaoshi # 创建用户 passwd liulaoshi # 设置密码, 回车后会提示让你输入两次密码 1.用户列表文件:/etc/passwd/ 2.用 ...
- python之类与对象(3)
4. 类的初始化函数__init__(): 本章参考:https://blog.csdn.net/hellocsz/article/details/82795514 原作者: hellocsz 总结 ...
- 高阶篇:4.4)FMEA手册的疑问与不足(个人观点)
本章目的:如题,述说FMEA手册第四版的疑问与不足. 1.前言 作者接触FMEA,并真正将其作为可靠性设计方法,也是在近几年的时候,所以不能说算是一个FMEA专家吧. 但作者也有一些自己的优势,就是自 ...
- awk练习
首先,了解awk的运行格式 awk '条件类型1{动作1} 条件类型2{动作2} ...' filename 1. [root@server3 mnt]# cat passwd root x 0 0 ...
- @media响应式布局
@media可以根据屏幕尺寸调节布局 @media screen and (min-width:100px) and (max-width:200px){ div { color:red; } } 在 ...
- 性能测试工具Jmeter12-Jmeter连接配置带跳板机(SSH)的mysql服务器
准备工作: 1.下载mysql-connector-java-5.1.13-bin.jar包,然后放在jmeter安装目录lib下 2.重新打开jmeter即可 要完成以上两步才能进行后续操作 要点: ...
- System.Security.Cryptography.CryptographicException 微信支付中公众号发红包时候碰到的错误。
转 留记录.我是第二个错误原因 我总结了一下出现证书无法加载的原因有以下三个 1.证书密码不正确,微信证书密码就是商户号 解决办法:请检查证书密码是不是和商户号一致 2.IIS设置错误,未加载用户配置 ...
- selenium+python(数据驱动测试)
自动化领域的两种驱动,对象驱动与数据驱动 数据驱动:测试数据的改变引起执行结果的改变 叫 数据驱动 关键字驱动:测试对象名字的改变起引起测试结果的改变 叫 关键字驱动 1 .读取文件参数化 以百度 ...
- JDBC(4)-Result结果集
1.Result结果集的引入 当我们查询数据库时,返回的是一个二维的结果集,我们这时候需要使用ResultSet来遍历结果集,获取每一行的数据. 2.使用Result遍历查询结果 boolean ne ...