据我所知,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对象。请帮忙
答案 0 :(得分:1)
但是XSL或XML是作为text / html加载的,而对象xmlFile是空的并且没有填充。如果成功,我会看到响应头中的application / xml和xmlFile对象填充得很好。
显然,当资源从/WEB-INF
发送web.xml
并且默认为text/html
时,容器不会检查mime类型。错误的内容类型解释了您所面临的所有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代码中进行硬编码。