В чем разница между созданием страниц 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, но приложения, использующие эти механизмы, не будут переносимыми.

Другие вопросы по тегам