`
llyzq
  • 浏览: 585542 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Spring,Struts的DTD验证

    博客分类:
  • J2SE
阅读更多

转自: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 hibernate dtd 文件

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

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

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

    Struts2jar包及dtd文件

    在Struts2中,DTD文件用于验证Struts配置文件(struts.xml)的语法正确性。例如,`struts-default.dtd`包含了默认的Struts2配置元素和属性的定义,确保了开发者在编写配置文件时遵循了正确的规范。将这些DTD文件放在...

    集合 struts2+spring+hibernate

    DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"&gt; &lt;struts&gt; &lt;package name="abc" namespace="/def" extends="struts-...

    自定义MyEclipse的DTD文档校验

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

    S2S3H3(Struts2.3.4+Spring3.0+Hibernate3.3)配置步骤

    SSH(Struts2、Spring、Hibernate)是Java开发中常用的三大开源框架,它们的组合能有效地实现MVC(Model-View-Controller)设计模式,提高开发效率并降低耦合度。以下是S2S3H3(Struts2.3.4+Spring3.0+Hibernate3.3...

    Spring和Struts框架学习总结

    ### Spring和Struts框架学习总结 #### 一、Spring框架简介与核心概念 Spring框架是一个开源的Java平台,主要用于简化企业级应用的开发工作。它提供了全面的基础架构支持,包括依赖注入(DI)、面向切面编程(AOP)...

    StrutsSpringHibernate实例

    ### Struts + Spring + Hibernate 实例详解 #### 一、项目背景与概述 在本教程中,我们将构建一个简单的登录应用,使用Struts作为前端框架,Spring进行业务逻辑管理,Hibernate作为持久层技术。该应用名为`login`...

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

    - 在Struts2中,可以通过注解、XML配置文件或编写自定义验证器等方式实现数据验证。 - 示例: ```java @RequiredStringValidator(message = "Username is required") private String username; ``` ### 访问Web...

    Eclipse开发Struts1.2

    【Eclipse开发Struts1.2】的知识点详解 Struts1.2 是一个流行的Java Web框架,它基于Model-View-Controller (MVC)设计...此外,随着Struts1.2逐渐被淘汰,现代Web开发更多地转向Struts2或Spring MVC等更现代的框架。

    ssh以及各个框架配置dtd

    SSH(Struts2、Spring、Hibernate)是一种常见的Java Web开发框架组合,用于构建高效、可扩展的企业级应用程序。DTD(Document Type Definition)是XML文档的一个重要组成部分,它定义了XML文档的结构和规则。在SSH...

    java后端开发dtd文件

    总之,Java后端开发中的DTD文件是保证XML配置正确性和一致性的重要工具,它与Spring、MyBatis、Struts和Dubbo等框架的结合使用,共同构成了复杂且高效的后端应用体系。了解并熟练掌握这些技术,对于Java后端开发者来...

    Struts2、Hibernate3、Spring的简单配置与使用

    ### Struts2、Hibernate3、Spring的简单配置与使用 #### 一、开发环境搭建 在开始介绍如何配置Struts2、Hibernate3以及Spring之前,我们先了解一下所需的开发环境: - **IDE**: MyEclipse 6.5 - **Java SDK**: ...

    Struts2+spring2+hibernate3实例源码-java源码

    ### Struts2 + Spring2 + Hibernate3 整合实例源码分析 #### 一、概述 随着企业级应用的发展,为了提高开发效率和系统维护性,越来越多的项目开始采用MVC设计模式。其中,Struts2作为MVC框架中的佼佼者,在前端...

    Struts 2、Hibernate、Spring的整合应用实例

    ### Struts 2、Hibernate、Spring的整合应用实例 #### 一、概述 在Java EE领域,Struts 2、Hibernate以及Spring这三个框架被广泛应用于构建高性能的企业级应用。Struts 2负责处理用户交互及页面展示;Hibernate...

    struts hibernate Spring 整合实例

    它结合了Struts2的MVC架构模式、Spring的依赖注入(DI)和面向切面编程(AOP)、以及Hibernate的对象关系映射(ORM)技术,可以有效提高开发效率和代码质量。 - **Struts**:负责处理前端请求和页面展示,遵循MVC...

    Struts2相关资料

    在Struts2中,`struts-config.dtd`和`struts-plugin.dtd`等文件用于验证Struts2配置文件的格式,确保配置正确无误。 3. **学习资料**:这部分可能包含教程、示例代码、讲解文档等,帮助开发者理解和学习如何使用...

Global site tag (gtag.js) - Google Analytics