2012-04-27 1 views
0

Я понимаю, что любой ресурс в WEB-INF не находится в общественном достоянии, и это по дизайну.
я могу получить доступ к ресурсу под WEB-INF, скажем, HTML, настроив его в web.xml, какСтранная ошибка при загрузке XSL/XML в Javascript

<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> 

Но я сталкиваюсь странную ситуацию, когда с помощью создания документа апи на клиентской стороне, т.е. document.implementation .createDocument не снимает предупреждение об устаревании и вместо этого предлагает XMLHttpRequest. Я пытаюсь загрузить и XSL/XML документ, использующий этот API следующим образом

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 довольно пуст и не заселен. В случае успеха я вижу приложение/xml в заголовках ответов и объекте xmlFile, хорошо заполненном. Пожалуйста, помогите

+0

Важно отметить, что если я размещаю ресурс непосредственно в WebContent или WebRoot, но создаю конфигурацию в web.xml как /resource.xsl, подразумевая, что он находится непосредственно под корнем, он все еще выходит из строя. XSL или XML загружаются как text/html, а объект xmlFile не используется. Если я удалю настройку в web.xml, это будет успешным. – deepSymmetry

ответ

1

Но XSL или XML загружается как text/html, а объект xmlFile довольно пуст и не заселен. В случае успеха я вижу приложение/xml в заголовках ответов и объекте xmlFile, хорошо заполненном.

Видимо контейнер не проверяет тип пантомимы, когда ресурс подается с /WEB-INF по web.xml хака и по умолчанию для text/html. Неправильный тип содержимого объясняет все ошибки JavaScript, с которыми вы сталкиваетесь.

Я бы создать обертку сервлет, который явно задает тип содержимого и пересылает на XSL ресурс в методе doGet():

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 вместо жесткого кодирования в коде сервлета.

+0

Спасибо за ваш ответ. Я думал, что не получим ответа. Я проверил после долгого времени, и я нашел ответ. Ваш ответ очень полезен, но я не могу «UP» его на 1, так как у меня нет 15 очков. Как я могу сказать «ответ» или +1 очко? – deepSymmetry