转载:http://a123159521.iteye.com/blog/782198
一般比较正式的XML信息中都会包含对应的DTD声明,用来定义 该XML文档中的格式,例如WEB项目中用到的web.xml,例如struts的配置文件struts-config.xml,下面是web.xml中 用到的DTD信息:
- <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
- "http://java.sun.com/dtd/web-app_2_3.dtd">
当我们用DOM或者Digester来解析这个XML的时候,如果当前计算机已联网那么解析的速度比较慢,如果当前计算机未联网则会报无法连接主机 的异常。这是因为XML的解析器需要读取dtd的内容,而这个dtd文件是存在于互联网的某台主机上的.
[曾经因为ibatis的服务器访问不到,总提示找不到dtd验证,苦恼了很久,这回好好研究]
让我们看看开源框架是如何验证DTD的:
Spring如何解析网络和本地dtd配置的路径.
- /**
- * EntityResolver implementation for the Spring beans DTD,
- * to load the DTD from the Spring class path (or JAR file).
- *
- * <p>Fetches "spring-beans-2.0.dtd" from the class path resource
- * "/org/springframework/beans/factory/xml/spring-beans-2.0.dtd",
- * no matter whether specified as some local URL that includes "spring-beans"
- * in the DTD name or as "http://www.springframework.org/dtd/spring-beans-2.0.dtd".
- *
- * @author Juergen Hoeller
- * @author Colin Sampaleanu
- * @since 04.06.2003
- * @see ResourceEntityResolver
- */
以上是类的说明就不贴整段了,免得大家看着烦,我也是.
配置dtd从源代码路径,不管是否有特殊的本地url包含spring-beans.dtd的名称 ,实际还是从本地取DTD路径.[ XML配置还是以网络地址显示],这也是为什么即使Spring在没有网络连接的情况下还是依然可以运行.
那么这是怎么查找指定的,请看如下代码:
- public InputSource resolveEntity(String publicId, String systemId)
通过publicId和systemId.
比如:
- <?xml version="1.0" encoding="UTF-8"?>
- <!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.其加载程序如下.
- Resource resource = new ClassPathResource(dtdFile, getClass());
- InputSource source = new InputSource(resource.getInputStream());
- source.setPublicId(publicId);
- source.setSystemId(systemId);
这里的路径就是相对于此BeansDtdResolver的路径,也就是org.springframework.beans.factory.xml,所以Spring的dtd等配置文件放在这个目录下,没有网络照样运行.
接下来让我们看下Struts是如何加载dtd文件的.
看Struts源码如下:
- protected String[] registrations =
- {
- "-//Apache Software Foundation//DTD Struts Configuration 1.0//EN",
- "/org/apache/struts/resources/struts-config_1_0.dtd",
- "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN",
- "/org/apache/struts/resources/struts-config_1_1.dtd",
- "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN",
- "/org/apache/struts/resources/struts-config_1_2.dtd",
- "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN",
- "/org/apache/struts/resources/struts-config_1_3.dtd",
- "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN",
- "/org/apache/struts/resources/web-app_2_3.dtd"
- };
publicID直接写死,systemId直接写死.哈哈,与Spring对比,Spring的publicId由xml动态指定,如果需要添加dtd或schema版本等不需要修改代码,Struts必须修改代码,或许大家也看到差距了,感觉Struts1.X都很久没更久了,曾经的辉煌都被埋没了.[不知道哪种利益驱动了,搞了个struts2.x,完全不同的理念]
- // Create a new Digester instance with standard capabilities
- configDigester = new Digester();
- configDigester.setNamespaceAware(true);
- configDigester.setValidating(this.isValidating());
- configDigester.setUseContextClassLoader(true);
- configDigester.addRuleSet(new ConfigRuleSet());
- for (int i = 0; i < registrations.length; i += 2) {
- URL url = this.getClass().getResource(registrations[i + 1]);
- if (url != null) {
- configDigester.register(registrations[i], url.toString());
- }
- }
- this.addRuleSets();
Struts是使用Digester进行dtd的注册,现在终于明白了,为什么Struts和Spring在没有网络的情况下可以运行,但是有的外部包,在没有网络的情况下,或者网络有问题的时候会出问题,这也是我们要注意的,在引入其他项目时,配置文件中的dtd是必须要关注的,在本地开发完全正常,到没有网络环境的时候,你就傻眼了.
解决Dtd问题也是我们平时开发必须考虑的.
=============================分割线=====================================
可以将spring配置文件中的
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" " http://www.springframework.org/dtd/spring-beans.dtd ">
修改为
- <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "spring-beans.dtd">
spring-beans.dtd文件与spring的配置文件放在同一目录下。
相关推荐
这行代码告诉XML解析器使用Spring的beans DTD来验证配置文件的格式。 对于`spring_rel`这个压缩子文件,它可能包含了Spring框架相关的各种配置文件、库或示例代码。例如,可能有`applicationContext.xml`这样的配置...
在Spring框架中,XML配置文件用于声明依赖注入(DI)和配置bean的属性,而DTD则提供了编辑这些XML文件时的自动补全和验证功能。 描述 "编写springxml文件是很多情况下不给提示添加dtd文件可以给予提示" 提到,当...
Spring的配置通常通过XML文件进行,而DTD则用于验证这些XML配置文件的语法正确性。例如,`spring-beans.dtd`定义了Spring配置文件中bean、property等元素的结构,确保开发者按照规范编写配置,避免因语法错误导致的...
例如,Spring的bean配置文件通常使用`<beans>`元素作为根节点,并且通过DTD来验证配置文件的合法性。 **4. MySQL数据库** MySQL是一种流行的开源关系型数据库管理系统,版本5.1是其一个重要的里程碑,提供了事务...
其中,XML文件的自动提示与校验功能极大地提高了开发效率,尤其在使用如Struts、Hibernate、Spring等流行框架时更为显著。然而,在离线状态下,当遇到框架升级或引入新版本DTD(Document Type Definition,文档类型...
在Spring框架中,`xds`和`dtd`文件是重要的元数据资源,它们用于描述和验证XML配置文件。 `DTD`(Document Type Definition)是XML文档类型定义,它定义了XML文档的结构和规则。在Spring框架中,DTD文件通常以`.dtd...
Spring的核心特性包括依赖注入(Dependency Injection, DI)、面向切面编程(Aspect Oriented Programming, AOP)、事务管理等,这些特性使得Spring成为构建企业级应用的首选框架之一。 #### 3. 整合步骤 为了实现...
DTD在这里的作用是验证`<beans>`标签及其子元素是否符合`spring-beans-2.0.dtd`的规范,保证XML文件的合法性。 在SpringMVC的配置中,DTD同样起到关键作用。例如,以下是一个简单的SpringMVC配置示例: ```xml <!...
在SSH框架配置中,DTD用于验证XML配置文件的正确性,确保配置符合规范。 Struts2框架的配置主要在struts.xml文件中进行,它使用DTD来定义允许的标签、属性及其可能值。例如,`<action>`标签用于定义一个动作,`...
在MyBatis中,DTD文件用于验证配置文件的正确性,确保XML文件符合特定的格式。 1. **config.dtd文件** `config.dtd` 是MyBatis的核心配置文件的DTD文件,它定义了MyBatis配置文件中的所有元素和属性。例如,`...
在Java后端开发中,DTD文件通常被用来规范和验证XML配置文件,确保它们遵循一定的规则和约束。以下将详细讲解标题和描述中涉及的Java后端开发相关知识点。 1. **Java** Java是一种广泛使用的面向对象的编程语言,...
- **自动导入XSD/DTD**:Spring框架使用多种XSD或DTD文件来定义Bean配置。使用STP可以自动导入这些文件,避免手动操作。 - 在编写`applicationContext.xml`时,可以通过简单的键入提示完成XSD/DTD的自动导入。 - ...
在Java Web开发中,Spring和Mybatis是两个非常流行的开源框架。...同时,随着技术的发展,现今许多项目已经转向使用XSD(XML Schema Definition)来替代DTD,因为XSD提供了更强大的数据类型和验证功能。
DTD是早期XML文档结构验证的标准方法之一。通过DTD,可以定义哪些元素可以在XML文档中出现,以及这些元素应该如何组织。DTD不仅规定了元素和属性的使用方式,还定义了它们之间的关系。 #### 二、DTD基本语法 #####...
这可能是Spring的DTD(Document Type Definition)文件,尽管标题提及的是XSD,但DTD也是另一种用于定义XML文档结构的规范。在早期的Spring版本中,配置文件使用DTD进行定义,但自Spring 2.5起,官方推荐使用XSD,...
首先,`struts-2.0.dtd`是Struts 2.0的文档类型定义,它是XML文件的一种规范,用于验证`struts.xml`配置文件的语法是否正确。DTD中定义了配置元素和属性,如action、result、package等,确保开发者在编写配置文件时...
在Spring早期版本中,`dtd`文件被用来验证XML配置文件的格式。例如,`http://www.springframework.org/schema/beans/spring-beans.dtd` 就是用于验证`<beans>`根元素及其子元素的。 Spring中使用`xsd`和`dtd`文件的...
在Spring的早期版本中,配置文件通常使用DTD来声明和验证元素和属性。例如,Spring的核心配置文件`beans.dtd`定义了如`<bean>`、`<property>`等元素,使得XML配置文件能够被解析器正确理解和处理。通过引入`<!...
在Spring配置文件中,DTD可以用来声明和验证XML元素的语法。在这个场景下,handlerMappings.dtd可能包含了自定义HandlerMapping的相关XML元素定义,帮助我们配置和使用扩展的映射规则。 3. **HandlerMapping.java**...
5. **DTD文件**:如`struts-config_2_0.dtd`,用于验证配置文件的正确性。 在实际开发中,将Struts2的jar包添加到项目的类路径(Classpath)中,然后根据项目需求配置struts.xml文件,就可以开始使用Struts2框架了...