2010-08-02 3 views
1

Есть ли способ, которым я могу сообщить своему приложению, чтобы каждая страница (скажем, .jsp) могла находиться под контекстом лиц?jsf sevlet-mapping for * .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, подлежащая обработке сервлета rapresenting для 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) 

Что случилось? Есть ли способ, чтобы контекст лица работал для каждой страницы моего приложения?

ответ

4

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

В теории можно использовать url-pattern из /*.

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

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

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

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

+0

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

+0

У множества достойных текстовых редакторов есть опция «найти и заменить во всех файлах». – BalusC

 Смежные вопросы

  • Нет связанных вопросов^_^