转载: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的配置文件放在同一目录下。
相关推荐
Spring的核心特性包括依赖注入(Dependency Injection, DI)、面向切面编程(Aspect Oriented Programming, AOP)、事务管理等,这些特性使得Spring成为构建企业级应用的首选框架之一。 #### 3. 整合步骤 为了实现...
在Spring框架中,`xds`和`dtd`文件是重要的元数据资源,它们用于描述和验证XML配置文件。 `DTD`(Document Type Definition)是XML文档类型定义,它定义了XML文档的结构和规则。在Spring框架中,DTD文件通常以`.dtd...
DTD是早期XML文档结构验证的标准方法之一。通过DTD,可以定义哪些元素可以在XML文档中出现,以及这些元素应该如何组织。DTD不仅规定了元素和属性的使用方式,还定义了它们之间的关系。 #### 二、DTD基本语法 #####...
在Spring配置文件中,DTD可以用来声明和验证XML元素的语法。在这个场景下,handlerMappings.dtd可能包含了自定义HandlerMapping的相关XML元素定义,帮助我们配置和使用扩展的映射规则。 3. **HandlerMapping.java**...
综上所述,DTD和Schema在Spring及Mybatis中起到了验证和规范XML配置文件的作用,保证了代码的稳定性和可维护性。了解并熟练掌握这些XML约束,对于理解和使用这两个框架至关重要。通过学习和实践,开发者可以更好地...
`XML编程从入门到精通.pdf`和`XML系列教程之一:XML教程.pdf`等文档会介绍XML的基本语法、DTD(文档类型定义)、XSD(XML Schema)用于验证,以及DOM(文档对象模型)、SAX(简单API for XML)解析器的使用。...
2. **Spring IOC**:Spring的IoC(Inversion of Control,控制反转)是其核心特性之一,它负责管理对象的生命周期和依赖关系。初始化通常从创建`ClassPathXmlApplicationContext`开始。 - 在创建`...
- 拦截器是Struts2的重要组成部分之一,可以在Action执行前后进行一些预处理或后处理操作。 - 示例: ```java public class MyInterceptor implements Interceptor { @Override public String intercept...
- **依赖注入(Dependency Injection, DI)**:这是Spring框架的核心特性之一,通过它能够实现对象之间的解耦合。依赖注入允许外部组件或服务注入到应用程序中,而不是在应用程序内部进行创建,这样可以降低模块间的...
总之,t-3nexus源码程序是一个基于Struts 2的Java应用,通过理解Struts 2框架的原理和配置,以及与之相关的DTD文件,开发者可以掌握项目的运作机制,并在此基础上进行定制和扩展,以满足特定的业务需求。对于希望...
面向切面编程(AOP)是Spring框架的重要特性之一,它允许开发者将横切关注点(如日志记录、安全检查等)从业务逻辑中分离出来。在Spring中,AOP可以通过XML配置或注解的方式来实现。 **Spring中的代理**:Spring...
Java 自学之路的七条主线涵盖了从基础知识到进阶技术的广泛领域。以下是每个主线中的关键知识点的详细说明: 1. **J2SE 面向对象**:理解面向对象的基本概念,如封装、继承和多态。深入学习内存管理,包括对象创建...
编辑器还能根据指定的XSD或DTD文件进行验证,确保XML文档的合规性。 2. **J2EE透视图**:在J2EE透视图下,Eclipse提供了一系列工具帮助开发者创建和管理XML配置文件。例如,可以通过图形界面编辑web.xml,添加...
- 编写测试类,使用SqlSession执行Mapper接口的方法,验证数据库操作是否成功。 通过以上步骤,你就成功搭建了一个基础的iBatis环境。接下来,你可以深入阅读iBatis的源码,理解其内部机制,如SqlSession、...
Java自学之路是一个全面掌握Java技术体系的过程,涵盖了从基础到高级的多个方面。以下是对标题和描述中涉及知识点的详细说明: 1. **J2SE**:Java标准版,是Java开发的基础,主要包括面向对象编程的三大特性:封装...
Struts2的强大之处在于它的灵活性和可扩展性,使得开发者可以定制化地构建符合需求的Web应用。同时,由于其丰富的标签库和强大的拦截器机制,开发效率得到显著提升。不过,随着技术的发展,Struts2也面临了一些挑战...
Action是Struts2中最核心的部分之一,每个Action都对应着一个具体的用户请求。在配置文件中定义Action时,需要指定其类名和返回的结果类型。例如: ```xml <result name="success">/user/home.jsp ...
在Eclipse中,可以使用Spring Tool Suite(STS)扩展来增强对Spring XML配置的支持,包括代码提示、验证和重构。 总之,Eclipse作为一款强大的开发工具,为XML开发提供了全方位的支持。无论你是初学者还是经验丰富...