jsf-отображение севлетов для * .jsp

Есть ли способ указать моему приложению, чтобы каждая страница (скажем, страницы .jsp) проходила в контексте лиц?

В моем web.xml я легко могу сделать отображение сервлетов, подобное:

<servlet-mapping>
   <servlet-name>Faces Servlet</servlet-name>
   <url-pattern>/faces/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
   <servlet-name>Faces Servlet</servlet-name>
   <url-pattern>*.jsf</url-pattern>
</servlet-mapping>

Где я могу сопоставить каждый URL-адрес, включая виртуальный путь /faces/ или заканчивающийся на .jsf, для обработки сервлетом, представляющим механизм jsf.

Но что, если я хочу, чтобы все в моем приложении находилось в контексте лиц? Я пробовал добавить:

<servlet-mapping>
   <servlet-name>Faces Servlet</servlet-name>
   <url-pattern>*.jsp</url-pattern>
</servlet-mapping>

Но вроде сразу вылетает приложение:

NAQ Exception in PhaseListener RESTORE_VIEW(1) afterPhase
java.lang.NullPointerException
 at net.sf.jsfcomp.clientvalidators.ValidatorResourceLoader.afterPhase(Unknown Source)
 at org.apache.myfaces.lifecycle.PhaseListenerManager.informPhaseListenersAfter(PhaseListenerManager.java:92)
 at org.apache.myfaces.lifecycle.LifecycleImpl.executePhase(LifecycleImpl.java:99)
 at org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:70)
 at javax.faces.webapp.FacesServlet.service(FacesServlet.java:139)
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
 at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:691)
 at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:469)
 at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:403)
 at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:301)
 at org.apache.myfaces.context.servlet.ServletExternalContextImpl.dispatch(ServletExternalContextImpl.java:419)
 at org.apache.myfaces.application.jsp.JspViewHandlerImpl.renderView(JspViewHandlerImpl.java:211)
 at it.asg.utility.viewhandlers.UrlParameterViewHandler.renderView(UrlParameterViewHandler.java:116)
 at org.apache.myfaces.lifecycle.RenderResponseExecutor.execute(RenderResponseExecutor.java:41)
 at org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:132)
 at javax.faces.webapp.FacesServlet.service(FacesServlet.java:140)
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
 at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:691)
 at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:469)
 at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:403)
 at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:301)
 at org.apache.myfaces.context.servlet.ServletExternalContextImpl.dispatch(ServletExternalContextImpl.java:419)
 at org.apache.myfaces.application.jsp.JspViewHandlerImpl.renderView(JspViewHandlerImpl.java:211)
 at it.asg.utility.viewhandlers.UrlParameterViewHandler.renderView(UrlParameterViewHandler.java:116)
 at org.apache.myfaces.lifecycle.RenderResponseExecutor.execute(RenderResponseExecutor.java:41)
 at org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:132)
 at javax.faces.webapp.FacesServlet.service(FacesServlet.java:140)

Что случилось? Есть ли способ разрешить контексту лиц работать на каждой странице в моем приложении?


person themarcuz    schedule 02.08.2010    source источник


Ответы (1)


Это невозможно, потому что *.jsp должен анализироваться встроенной функцией контейнера сервлетов JspServlet.

Теоретически вы можете использовать url-pattern из /*.

<servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>

Однако на практике это не сработает (запрещено FacesServlet), и это только добавит ненужные накладные расходы на запросы, которые не должны проходить через весь жизненный цикл JSF.

Старайтесь не думать / искать трудный / громоздкий путь. Просто используйте *.jsf и, если необходимо, добавьте ограничение безопасности на *.jsp, чтобы заблокировать прямой доступ к JSP, как я предлагал в вашем предыдущем вопросе < / а>. Это обычная практика.

Кроме того, вы также можете перейти с JSP на Facelets, который На основе XHTML / XML. Таким образом, вы можете использовать *.xhtml или даже *.html как суффикс Facelets и как отображение FacesServlet.

person BalusC    schedule 02.08.2010
comment
Проблема в том, что я работаю над существующим проектом, созданным годами, с тысячами ссылок на страницы jsp, которые на самом деле являются страницами jsf, и я искал способ избежать запуска всего проекта (jsp, jsf, javascript, html, java bean, таблица базы данных) и измените URL-адреса с суффиксом .jsf. Похоже, другого решения нет :( - person themarcuz; 03.08.2010
comment
У многих приличных текстовых редакторов есть опция поиска и замены во всех файлах. - person BalusC; 03.08.2010