`

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的配置文件放在同一目录下。

分享到:
评论

相关推荐

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

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

    spring框架所需的依赖

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

    xml中dtd总结

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

    spring-ext-handler-mapping.rar_ext_spring ext_spring mvc

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

    Spring各版本的xml约束

    综上所述,DTD和Schema在Spring及Mybatis中起到了验证和规范XML配置文件的作用,保证了代码的稳定性和可维护性。了解并熟练掌握这些XML约束,对于理解和使用这两个框架至关重要。通过学习和实践,开发者可以更好地...

    银行面试准备资源包-Spring+Oracle+XML处理

    `XML编程从入门到精通.pdf`和`XML系列教程之一:XML教程.pdf`等文档会介绍XML的基本语法、DTD(文档类型定义)、XSD(XML Schema)用于验证,以及DOM(文档对象模型)、SAX(简单API for XML)解析器的使用。...

    spring源码1

    2. **Spring IOC**:Spring的IoC(Inversion of Control,控制反转)是其核心特性之一,它负责管理对象的生命周期和依赖关系。初始化通常从创建`ClassPathXmlApplicationContext`开始。 - 在创建`...

    Struts2.1+Spring3.0+JPA1.0 .pdf

    - 拦截器是Struts2的重要组成部分之一,可以在Action执行前后进行一些预处理或后处理操作。 - 示例: ```java public class MyInterceptor implements Interceptor { @Override public String intercept...

    Spring和Struts框架学习总结

    - **依赖注入(Dependency Injection, DI)**:这是Spring框架的核心特性之一,通过它能够实现对象之间的解耦合。依赖注入允许外部组件或服务注入到应用程序中,而不是在应用程序内部进行创建,这样可以降低模块间的...

    t-3nexus源码程序

    总之,t-3nexus源码程序是一个基于Struts 2的Java应用,通过理解Struts 2框架的原理和配置,以及与之相关的DTD文件,开发者可以掌握项目的运作机制,并在此基础上进行定制和扩展,以满足特定的业务需求。对于希望...

    java常用框架学习笔记

    面向切面编程(AOP)是Spring框架的重要特性之一,它允许开发者将横切关注点(如日志记录、安全检查等)从业务逻辑中分离出来。在Spring中,AOP可以通过XML配置或注解的方式来实现。 **Spring中的代理**:Spring...

    JAVA自学之路 七路线图明细

    Java 自学之路的七条主线涵盖了从基础知识到进阶技术的广泛领域。以下是每个主线中的关键知识点的详细说明: 1. **J2SE 面向对象**:理解面向对象的基本概念,如封装、继承和多态。深入学习内存管理,包括对象创建...

    J2EE之xml的建模

    编辑器还能根据指定的XSD或DTD文件进行验证,确保XML文档的合规性。 2. **J2EE透视图**:在J2EE透视图下,Eclipse提供了一系列工具帮助开发者创建和管理XML配置文件。例如,可以通过图形界面编辑web.xml,添加...

    ibatis实战之基础环境搭建(源码).zip

    - 编写测试类,使用SqlSession执行Mapper接口的方法,验证数据库操作是否成功。 通过以上步骤,你就成功搭建了一个基础的iBatis环境。接下来,你可以深入阅读iBatis的源码,理解其内部机制,如SqlSession、...

    java自学之路num1

    Java自学之路是一个全面掌握Java技术体系的过程,涵盖了从基础到高级的多个方面。以下是对标题和描述中涉及知识点的详细说明: 1. **J2SE**:Java标准版,是Java开发的基础,主要包括面向对象编程的三大特性:封装...

    source_struts

    Struts2的强大之处在于它的灵活性和可扩展性,使得开发者可以定制化地构建符合需求的Web应用。同时,由于其丰富的标签库和强大的拦截器机制,开发效率得到显著提升。不过,随着技术的发展,Struts2也面临了一些挑战...

    轻松入门之Struts2

    Action是Struts2中最核心的部分之一,每个Action都对应着一个具体的用户请求。在配置文件中定义Action时,需要指定其类名和返回的结果类型。例如: ```xml &lt;result name="success"&gt;/user/home.jsp ...

    用Eclipse进行xml开发

    在Eclipse中,可以使用Spring Tool Suite(STS)扩展来增强对Spring XML配置的支持,包括代码提示、验证和重构。 总之,Eclipse作为一款强大的开发工具,为XML开发提供了全方位的支持。无论你是初学者还是经验丰富...

Global site tag (gtag.js) - Google Analytics