0

我了解 WEB-INF 下的任何资源都不属于公共领域,这是设计使然。
我可以通过在 web.xml 中将其配置为来访问 WEB-INF 下的资源,比如 HTML

   <servlet>
    <servlet-name>resourceId</servlet-name>
    <jsp-file>/WEB-INF/resource.xsl</jsp-file>
  </servlet>

  <servlet-mapping>
    <servlet-name>resourceId</servlet-name>
    <url-pattern>/resource.xsl</url-pattern>
  </servlet-mapping>

但是我面临一个奇怪的情况,在客户端使用文档创建 api 即 document.implementation.createDocument 无法发出弃用警告并建议 XMLHttpRequest 。我正在尝试使用此 api 加载和 XSL/XML 文档,如下所示

xmlFile = document.implementation.createDocument("", "", null);
xmlFile.async = false;
xmlFile.load("resource.xsl");

我得到一个警告:

不推荐使用 Document.load()。要升级您的代码,请使用 DOM XMLHttpRequest 对象。如需更多帮助https://developer.mozilla.org/en/XMLHttpRequest *

但是,如果我将资源直接放在 WebContent 或 WebRoot 文件夹下并为此删除任何 web.xml 配置,它就会顺利运行。我不明白。我在 FF 3.6.5、5.0.1、9、10 上对此进行了测试。请向我解释一下。

我还意识到,在失败期间,即由于放置在 WEB-INF 文件夹中的资源而出现警告时,浏览器确实会成功加载,尽管有警告。Firebug 显示它。但是 XSL 或 XML 加载为 text/html 并且对象 xmlFile 相当空且未填充。如果成功,我会在响应标头中看到 application/xml,并且很好地填充了 xmlFile 对象。请帮忙

4

1 回答 1

1

但是 XSL 或 XML 加载为 text/html 并且对象 xmlFile 相当空且未填充。如果成功,我会在响应标头中看到 application/xml,并且很好地填充了 xmlFile 对象。

显然,当资源/WEB-INFweb.xml黑客提供并默认为text/html. 错误的内容类型解释了您面临的所有 JavaScript 错误。

我将创建一个包装 servlet,它显式设置内容类型并在doGet()方法中转发到 XSL 资源:

response.setContentType("application/xml");
request.getRequestDispatcher("/WEB-INF/resource.xsl").forward(request, response);

改为如下映射。

<servlet>
    <servlet-name>resourceId</servlet-name>
    <servlet-class>com.example.XSLResourceServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>resourceId</servlet-name>
    <url-pattern>/resource.xsl</url-pattern>
</servlet-mapping>

/WEB-INF/resource.xsl如有必要,进行设置<init-param>,以便您可以定义和配置它,web.xml而不是在 servlet 代码中硬编码。

于 2012-04-27T14:36:16.880 回答