`

Spring之DTD验证

 
阅读更多

转载:http://a123159521.iteye.com/blog/782198

 

一般比较正式的XML信息中都会包含对应的DTD声明,用来定义 该XML文档中的格式,例如WEB项目中用到的web.xml,例如struts的配置文件struts-config.xml,下面是web.xml中 用到的DTD信息: 

Java代码  收藏代码
  1. <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"   
  2.        "http://java.sun.com/dtd/web-app_2_3.dtd">  


当我们用DOM或者Digester来解析这个XML的时候,如果当前计算机已联网那么解析的速度比较慢,如果当前计算机未联网则会报无法连接主机 的异常。这是因为XML的解析器需要读取dtd的内容,而这个dtd文件是存在于互联网的某台主机上的. 
[曾经因为ibatis的服务器访问不到,总提示找不到dtd验证,苦恼了很久,这回好好研究] 
让我们看看开源框架是如何验证DTD的: 
Spring如何解析网络和本地dtd配置的路径. 

Java代码  收藏代码
  1. /** 
  2.  * EntityResolver implementation for the Spring beans DTD, 
  3.  * to load the DTD from the Spring class path (or JAR file). 
  4.  * 
  5.  * <p>Fetches "spring-beans-2.0.dtd" from the class path resource 
  6.  * "/org/springframework/beans/factory/xml/spring-beans-2.0.dtd", 
  7.  * no matter whether specified as some local URL that includes "spring-beans" 
  8.  * in the DTD name or as "http://www.springframework.org/dtd/spring-beans-2.0.dtd". 
  9.  * 
  10.  * @author Juergen Hoeller 
  11.  * @author Colin Sampaleanu 
  12.  * @since 04.06.2003 
  13.  * @see ResourceEntityResolver 
  14.  */  


以上是类的说明就不贴整段了,免得大家看着烦,我也是. 
配置dtd从源代码路径,不管是否有特殊的本地url包含spring-beans.dtd的名称 ,实际还是从本地取DTD路径.[ XML配置还是以网络地址显示],这也是为什么即使Spring在没有网络连接的情况下还是依然可以运行. 
那么这是怎么查找指定的,请看如下代码: 

Java代码  收藏代码
  1. public InputSource resolveEntity(String publicId, String systemId)  


通过publicId和systemId. 
比如: 

Java代码  收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" " http://www.springframework.org/dtd/spring-beans.dtd ">  


其PublicID就是-//SPRING//DTD BEAN//EN. 
其 SystemID就是- http://www.springframework.org/dtd/spring-beans.dtd. 
在Spring框架中只要你使用标准的xml dtd或者schema声名,就会自动从spring.jar里面加载到dtd或schema.其加载程序如下. 

Java代码  收藏代码
  1. Resource resource = new ClassPathResource(dtdFile, getClass());  
  2.                         InputSource source = new InputSource(resource.getInputStream());  
  3.                         source.setPublicId(publicId);  
  4.                         source.setSystemId(systemId);  



这里的路径就是相对于此BeansDtdResolver的路径,也就是org.springframework.beans.factory.xml,所以Spring的dtd等配置文件放在这个目录下,没有网络照样运行. 
接下来让我们看下Struts是如何加载dtd文件的. 
看Struts源码如下: 

Java代码  收藏代码
  1. protected String[] registrations =  
  2.        {  
  3.            "-//Apache Software Foundation//DTD Struts Configuration 1.0//EN",  
  4.            "/org/apache/struts/resources/struts-config_1_0.dtd",  
  5.            "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN",  
  6.            "/org/apache/struts/resources/struts-config_1_1.dtd",  
  7.            "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN",  
  8.            "/org/apache/struts/resources/struts-config_1_2.dtd",  
  9.            "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN",  
  10.            "/org/apache/struts/resources/struts-config_1_3.dtd",  
  11.            "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN",  
  12.            "/org/apache/struts/resources/web-app_2_3.dtd"  
  13.        };  


publicID直接写死,systemId直接写死.哈哈,与Spring对比,Spring的publicId由xml动态指定,如果需要添加dtd或schema版本等不需要修改代码,Struts必须修改代码,或许大家也看到差距了,感觉Struts1.X都很久没更久了,曾经的辉煌都被埋没了.[不知道哪种利益驱动了,搞了个struts2.x,完全不同的理念] 

Java代码  收藏代码
  1. // Create a new Digester instance with standard capabilities  
  2.         configDigester = new Digester();  
  3.         configDigester.setNamespaceAware(true);  
  4.         configDigester.setValidating(this.isValidating());  
  5.         configDigester.setUseContextClassLoader(true);  
  6.         configDigester.addRuleSet(new ConfigRuleSet());  
  7.   
  8.         for (int i = 0; i < registrations.length; i += 2) {  
  9.             URL url = this.getClass().getResource(registrations[i + 1]);  
  10.   
  11.             if (url != null) {  
  12.                 configDigester.register(registrations[i], url.toString());  
  13.             }  
  14.         }  
  15.   
  16.         this.addRuleSets();  


Struts是使用Digester进行dtd的注册,现在终于明白了,为什么Struts和Spring在没有网络的情况下可以运行,但是有的外部包,在没有网络的情况下,或者网络有问题的时候会出问题,这也是我们要注意的,在引入其他项目时,配置文件中的dtd是必须要关注的,在本地开发完全正常,到没有网络环境的时候,你就傻眼了. 
解决Dtd问题也是我们平时开发必须考虑的.

 

=============================分割线=====================================

 

可以将spring配置文件中的

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" " http://www.springframework.org/dtd/spring-beans.dtd ">  

 

修改为

Xml代码  收藏代码
  1. <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "spring-beans.dtd">  

 

spring-beans.dtd文件与spring的配置文件放在同一目录下。

分享到:
评论

相关推荐

    spring及其相关dtd

    这行代码告诉XML解析器使用Spring的beans DTD来验证配置文件的格式。 对于`spring_rel`这个压缩子文件,它可能包含了Spring框架相关的各种配置文件、库或示例代码。例如,可能有`applicationContext.xml`这样的配置...

    spring dtd文件

    在Spring框架中,XML配置文件用于声明依赖注入(DI)和配置bean的属性,而DTD则提供了编辑这些XML文件时的自动补全和验证功能。 描述 "编写springxml文件是很多情况下不给提示添加dtd文件可以给予提示" 提到,当...

    spring hibernate dtd 文件

    Spring的配置通常通过XML文件进行,而DTD则用于验证这些XML配置文件的语法正确性。例如,`spring-beans.dtd`定义了Spring配置文件中bean、property等元素的结构,确保开发者按照规范编写配置,避免因语法错误导致的...

    spring_mybatis_dtd_lib

    例如,Spring的bean配置文件通常使用`&lt;beans&gt;`元素作为根节点,并且通过DTD来验证配置文件的合法性。 **4. MySQL数据库** MySQL是一种流行的开源关系型数据库管理系统,版本5.1是其一个重要的里程碑,提供了事务...

    自定义MyEclipse的DTD文档校验

    其中,XML文件的自动提示与校验功能极大地提高了开发效率,尤其在使用如Struts、Hibernate、Spring等流行框架时更为显著。然而,在离线状态下,当遇到框架升级或引入新版本DTD(Document Type Definition,文档类型...

    spring框架所需的依赖

    在Spring框架中,`xds`和`dtd`文件是重要的元数据资源,它们用于描述和验证XML配置文件。 `DTD`(Document Type Definition)是XML文档类型定义,它定义了XML文档的结构和规则。在Spring框架中,DTD文件通常以`.dtd...

    dwr笔记二之经典用法之和spring结合+验证用户是否存在

    Spring的核心特性包括依赖注入(Dependency Injection, DI)、面向切面编程(Aspect Oriented Programming, AOP)、事务管理等,这些特性使得Spring成为构建企业级应用的首选框架之一。 #### 3. 整合步骤 为了实现...

    SSM高级框架所需dtd

    DTD在这里的作用是验证`&lt;beans&gt;`标签及其子元素是否符合`spring-beans-2.0.dtd`的规范,保证XML文件的合法性。 在SpringMVC的配置中,DTD同样起到关键作用。例如,以下是一个简单的SpringMVC配置示例: ```xml &lt;!...

    ssh以及各个框架配置dtd

    在SSH框架配置中,DTD用于验证XML配置文件的正确性,确保配置符合规范。 Struts2框架的配置主要在struts.xml文件中进行,它使用DTD来定义允许的标签、属性及其可能值。例如,`&lt;action&gt;`标签用于定义一个动作,`...

    mybatis的两个Dtd文件,config.dtd mapper.dtd

    在MyBatis中,DTD文件用于验证配置文件的正确性,确保XML文件符合特定的格式。 1. **config.dtd文件** `config.dtd` 是MyBatis的核心配置文件的DTD文件,它定义了MyBatis配置文件中的所有元素和属性。例如,`...

    java后端开发dtd文件

    在Java后端开发中,DTD文件通常被用来规范和验证XML配置文件,确保它们遵循一定的规则和约束。以下将详细讲解标题和描述中涉及的Java后端开发相关知识点。 1. **Java** Java是一种广泛使用的面向对象的编程语言,...

    Spring插件下载教程

    - **自动导入XSD/DTD**:Spring框架使用多种XSD或DTD文件来定义Bean配置。使用STP可以自动导入这些文件,避免手动操作。 - 在编写`applicationContext.xml`时,可以通过简单的键入提示完成XSD/DTD的自动导入。 - ...

    spring和Mybatis的xml配置文件提示约束包

    在Java Web开发中,Spring和Mybatis是两个非常流行的开源框架。...同时,随着技术的发展,现今许多项目已经转向使用XSD(XML Schema Definition)来替代DTD,因为XSD提供了更强大的数据类型和验证功能。

    xml中dtd总结

    DTD是早期XML文档结构验证的标准方法之一。通过DTD,可以定义哪些元素可以在XML文档中出现,以及这些元素应该如何组织。DTD不仅规定了元素和属性的使用方式,还定义了它们之间的关系。 #### 二、DTD基本语法 #####...

    spring5.0的全部xsd文件

    这可能是Spring的DTD(Document Type Definition)文件,尽管标题提及的是XSD,但DTD也是另一种用于定义XML文档结构的规范。在早期的Spring版本中,配置文件使用DTD进行定义,但自Spring 2.5起,官方推荐使用XSD,...

    struts-2.0.dtdstruts-2.0.dtdstruts-2.0.dtd

    首先,`struts-2.0.dtd`是Struts 2.0的文档类型定义,它是XML文件的一种规范,用于验证`struts.xml`配置文件的语法是否正确。DTD中定义了配置元素和属性,如action、result、package等,确保开发者在编写配置文件时...

    spring中要用到的所有版本资源文件

    在Spring早期版本中,`dtd`文件被用来验证XML配置文件的格式。例如,`http://www.springframework.org/schema/beans/spring-beans.dtd` 就是用于验证`&lt;beans&gt;`根元素及其子元素的。 Spring中使用`xsd`和`dtd`文件的...

    引入的约束文件

    在Spring的早期版本中,配置文件通常使用DTD来声明和验证元素和属性。例如,Spring的核心配置文件`beans.dtd`定义了如`&lt;bean&gt;`、`&lt;property&gt;`等元素,使得XML配置文件能够被解析器正确理解和处理。通过引入`&lt;!...

    spring-ext-handler-mapping.rar_ext_spring ext_spring mvc

    在Spring配置文件中,DTD可以用来声明和验证XML元素的语法。在这个场景下,handlerMappings.dtd可能包含了自定义HandlerMapping的相关XML元素定义,帮助我们配置和使用扩展的映射规则。 3. **HandlerMapping.java**...

    Struts2jar包及dtd文件

    5. **DTD文件**:如`struts-config_2_0.dtd`,用于验证配置文件的正确性。 在实际开发中,将Struts2的jar包添加到项目的类路径(Classpath)中,然后根据项目需求配置struts.xml文件,就可以开始使用Struts2框架了...

Global site tag (gtag.js) - Google Analytics