У меня есть приложение JSF2, работающее и работающее без проблем. Проблема, с которой я сталкиваюсь в JSF, связана с комплектом ресурсов. Все ресурсы имеют добавленный к нему суффикс .xhtml
. Таким образом, main.css
становится main.css.xhtml
при загрузке в браузере. Я бы хотел, чтобы он .xhtml
не был использован для ресурсов (не обращайте внимания на сами страницы).
Есть ли способ, в котором мы можем НЕ добавить .xhtml
к ресурсам?
В идеале я не должен был бы менять внутреннюю работу сайта. Я перечислил идеи ниже, но я должен сказать, что мне это не очень нравится. Надеемся на решение где-нибудь?
Я использую майорра v.2.1.17 на Glassfish 3.1.2.2.
Текущая загрузка сервлетов, как в web.xml(обновлено)
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.xhtml</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/javax.faces.resource/*</url-pattern>
</servlet-mapping>
Почему эти вопросы отличаются от других
- Ресурсы JSF 2 с CDN?. Я не хочу размещать свои ресурсы на CDN, но для того, чтобы мои ресурсы оставались на моем сервере, но были перенесены в CDN.
- Измените префикс /javax.faces.resource URL-адресов ресурсов. Я не хочу менять префикс. Я хочу только изменить суффикс. Я бы хотел, чтобы
<link type="text/css" rel="stylesheet" href="/javax.faces.resource/main03.css.xhtml?ln=styles">
стал:<link type="text/css" rel="stylesheet" href="/javax.faces.resource/main03.css?ln=styles">
БЕЗ расширения.xhtml
. - Изменение префикса JSF на суффикс-отображение заставляет меня повторно привязать отображение фоновых изображений CSS. Поскольку у меня нет проблем с загрузкой ресурсов. Сайт работает, мы просто с трудом различаем веб-страницу из ресурса (поскольку мы рассматриваем только расширение).
Рассуждение
Конечно, вы можете спросить меня, зачем мне это нужно. Ну, мы направляем наше приложение для обслуживания CDN Akamai.
Проблема, связанная с интеграцией сайта, заключается в том, что мы пытаемся кэшировать статический контент на пограничных серверах. Это делается путем сопоставления расширений файлов (например:.js,.doc,.png, css и т.д.). Мы не можем сопоставить xhtml
, потому что это будет кэширование всех страниц, а также статического содержимого. Это может вызвать проблемы с сеансами и т.д.
Попытка решения
В соответствии с ответом BalusC, я применил обработчик ресурсов, как было предложено. Я не буду переписывать код здесь, так как он находится в ответе ниже.
Однако при загрузке составных компонентов возникает ошибка. Я получаю ошибку как таковую:
WARNING: StandardWrapperValve[Faces Servlet]: PWC1406: Servlet.service() for servlet Faces Servlet threw exception
java.lang.NullPointerException
at com.sun.faces.application.ApplicationImpl.createComponent(ApplicationImpl.java:975)
at com.sun.faces.facelets.tag.jsf.CompositeComponentTagHandler.createComponent(CompositeComponentTagHandler.java:162)
at com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.createComponent(ComponentTagHandlerDelegateImpl.java:494)
at com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.apply(ComponentTagHandlerDelegateImpl.java:169)
...
Композитный компонент загружен правильно, потому что, если я "отменил регистрацию" нового ResourceHandler
, который мы только что создали, он будет загружен. Трассировка стека приводит меня к мысли, что он пытается найти этот компонент в классе java, вместо того, чтобы находить его в ресурсах. Согласно grepcode
это будет на этой последней строке (975), где происходит ошибка:
String packageName = componentResource.getLibraryName();
String className = componentResource.getResourceName();
className = packageName + '.' + className.substring(0, className.lastIndexOf('.'));
Значение resourceName
, aka className
равно null
, так как ошибка, которую я получаю, равна java.lang.NullPointerException
. Я не могу понять, как/где ResourceHandler
называется vis-a-vis для составного компонента. Любая помощь в выяснении этой последней проблемы?