В чем разница между созданием страниц JSF с расширением.jsp,.xhtml или.jsf?
Я видел несколько примеров создания страниц JSF с .jsp
расширение, другие примеры создания их с .xhtml
расширение и другие примеры выбора .jsf
, Я просто хотел бы знать, в чем разница между вышеуказанными расширениями при работе со страницами JSF и как выбрать подходящее расширение?
2 ответа
JSP - это старая технология просмотра, широко используемая в сочетании с JSF 1.x. Facelets (некоторые люди, обобщенно обозначенные как XHTML) являются преемником JSP и представлены в качестве технологии представления по умолчанию JSF 2.x в конце 2009 года. Когда вы видели JSP, вы, возможно, читали устаревшие книги, учебные пособия или ресурсы, нацеленные на JSF 1.Икс. Как правило, вы должны игнорировать их при разработке с JSF 2.x и обращаться к ресурсам, нацеленным на JSF 2.x, в противном случае вы можете запутаться, потому что в JSF 2.x в Facelets многое делается по-другому.
*.jsf
это только один из широко используемых шаблонов URL FacesServlet
отображение в web.xml
, Другие *.faces
а также /faces/*
, но это из далёких времен JSF 1.0/1.1. Все они не представляют конкретное расширение / путь к файлу, а представляют собой просто расширение / путь к виртуальному файлу и должны указываться только в URL-адресах, например http://example.com/contextname/page.jsf. Если вы знакомы с базовыми сервлетами, вы должны знать, что servletcontainer будет вызывать сервлет, когда URL-адрес запроса соответствует шаблону URL-адреса сервлета. Поэтому, когда URL-адрес запроса совпадает *.jsf
тогда FacesServlet
будет вызван таким образом. При использовании JSP он будет фактически выполняться page.jsp
, При использовании Facelets, это на самом деле компилируется page.xhtml
,
Начиная с JSF 2.x вы также можете использовать *.xhtml
как шаблон URL. Таким образом, вам не нужно запутываться при указании URL. С помощью *.xhtml
как шаблон URL был невозможен в JSF 1.x с Facelets 1.x, потому что FacesServlet
затем будет работать в бесконечном цикле, вызывая себя каждый раз. Дополнительное преимущество использования *.xhtml
заключается в том, что конечный пользователь не сможет видеть необработанный исходный код JSF всякий раз, когда конечный пользователь целенаправленно изменяет расширение URL в адресной строке браузера, например .jsf
в .xhtml
, Не возможно использовать *.jsp
как шаблон URL, потому что таким образом контейнер встроен JspServlet
, который уже использует этот шаблон URL, будет переопределен, а затем FacesServlet
не сможет больше питаться JSP.
Смотрите также:
.jsp
файлы обычно используются для представлений JSF, определенных с помощью JavaServer Pages. .xhtml
файлы обычно используются для представлений JSF, определенных с помощью Facelets.
Это можно изменить с помощью конфигурации (например, см. javax.faces.DEFAULT_SUFFIX
а также javax.faces.FACELETS_SUFFIX
параметры конфигурации.)
Другие сопоставления расширений (*.jsf
, *.faces
как правило, используются для обработки запросов через FacesServlet
, Это логическое отображение представления, которое будет обрабатывать среда выполнения JSF. Как обрабатываются сопоставления, определяется в web.xml
(это не обязательно делать с помощью расширений; /faces/*
картирование часто используется.
Из спецификации:
Servlet Mapping
Все запросы к веб-приложению сопоставляются с конкретным сервлетом на основе сопоставления шаблона URL (как определено в спецификации сервлета Java) с частью URL запроса после контекстного пути, который выбрал это веб-приложение. Реализации JSF должны поддерживать веб-приложение, которое определяет
<servlet-mapping>
который отображает любой действительный шаблон URL в FacesServlet. Может использоваться префикс или расширение сопоставления. При использовании сопоставления префиксов рекомендуется следующее сопоставление, но не обязательно:<servlet-mapping> <servlet-name> faces-servlet-name </servlet-name> <url-pattern>/faces/*</url-pattern> </servlet-mapping>
При использовании сопоставления расширений рекомендуется следующее сопоставление, но не обязательно:
<servlet-mapping> <servlet-name> faces-servlet-name </servlet-name> <url-pattern>*.faces</url-pattern> </servlet-mapping>
В дополнение к FacesServlet реализации JSF могут поддерживать другие способы вызова жизненного цикла обработки запросов JavaServer Faces, но приложения, использующие эти механизмы, не будут переносимыми.