使用正确的dtd声明和entityResolver避免saxReader联网验证
2012-12-10 19:19
393 查看
在使用许多使用xml配置文件的框架时,都会碰到以下的问题。有时候项目运行起来,需要花费许多的时间,有时候项目甚至还启动不起来。如使用hibernate时,经常报以下的错误:
在hibernate3.X版本一直到hibernate3.5版本,在hibernate.xml配置文件中,一直使用的xml声明即是如下:
首先,我们来hibernate是如何加载配置文件的,在类Configuration.doConfigure(InputStream stream, String resourceName)方法中,hibernate首先使用xmlHelper创建一个saxReader,然后使用这个saxReader来取得一个document,最后根据这个document再进行以下的处理。我们来看相应的代码实现:
何为entityResolver,在官方的doc上有如下的说明,现copy如下: 如果 SAX 应用程序需要实现自定义处理外部实体,则必须实现此接口并使用 setEntityResolver 方法向 SAX 驱动器注册一个实例。
entityResolver的作用就是项目本身就可以提供一个如何寻找dtd声明的方法,即由程序来实现寻找dtd声明的过程,比如我们将dtd文件放到项目中某处,在实现时直接将此文档读取并返回给sax,即可。这样就避免了通过网络来寻找相应的声明。
首先看entityResolver的接口方法声明:
那么,我们来看hibernate的entityResolver实现,此实现为类DTDEntityResolver,继续参看其实现:
实际上很多的sax解析器都是使用此种解析方式来进行解析,包括struts2等,这种解析方式,即保证了xml格式能够被验证,同时又保证了不需要通过网络下载相应的dtd声明,在程序内部就可以实现dtd获取和下载了。
关于如何使用entityResolver,还有一个网址可以参考下:http://www.ibm.com/developerworks/cn/xml/tips/x-tipent/index.html
转载请标明出处:i flym
本文地址:http://www.iflym.com/index.php/code/usr-right-dtd-declaration-and-entityresolver-to-avoid-saxreader-validate-by-network.html
相关文章推荐
- 使用正确的dtd声明和entityResolver避免saxReader联网验证
- dtd声明和entityResolver避免saxReader联网验证
- dtd声明和entityResolver避免saxReader联网验证
- dtd声明和entityResolver避免saxReader联网验证
- dtd声明和entityResolver避免saxReader联网验证
- dtd声明和entityResolver避免saxReader联网验证
- dtd声明和entityResolver避免saxReader联网验证
- dtd声明和entityResolver避免saxReader联网验证
- dtd声明和entityResolver避免saxReader联网验证
- dtd声明和entityResolver避免saxReader联网验证
- dtd声明和entityResolver避免saxReader联网验证
- dtd声明和entityResolver避免saxReader联网验证
- dtd声明和entityResolver避免saxReader联网验证
- dtd声明和entityResolver避免saxReader联网验证
- dtd声明和entityResolver避免saxReader联网验证
- 正确使用git避免提交冲突
- 使用Java API通过DTD方式验证XML
- jdom 或 dom4j读取xml文件时如何让dtd验证使用本地dtd文件或者不生效
- 输入一个Email地址,然后使用正则表达式验证该Email地址是否正确。
- 正确使用#include和前置声明(forward declaration)