spring自定义标签之规范定义XSD

spring自定义标签之规范定义XSD

引言:

spring的配置文件中,一切的标签都是spring定义好的。<bean/>等等,有了定义的规范,才能让用户填写的正常可用。想写自定义标签,但首先需要了解XML Schema Definition(XSD) 的。

标签定义:

对于该类标签的定义,spring中有着相应的XSD定义文档

对于XSD,简单的说是xml的一个标签的定义,在这里就不对XSD过多的解释了,祥见

http://www.w3school.com.cn/schema/schema_example.asp

这里就简单就应用中会经常碰到的一些定义进行说明一下。

应用场景:

对数据库连接进行进一步的封装,使配置简单化。

由原来的配置方式:      Xml代码

  1. <bean id="dataSource"
  2. class="org.springframework.jdbc.datasource.DriverManagerDataSource">
  3. <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
  4. <property name="url"
  5. value="jdbc:mysql://localhsost/freebug?useUnicode=true&amp;characterEncoding=utf8&amp;autoReconnect=true"></property>
  6. <property name="username">
  7. <value>root</value>
  8. </property>
  9. <property name="password">
  10. <value>root</value>
  11. </property>
  12. </bean>
  13. <!-- 会话 -->
  14. <bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
  15. <property name="configLocation" value="classpath:SqlMapCommonConfig.xml" />
  16. <property name="dataSource" ref="dataSource" />
  17. </bean>

改为:      Xml代码

  1. <mysql:client id="sqlMapClient" datasouceip="localhsost"  characterEncoding="utf8"
  2. dbname="freebug"   username="root" password="root"
  3. configLocation="classpath:SqlMapCommonConfig.xml" />

从这里面,对配置进行了一次简化的处理。其他很多的信息属性还可以进行默认和正则式的限制。

如何做到使上面的配置可以成立,这就要求着,对这个标签进行xsd规范的定义。

标签定义

定义如下:      Xml代码

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <xsd:schema xmlns="http://sammor.javaeye.com/schema/tags"
  3. xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:beans="http://www.springframework.org/schema/beans"
  4. targetNamespace="http://sammor.javaeye.com/schema/tags"
  5. elementFormDefault="qualified" attributeFormDefault="unqualified">
  6. <xsd:import namespace="http://www.springframework.org/schema/beans" />
  7. <xsd:element name="client">
  8. <xsd:annotation>
  9. <xsd:documentation>connect to mysql</xsd:documentation>
  10. </xsd:annotation>
  11. <xsd:complexType>
  12. <xsd:complexContent>
  13. <!-- 继承定义 从namespace="http://www.springframework.org/schema/beans" -->
  14. <xsd:extension base="beans:identifiedType">
  15. <xsd:attribute name="dbname" type="xsd:string" use="required" />
  16. <xsd:attribute name="datasouceip" type="xsd:string"
  17. use="optional" default="127.0.0.1" />
  18. <xsd:attribute name="username" type="xsd:string" use="required" />
  19. <xsd:attribute name="password" type="xsd:string" use="required" />
  20. <xsd:attribute name="characterEncoding" type="xsd:string"
  21. default="utf8">
  22. <xsd:simpleType>
  23. <xsd:restriction base="xsd:string">
  24. <xsd:enumeration value="utf8" />
  25. <xsd:enumeration value="gbk" />
  26. </xsd:restriction>
  27. </xsd:simpleType>
  28. </xsd:attribute>
  29. <xsd:attribute name="configLocation" type="xsd:string"
  30. default="classpath:SqlMapCommonConfig.xml" />
  31. </xsd:extension>
  32. </xsd:complexContent>
  33. </xsd:complexType>
  34. </xsd:element>
  35. </xsd:schema>

说明:      Xml代码

  1. xsd:element     表示定义标签
  2. xsd:extension  如java中的继承,把现有的定义继承进来
  3. xsd:attribute    标签带有的属性
  4. xsd:restriction  对标签改属性进一步的限制,进行一些值的约束

p.s:有时,可能会在      Xml代码

  1. <xsd:extension base="beans:identifiedType">

处报出错误      Xml代码

  1. src-resolve: Cannot resolve the name 'beans:identifiedType' to a(n) 'type definition' component.

请跳过,这个不影响使用,只是ide的检查有问题。

声明标签

对于写好的标签定义需要把他公布到应用中,使其他spring的xml中,可用,需要几步:

1、在classpath资源路径下加入文件:

www.zeeklog.com  - spring自定义标签之规范定义XSD

2、spring.schemas该文件中填写:      Xml代码

  1. http\://sammor.javaeye.com/schema/tags/springtags.xsd=conf/springtag.xsd

其中http后的“\”为转义的意思

3、在spring的配置文件xml头部加入

www.zeeklog.com  - spring自定义标签之规范定义XSD

在配置文件中声明引用xsd定义

当然,到这一步的时候,还仅是对定义一种自定义标签的写法,接下来,如何去做到标签的实现处理,还要做进一步的处理。

p.s 关于xsd的规范学习,还有很多很多,它是一个强大的规范,可以为我们做很多的基础信息和约束,为使用者提供更安全方便的做法。

其他相关文章:

Read more

深入理解 Proxy 和 Object.defineProperty

在JavaScript中,对象是一种核心的数据结构,而对对象的操作也是开发中经常遇到的任务。在这个过程中,我们经常会使用到两个重要的特性:Proxy和Object.defineProperty。这两者都允许我们在对象上进行拦截和自定义操作,但它们在实现方式、应用场景和灵活性等方面存在一些显著的区别。本文将深入比较Proxy和Object.defineProperty,包括它们的基本概念、使用示例以及适用场景,以帮助读者更好地理解和运用这两个特性。 1. Object.defineProperty 1.1 基本概念 Object.defineProperty 是 ECMAScript 5 引入的一个方法,用于直接在对象上定义新属性或修改已有属性。它的基本语法如下: javascript 代码解读复制代码Object.defineProperty(obj, prop, descriptor); 其中,obj是目标对象,prop是要定义或修改的属性名,descriptor是一个描述符对象,用于定义属性的特性。 1.2 使用示例 javascript 代码解读复制代码//

By Ne0inhk

Proxy 和 Object.defineProperty 的区别

Proxy 和 Object.defineProperty 是 JavaScript 中两个不同的特性,它们的作用也不完全相同。 Object.defineProperty 允许你在一个对象上定义一个新属性或者修改一个已有属性。通过这个方法你可以精确地定义属性的特征,比如它是否可写、可枚举、可配置等。该方法的使用场景通常是需要在一个对象上创建一个属性,然后控制这个属性的行为。 Proxy 也可以用来代理一个对象,但是相比于 Object.defineProperty,它提供了更加强大的功能。使用 Proxy 可以截获并重定义对象的基本操作,比如访问属性、赋值、函数调用等等。在这些操作被执行之前,可以通过拦截器函数对这些操作进行拦截和修改。因此,通过 Proxy,你可以完全重写一个对象的默认行为。该方法的使用场景通常是需要对一个对象的行为进行定制化,或者需要在对象上添加额外的功能。 对比 以下是 Proxy 和 Object.defineProperty 的一些区别对比: 方面ProxyObject.defineProperty语法使用 new Proxy(target,

By Ne0inhk