В чем разница между созданием страниц JSF с расширением .jsp, .xhtml или .jsf? - PullRequest
50 голосов
/ 27 октября 2011

Я видел несколько примеров создания страниц JSF с расширением .jsp, другие примеры создания их с расширением .xhtml, а другие примеры выбирают .jsf. Я просто хотел бы знать, в чем разница между вышеуказанными расширениями при работе со страницами JSF и как выбрать подходящее расширение?

Ответы [ 2 ]

60 голосов
/ 27 октября 2011

JSP - это старая технология просмотра, широко используемая в сочетании с JSF 1.x. Facelets (некоторые люди, обобщенно обозначенные как XHTML ) являются преемниками JSP и представлены в качестве технологии просмотра JSF 2.x по умолчанию в конце 2009 года. Когда вы видели JSP, вы, возможно, читали устаревшие книги, учебные пособия или ресурсы, нацеленные на JSF 1.x. Как правило, вы должны игнорировать их при разработке с 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. .

Смотри также:

14 голосов
/ 27 октября 2011
Файлы

.jsp обычно используются для представлений JSF, определенных с помощью JavaServer Pages.Файлы .xhtml обычно используются для представлений JSF, определенных с помощью Facelets.

Это можно изменить с помощью конфигурации (например, см. Параметры конфигурации javax.faces.DEFAULT_SUFFIX и javax.faces.FACELETS_SUFFIX.)

Другие сопоставления расширений(*.jsf, *.faces), как правило, используются для обработки запросов через FacesServlet.Это логическое отображение представления, которое будет обрабатывать среда выполнения JSF.То, как обрабатываются отображения, определено в web.xml (это не нужно делать с использованием расширений; часто используется отображение /faces/*.

Из спецификации:

Отображение сервлета

Все запросы к веб-приложению сопоставляются с конкретным сервлетом на основе сопоставления шаблона 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, но приложения, которые полагаются на этот механизмs не будет переносимым.

...