2014-08-16 5 views
1

Я шел через пользовательские обработчики ресурсов в JSF 2, когда я наткнулся на UnmappedResourceHandler из всех. Это было добавлено в Omnifaces после сообщения this.Почему UnmappedResourceHandler требует сопоставления сервлета для шаблона префикса URL-адреса ресурса JSF?

Я заметил, что в отличие от других двух ресурсов, которые Omnifaces предоставляет, а именно. CDNResourceHandler и CombinedResourceHandler, это одна требует и дополнительного отображения для JSF ресурса шаблона префикса URL:

<servlet-mapping> 
    <servlet-name>facesServlet</servlet-name> 
    <url-pattern>*.xhtml</url-pattern> 
    <url-pattern>/javax.faces.resource/*</url-pattern> 
</servlet-mapping> 

Я не эксперт по JSF, но я хотел бы знать, почему это нужно только для этого типа, а не для других два?

ответ

1

Ресурсы JSF также должны обслуживаться FacesServlet. Это тот, который отвечает за поиск нужного файла в папке /resources и повторяет его вместе с соответствующими заголовками кеширования. Если вы удалите расширение .xhtml (или /faces) из URL-адреса ресурса, то URL-адрес больше не будет соответствовать шаблону URL-адреса FacesServlet, и поэтому FacesServlet не будет вызываться и не сможет выполнять свою работу ресурс. Вы получили бы только ошибку 404 Not Found, потому что «сырые» URL-адреса ресурсов не соответствуют структуре папок общих веб-контентов.

UnmappedResourceHandler использует тот факт, что URL-адреса ресурсов JSF имеют общий префиксный путь /javax.faces.resource, как определено ResourceHandler.RESOURCE_IDENTIFIER. Таким образом, чтобы вызывать FacesServlet в любом случае, даже без расширения .xhtml (или /faces) вам просто нужно добавить шаблон изображения /javax.faces.resource/* к сопоставлению.

CDNResourceHandler не нуждается в изменении отображения, так как он не создает URL-адреса ресурсов JSF в любом случае, но настоящие URL-адреса CDN, такие как те, которые указывают на jQuery или хосты Google CDN. Эти URL-адреса не будут (нужно) ударять FacesServlet в любом случае.

CombinedResourceHandler только что создает URL-адреса ресурсов JSF по умолчанию, с расширением .xhtml (или /faces). Он использует только специальное имя libraryomnifaces.combined, так что CombinedResourceHandler может идентифицировать их.