Почему jsf не может обрабатывать страницы ошибок jsf?

#java #jsp #jsf #jsf-2

#java #jsp #jsf #jsf-2

Вопрос:

У меня есть страница с ошибкой error.jsf , упомянутая в web.xml :

 <error-page>
    <exception-type>javax.faces.application.ViewExpiredException</exception-type>
    <location>/viewExpired.jsp</location>
</error-page>
<error-page>
    <exception-type>java.lang.Throwable</exception-type>
    <location>/error.jsp</location>
</error-page>
  

Если файл .jsf, страница ошибки не запускается, когда я меняю ее на .jsp, все в порядке.
Я также внедрил фильтр, но все равно ничего.

 <filter>
    <filter-name>Error</filter-name>
    <filter-class>creazione.exception.MyFilter</filter-class>
</filter>
  

Это то, с чем JSF не может справиться?

ОБНОВИТЕ код с web.xml с сопоставлениями URL-адресов и шаблонов:

 <servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>2</load-on-startup>
</servlet>
<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>dispatcher</servlet-name>
    <url-pattern>*.html</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>*.jsf</url-pattern>
</servlet-mapping>
  

Ответ №1:

Это может произойти, если вы на самом деле используете Facelets в качестве технологии просмотра по умолчанию, стандартизированной в JSF 2.0. История ваших вопросов также подтверждает, что вы используете Facelets вместо его устаревшего предшественника JSP. Вам также нужно сделать эти страницы ошибок файлами Facelets вместо файлов JSP.

То, что фильтр не «работает», вызвано чем-то другим. Фильтры не имеют абсолютно никаких проблем для запуска в сочетании с JSF.

Комментарии:

1. Почему вы имеете в виду, что мне нужны файлы make the error pages Facelets? Если они есть .jsf еще не являются facelets? Я не понимаю…

2. JSP — это старая технология просмотра. Facelets (XHTML) является преемником JSP. JSF 2.0 использует Facelets по умолчанию. Файлы «.jsf» на самом деле не существуют на диске. Это виртуальные сопоставления URL, указывающие на конкретные файлы JSP (.jsp) или Facelet (.xhtml). JSF 2.0 использует Facelets по умолчанию.

3. Хотя моя страница error.xhtml предоставляется мне, она не обслуживается через FacesServlet. Я не знаю, упускаю ли я что-то здесь, но я пишу сервлет для использования в качестве <error-page> в web.xml , который перенаправит на мою страницу error.xhtml.

4.@Markos: шаблон URL должен совпадать FacesServlet <url-pattern> . Если у вас есть <location>/error.xhtml</location> , то он должен быть отображен *.xhtml , чтобы заставить его работать.

5. Да, сервлет Faces отображается в *.xhtml, А страница ошибок — error.xhtml . И мне подают страницу за пределами сервлета faces! Если я нажму на его URL напрямую, он будет обслуживаться сервлетом faces, как и ожидалось. У меня сложилось впечатление, что когда исключение генерируется внутри сервлета faces, оно перехватывается и обрабатывается контейнером, который перенаправляет на мою страницу error.xhtml, не обслуживая его через сервлет faces.