Java中getResourceAsStream的用法(转自:http://www.cnblogs.com/javayuer/archive/2011/01/02/1924192.html)

本文深入探讨Java中getResourceAsStream的使用方法,包括不同参数的用法和具体场景应用。

Java中getResourceAsStream的用法

首先,Java中的getResourceAsStream有以下几种:
1. Class.getResourceAsStream(String path) : path 不以’/'开头时默认是从此类所在的包下取资源,以’/'开头则是从

ClassPath根下获取。其只是通过path构造一个绝对路径,最终还是由ClassLoader获取资源。

2. Class.getClassLoader.getResourceAsStream(String path) :默认则是从ClassPath根下获取,path不能以’/'开头,最终是由

ClassLoader获取资源。

3. ServletContext. getResourceAsStream(String path):默认从WebAPP根目录下取资源,Tomcat下path是否以’/'开头无所谓,

当然这和具体的容器实现有关。

4. Jsp下的application内置对象就是上面的ServletContext的一种实现。

其次,getResourceAsStream 用法大致有以下几种:

第一: 要加载的文件和.class文件在同一目录下,例如:com.x.y 下有类me.class ,同时有资源文件myfile.xml

那么,应该有如下代码:

me.class.getResourceAsStream("myfile.xml");

第二:在me.class目录的子目录下,例如:com.x.y 下有类me.class ,同时在 com.x.y.file 目录下有资源文件myfile.xml

那么,应该有如下代码:

me.class.getResourceAsStream("file/myfile.xml");

第三:不在me.class目录下,也不在子目录下,例如:com.x.y 下有类me.class ,同时在 com.x.file 目录下有资源文件myfile.xml

那么,应该有如下代码:

me.class.getResourceAsStream("/com/x/file/myfile.xml");

总结一下,可能只是两种写法

第一:前面有 “   / ”

“ / ”代表了工程的根目录,例如工程名叫做myproject,“ / ”代表了myproject

me.class.getResourceAsStream("/com/x/file/myfile.xml");

第二:前面没有 “   / ”

代表当前类的目录

me.class.getResourceAsStream("myfile.xml");

me.class.getResourceAsStream("file/myfile.xml");

<think>好的,我现在需要解决用户提到的两个问题:一个是关于`xmlns:jsp`的命名空间报错,另一个是`dwr20.dtd` URL未注册的问题。首先,我得先理解这两个问题的具体原因。 对于`xmlns:jsp`的报错,用户可能是在XML配置文件中使用了类似`xmlns:jsp="http://java.sun.com/xml/ns/javaee/jsp"`的声明,但系统无法找到对应的schema或DTD。这可能是因为这个URL已经过时或者无法访问。我记得Java EE的命名空间现在可能由Jakarta EE维护,原来的Sun/Oracle的URL可能已经失效了。需要确认正确的命名空间URL,或者是否需要引入相关的XSD文件到本地。然后是`dwr20.dtd`的问题,用户之前已经提过,之前的回答建议使用本地DTD或升级到使用XSD的DWR版本。可能用户这次的问题是在配置DWR时同时遇到了这两个问题,需要综合解决。可能需要检查DWR配置文件中的DOCTYPE声明是否正确,以及是否处理了JSP命名空间的引用。接下来,我需要分步骤解决这两个问题。对于`xmlns:jsp`报错,可能需要更新命名空间的URL到正确的地址,或者配置实体解析器来本地解析。例如,Jakarta EE的命名空间可能使用新的URL,或者用户需要将XSD文件下载到本地项目中,然后在XML中引用本地路径,同时设置解析器从classpath加载。对于`dwr20.dtd`的问题,之前的解决方案仍然适用,即下载DTD文件到本地,修改DOCTYPE声明指向本地路径,并配置解析器使用本地文件。或者升级到DWR3.x版本,使用XSD代替DTD,这样可以避免DTD的问题。 用户可能同时使用DWR和JSP标签库,因此需要确保两者的命名空间都正确配置。可能需要检查XML文件的头部声明,确保所有命名空间的URL都是有效且可访问的,或者已被正确映射到本地资源。 另外,可能需要考虑XML解析器的配置,比如在Spring或应用服务器中设置EntityResolver,以处理这些外部资源的引用。例如,使用Spring的`ResourceEntityResolver`来从classpath中加载这些DTD或XSD文件。还需要验证用户是否在配置文件中正确混合了不同的命名空间,比如是否在DWR的配置文件中错误地引入了JSP的命名空间,导致解析错误。需要检查XML文件的结构,确保每个命名空间的使用都是正确且必要的。 最后,可能需要提供具体的配置示例,比如如何修改DWR的配置文件,如何引入本地的DTD和XSD,以及如何设置解析器。同时,提醒用户在升级DWR版本时注意兼容性问题,并测试配置更改后的应用是否正常运行。</think>### 解决`xmlns:jsp`命名空间与`dwr20.dtd`未注册问题 --- #### 一、`xmlns:jsp`命名空间报错分析 当XML配置文件中包含以下声明时: ```xml <beans xmlns:jsp="http://java.sun.com/xml/ns/javaee/jsp" xmlns:dwr="http://www.directwebremoting.org/schema/spring-dwr"> ``` 若报错`无法定位命名空间http://java.sun.com/xml/ns/javaee/jsp`,原因可能是: 1. **过时命名空间URL** Java EE规范已迁移至Jakarta EE,原Sun/Oracle的命名空间URL失效[^1]。 2. **缺少本地Schema文件** 未配置XSD文件本地映射,导致XML解析器无法验证。 --- #### 二、综合解决方案 ##### 1. 更新命名空间声明 **针对JSP命名空间**: - 使用Jakarta EE的新URL: ```xml xmlns:jsp="https://jakarta.ee/xml/ns/jakartaee/jsp" ``` - 或直接引用本地XSD文件(需下载`web-jsptaglibrary_3_1.xsd`): ```xml xmlns:jsp="classpath:/schemas/jakartaee/web-jsptaglibrary_3_1.xsd" ``` **针对DWR命名空间**: - 升级到DWR 3.x并改用XSD: ```xml xmlns:dwr="http://www.directwebremoting.org/schema/spring-dwr" xsi:schemaLocation="http://www.directwebremoting.org/schema/spring-dwr http://www.directwebremoting.org/schema/spring-dwr-3.0.xsd" ``` ##### 2. 配置本地DTD/XSD解析 **步骤**: 1. 下载资源文件: - `dwr20.dtd` → `src/main/resources/dtd/dwr20.dtd` - `web-jsptaglibrary_3_1.xsd` → `src/main/resources/schemas/jakartaee/web-jsptaglibrary_3_1.xsd` 2. 配置XML解析器实体解析: ```java SAXReader reader = new SAXReader(); reader.setEntityResolver((publicId, systemId) -> { if (systemId.contains("dwr20.dtd")) { return new InputSource(getClass().getResourceAsStream("/dtd/dwr20.dtd")); } else if (systemId.contains("web-jsptaglibrary")) { return new InputSource(getClass().getResourceAsStream("/schemas/jakartaee/web-jsptaglibrary_3_1.xsd")); } return null; }); ``` ##### 3. 完整配置示例 ```xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jsp="https://jakarta.ee/xml/ns/jakartaee/jsp" xmlns:dwr="http://www.directwebremoting.org/schema/spring-dwr" xsi:schemaLocation=" http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd http://www.directwebremoting.org/schema/spring-dwr http://www.directwebremoting.org/schema/spring-dwr-3.0.xsd"> <dwr:configuration> <dwr:init/> </dwr:configuration> </beans> ``` --- #### 三、验证方法 1. **IDE静态检查** 在IntelliJ/Eclipse中打开XML文件,应无红色错误提示。 2. **启动时日志监控** 检查应用启动日志中是否包含`XML validation skipped`或`Successfully loaded DTD/XSD`类信息。 3. **网络请求拦截** 使用Wireshark过滤`http://java.sun.com`和`dwr20.dtd`的请求,确认无404响应。 --- #### 四、关联配置参数 | 配置项 | 作用 | 示例值 | |--------|------|--------| | `xmlns:jsp` | JSP标签库命名空间 | `https://jakarta.ee/xml/ns/jakartaee/jsp` | | `EntityResolver` | 自定义实体解析策略 | 如上述Java代码示例 | ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值