I'm trying to user JSF-Spring 4.0 RC1 servlet de.mindmatters.faces.spring.context.servlet.FacesDispatcherServlet (just replaced
MyFaces servlet with JSF-Spring servlet).
This servlet doesn't seem to load any phase-listener embedded in faces-config.xml files located in some jars in WEB-INF/lib.
I've even tried to specify phase-listener in WEB-INF/faces-config.xml, but no way.
There's no stack trace, but when I activate debugger on method de.mindmatters.faces.lifecycle.LifecycleImpl#executePhase, I see
member listener.size()==0.
Has anyone had this problem ?
Here is my configuration for faces-confiog.xml & web.xml & faces-servlet.xml (quite long !).
In my sample, the phase listener is org.exadel.jsf.PhaseTracker.
faces-config.xml :
<?xml version="1.0"?>
<!DOCTYPE faces-config SYSTEM "web-facesconfig_1_1.dtd">
<render-kit>
<description>Some replacements for the standard renderers</description>
<renderer>
<description>Replacement renderer for h:outputLabel</description>
<component-family>javax.faces.Output</component-family>
<renderer-type>javax.faces.Label</renderer-type>
<renderer-class>org.firsttest.webapp.jsf.LabelRenderer</renderer-class>
</renderer>
<renderer>
<description>Replacement renderer for h:panelGrid that uses lists instead of tables</description>
<component-family>javax.faces.Panel</component-family>
<renderer-type>javax.faces.Grid</renderer-type>
<renderer-class>org.firsttest.webapp.jsf.PanelGridRenderer</renderer-class>
</renderer>
</render-kit>
web.xml :
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<display-name>firsttest</display-name>
<!-- precompiled jsp mappings -->
<!-- Define the default CSS Theme -->
<context-param>
<param-name>csstheme</param-name>
<param-value>simplicity</param-value>
</context-param>
<!-- Define the basename for a resource bundle for I18N -->
<context-param>
<param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name>
<param-value>ApplicationResources</param-value>
</context-param>
<!-- Fallback locale if no bundles found for browser's preferred locale -->
<!-- Force a single locale using param-name 'javax.servlet.jsp.jstl.fmt.locale' -->
<context-param>
<param-name>javax.servlet.jsp.jstl.fmt.fallbackLocale</param-name>
<param-value>en</param-value>
</context-param>
<!-- Context Configuration locations for Spring XML files -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext-*.xml,/WEB-INF/security.xml</param-value>
</context-param>
<!--
<context-param>
<param-name>org.ajax4jsf.VIEW_HANDLERS</param-name>
<param-value>com.sun.facelets.FaceletViewHandler</param-value>
</context-param>
-->
<!-- JSF related config -->
<context-param>
<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
<param-value>client</param-value>
<description>
State saving method: "client" or "server" (= default).
See JSF Specification 2.5.2
</description>
</context-param>
<context-param>
<param-name>javax.faces.DEFAULT_SUFFIX</param-name>
<param-value>.jsp</param-value>
</context-param>
<context-param>
<param-name>myfaces_allow_javascript</param-name>
<param-value>true</param-value>
<description>
This parameter tells MyFaces if javascript code should be allowed in the
rendered HTML output.
If javascript is allowed, command_link anchors will have javascript code
that submits the corresponding form.
If javascript is not allowed, the state saving info and nested parameters
will be added as url parameters.
Default: "true"
</description>
</context-param>
<context-param>
<param-name>myfaces_pretty_html</param-name>
<param-value>true</param-value>
<description>
If true, rendered HTML code will be formatted, so that it is "human readable".
i.e. additional line separators and whitespace will be written, that do not
influence the HTML code.
Default: "true"
</description>
</context-param>
<context-param>
<param-name>org.apache.myfaces.COMPRESS_STATE_IN_CLIENT</param-name>
<param-value>true</param-value>
<description>
Use this context parameter to enable compression in MyFaces version 1.1.4 and later.
</description>
</context-param>
<context-param>
<param-name>org.exadel.helper.phaseTracker.cphase</param-name>
<param-value>ANY_PHASE</param-value>
<description>Loggue les phase JSF - a commenter en prod</description>
</context-param>
<!-- Tiles related config -->
<context-param>
<param-name>definitions-config</param-name>
<param-value>/WEB-INF/tiles-defs.xml</param-value>
<description>Fichier de configuration Tiles</description>
</context-param>
<listener>
<listener-class>tmp.pag.ListenerContext</listener-class>
</listener>
<listener>
<listener-class>com.opensymphony.clickstream.ClickstreamListener</listener-class>
</listener>
<listener>
<listener-class>net.sf.navigator.menu.MenuContextListener</listener-class>
</listener>
<listener>
<listener-class>org.apache.myfaces.webapp.StartupServletContextListener</listener-class>
</listener>
<listener>
<listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
</listener>
<listener>
<listener-class>org.firsttest.webapp.listener.StartupListener</listener-class>
</listener>
<listener>
<listener-class>org.firsttest.webapp.listener.UserCounterListener</listener-class>
</listener>
<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener2</listener-class>
</listener>
<listener>
<!-- Ce listener doit etre place derriere le listener org.springframework.web.context.request.RequestContextListener -->
<listener-class>de.mindmatters.faces.spring.context.ContextLoaderListener</listener-class>
</listener>
<listener>
<listener-class>org.apache.tiles.listener.TilesListener</listener-class>
</listener>
<servlet>
<servlet-name>faces</servlet-name>
<!--servlet-class>javax.faces.webapp.FacesServlet</servlet-class-->
<!--chgt2servlet-class>org.apache.myfaces.webapp.MyFacesServlet</servlet-class-->
<!-- TODO : ce changement permet d utiliser theme et gestion d erreur, mais plus
fonctions myfaces i.e. compression, ... -->
<servlet-class>de.mindmatters.faces.spring.context.servlet.FacesDispatcherServlet</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet>
<!-- TODO : added temporary to load on startup faces servlet -->
<servlet-name>myfaces</servlet-name>
<servlet-class>org.apache.myfaces.webapp.MyFacesServlet</servlet-class>
<load-on-startup>3</load-on-startup>
</servlet>
<!--
Ce controleur delegue le traitement de la requete a la page JSF.
Exemple :
requete browser = http://localhost:9082/firsttest/login.faces
servlet faces mappee sur *.faces
en utilisant un prefixe = / et suffixe = .jsp, ce controlleur
delegue a la page jsp /login.jsp
-->
<bean name="/*"
class="org.springframework.web.servlet.mvc.UrlFilenameViewController">
<property name="prefix" value="/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
If I correctly understand the implementation, FacesDispatcherServlet uses it's own lifecycle id : JSF_SPRING_DEFAULT, and not the default one (DEFAULT).
If I use myfaces servlet to load jsf resources (such as phase-listener) no problem, I see that the listener list of the DEFAULT lifecycle is built (using all listeners in faces-config.xml files).
If I use jsf-spring FacesDispatcher servlet to load jsf resources (such as phase-listener), I see that the phase listener list of the JSF_SPRING_DEFAULT lifecycle is NOT built from faces-config.xml.
So I think it is really a bug in jsf spring.
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
the integration of Spring MVC which is shipped with JSF-Spring creates *two* JSF-Lifecycles. All requests mapped against the 'de.mindmatters.faces.spring.context.servlet.FacesController' will use the default Lifecycle of the underlying JSF-Implementation (e.g. MyFaces). All other 'proprietary' Controllers are running in a JSF-Spring specific Lifecycle. Solution:
Build a WEB-INF/faces-spring-context.xml configuration file as follows (will be read automatically by JSF-Spring):
I understand now (but it's a pity : I'm using quite a few external libraries bundling their faces-config.xml files -> I'll just have to copy their content in faces-spring-XXX.xml).
Thank you very much for your help !
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
I understand your problem. I'm currently implementing version 4.1 with jsf 1.2 support. Maybe i get it configurable reading the 'default' phase-listeners for the JSF-Spring specific Lifecycle. But don't ask me when it's ready ;-)
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Hello,
I'm trying to user JSF-Spring 4.0 RC1 servlet de.mindmatters.faces.spring.context.servlet.FacesDispatcherServlet (just replaced
MyFaces servlet with JSF-Spring servlet).
This servlet doesn't seem to load any phase-listener embedded in faces-config.xml files located in some jars in WEB-INF/lib.
I've even tried to specify phase-listener in WEB-INF/faces-config.xml, but no way.
There's no stack trace, but when I activate debugger on method de.mindmatters.faces.lifecycle.LifecycleImpl#executePhase, I see
member listener.size()==0.
Has anyone had this problem ?
Here is my configuration for faces-confiog.xml & web.xml & faces-servlet.xml (quite long !).
In my sample, the phase listener is org.exadel.jsf.PhaseTracker.
faces-config.xml :
<?xml version="1.0"?>
<!DOCTYPE faces-config SYSTEM "web-facesconfig_1_1.dtd">
<faces-config>
<!-- Spring VariableResolver for JSF -->
<application>
<variable-resolver>org.springframework.web.jsf.DelegatingVariableResolver</variable-resolver>
<locale-config>
<default-locale>en</default-locale>
<supported-locale>en</supported-locale>
<supported-locale>es</supported-locale>
<supported-locale>de</supported-locale>
<supported-locale>fr</supported-locale>
<supported-locale>nl</supported-locale>
<supported-locale>pt_BR</supported-locale>
<supported-locale>zh_CN</supported-locale>
</locale-config>
<message-bundle>ApplicationResources</message-bundle>
</application>
<component>
<component-type>net.sf.jsfcomp.acegijsf.Authorize</component-type>
<component-class>net.sf.jsfcomp.acegijsf.Authorize</component-class>
</component>
<component>
<component-type>net.sf.jsfcomp.acegijsf.Authentication</component-type>
<component-class>net.sf.jsfcomp.acegijsf.Authentication</component-class>
</component>
<component>
<component-type>com.corejsf.validator.UIValidatorScript</component-type>
<component-class>com.corejsf.validator.UIValidatorScript</component-class>
</component>
<navigation-rule>
<from-view-id>/mainMenu.jsp</from-view-id>
<navigation-case>
<from-action>ajax4jsf</from-action>
<to-view-id>/ajax4jsf.jsp</to-view-id>
</navigation-case>
</navigation-rule>
<!--
<navigation-rule>
<from-view-id>/*</from-view-id>
<navigation-case>
<from-action>selectFile</from-action>
<to-view-id>/selectFile.jsp</to-view-id>
</navigation-case>
</navigation-rule>
-->
<navigation-rule>
<from-view-id>/*</from-view-id>
<navigation-case>
<from-outcome>mainMenu</from-outcome>
<to-view-id>/mainMenu.jsp</to-view-id>
<redirect/>
</navigation-case>
</navigation-rule>
<navigation-rule>
<from-view-id>/*</from-view-id>
<navigation-case>
<from-outcome>editProfile</from-outcome>
<to-view-id>/userForm.jsp</to-view-id>
</navigation-case>
</navigation-rule>
<navigation-rule>
<from-view-id>/userList.jsp</from-view-id>
<navigation-case>
<from-outcome>add</from-outcome>
<to-view-id>/userForm.jsp</to-view-id>
</navigation-case>
</navigation-rule>
<navigation-rule>
<from-view-id>/userForm.jsp</from-view-id>
<navigation-case>
<from-outcome>cancel</from-outcome>
<to-view-id>/userList.jsp</to-view-id>
<redirect/>
</navigation-case>
<navigation-case>
<from-outcome>list</from-outcome>
<to-view-id>/userList.jsp</to-view-id>
<redirect/>
</navigation-case>
</navigation-rule>
<navigation-rule>
<from-view-id>/selectFile.jsp</from-view-id>
<navigation-case>
<from-outcome>success</from-outcome>
<to-view-id>/showFile.jsp</to-view-id>
</navigation-case>
</navigation-rule>
<navigation-rule>
<from-view-id>/signup.jsp</from-view-id>
<navigation-case>
<from-outcome>cancel</from-outcome>
<to-view-id>/login.jsp</to-view-id>
<redirect/>
</navigation-case>
</navigation-rule>
<navigation-rule>
<from-view-id>/passwordHint.jsp</from-view-id>
<navigation-case>
<from-outcome>success</from-outcome>
<to-view-id>/login.jsp</to-view-id>
<redirect/>
</navigation-case>
</navigation-rule>
<!--Portefeuille-NAV-START-->
<navigation-rule>
<from-view-id>/portefeuille/portefeuilles.xhtml</from-view-id>
<navigation-case>
<from-outcome>add</from-outcome>
<to-view-id>/portefeuille/portefeuilleForm.xhtml</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>edit</from-outcome>
<to-view-id>/portefeuille/portefeuilleForm.xhtml</to-view-id>
</navigation-case>
</navigation-rule>
<navigation-rule>
<from-view-id>/portefeuille/portefeuilleForm.xhtml</from-view-id>
<navigation-case>
<from-outcome>cancel</from-outcome>
<to-view-id>/portefeuille/portefeuilles.xhtml</to-view-id>
<redirect/>
</navigation-case>
<navigation-case>
<from-outcome>list</from-outcome>
<to-view-id>/portefeuille/portefeuilles.xhtml</to-view-id>
<redirect/>
</navigation-case>
</navigation-rule>
<!--Portefeuille-NAV-END-->
<!-- Add additional rules here -->
<managed-bean>
<managed-bean-name>basePage</managed-bean-name>
<managed-bean-class>org.firsttest.webapp.action.BasePage</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
<managed-bean>
<managed-bean-name>userList</managed-bean-name>
<managed-bean-class>org.firsttest.webapp.action.UserList</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
<managed-property>
<property-name>userManager</property-name>
<value>#{userManager}</value>
</managed-property>
</managed-bean>
<managed-bean>
<managed-bean-name>userForm</managed-bean-name>
<managed-bean-class>org.firsttest.webapp.action.UserForm</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
<managed-property>
<property-name>username</property-name>
<value>#{param.username}</value>
</managed-property>
<managed-property>
<property-name>userManager</property-name>
<value>#{userManager}</value>
</managed-property>
<managed-property>
<property-name>roleManager</property-name>
<value>#{roleManager}</value>
</managed-property>
<managed-property>
<property-name>mailEngine</property-name>
<value>#{mailEngine}</value>
</managed-property>
<managed-property>
<property-name>message</property-name>
<value>#{mailMessage}</value>
</managed-property>
<managed-property>
<property-name>templateName</property-name>
<value>accountCreated.vm</value>
</managed-property>
</managed-bean>
<managed-bean>
<managed-bean-name>signupForm</managed-bean-name>
<managed-bean-class>org.firsttest.webapp.action.SignupForm</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
<managed-property>
<property-name>userManager</property-name>
<value>#{userManager}</value>
</managed-property>
<managed-property>
<property-name>roleManager</property-name>
<value>#{roleManager}</value>
</managed-property>
<managed-property>
<property-name>mailEngine</property-name>
<value>#{mailEngine}</value>
</managed-property>
<managed-property>
<property-name>message</property-name>
<value>#{mailMessage}</value>
</managed-property>
<managed-property>
<property-name>templateName</property-name>
<value>accountCreated.vm</value>
</managed-property>
</managed-bean>
<managed-bean>
<managed-bean-name>passwordHint</managed-bean-name>
<managed-bean-class>org.firsttest.webapp.action.PasswordHint</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
<managed-property>
<property-name>username</property-name>
<value>#{param.username}</value>
</managed-property>
<managed-property>
<property-name>userManager</property-name>
<value>#{userManager}</value>
</managed-property>
<managed-property>
<property-name>mailEngine</property-name>
<value>#{mailEngine}</value>
</managed-property>
<managed-property>
<property-name>message</property-name>
<value>#{mailMessage}</value>
</managed-property>
<managed-property>
<property-name>templateName</property-name>
<value>accountCreated.vm</value>
</managed-property>
</managed-bean>
<managed-bean>
<managed-bean-name>fileUpload</managed-bean-name>
<managed-bean-class>org.firsttest.webapp.action.FileUpload</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
<managed-bean>
<managed-bean-name>reload</managed-bean-name>
<managed-bean-class>org.firsttest.webapp.action.Reload</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
<managed-bean>
<managed-bean-name>activeUserList</managed-bean-name>
<managed-bean-class>org.firsttest.webapp.action.ActiveUserList</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
<!--Portefeuille-BEAN-START-->
<managed-bean>
<managed-bean-name>portefeuilleList</managed-bean-name>
<managed-bean-class>org.firsttest.portefeuille.webapp.action.PortefeuilleList</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
<managed-property>
<property-name>portefeuilleManager</property-name>
<value>#{portefeuilleManager}</value>
</managed-property>
</managed-bean>
<managed-bean>
<managed-bean-name>portefeuilleForm</managed-bean-name>
<managed-bean-class>org.firsttest.portefeuille.webapp.action.PortefeuilleForm</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
<managed-property>
<property-name>id</property-name>
<value>#{param.id}</value>
</managed-property>
<managed-property>
<property-name>portefeuilleManager</property-name>
<value>#{portefeuilleManager}</value>
</managed-property>
</managed-bean>
<!--Portefeuille-BEAN-END-->
<!-- Add additional beans here -->
<render-kit>
<description>Some replacements for the standard renderers</description>
<renderer>
<description>Replacement renderer for h:outputLabel</description>
<component-family>javax.faces.Output</component-family>
<renderer-type>javax.faces.Label</renderer-type>
<renderer-class>org.firsttest.webapp.jsf.LabelRenderer</renderer-class>
</renderer>
<renderer>
<description>Replacement renderer for h:panelGrid that uses lists instead of tables</description>
<component-family>javax.faces.Panel</component-family>
<renderer-type>javax.faces.Grid</renderer-type>
<renderer-class>org.firsttest.webapp.jsf.PanelGridRenderer</renderer-class>
</renderer>
</render-kit>
<!--lifecycle>
<phase-listener>org.apache.shale.view.faces.ViewPhaseListener</phase-listener>
</lifecycle-->
<lifecycle>
<phase-listener>org.exadel.jsf.PhaseTracker</phase-listener>
</lifecycle>
<validator>
<validator-id>com.corejsf.validator.CommonsValidator</validator-id>
<validator-class>com.corejsf.validator.CommonsValidator</validator-class>
</validator>
</faces-config>
web.xml :
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<display-name>firsttest</display-name>
<!-- precompiled jsp mappings -->
<!-- Define the default CSS Theme -->
<context-param>
<param-name>csstheme</param-name>
<param-value>simplicity</param-value>
</context-param>
<!-- Define the basename for a resource bundle for I18N -->
<context-param>
<param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name>
<param-value>ApplicationResources</param-value>
</context-param>
<!-- Fallback locale if no bundles found for browser's preferred locale -->
<!-- Force a single locale using param-name 'javax.servlet.jsp.jstl.fmt.locale' -->
<context-param>
<param-name>javax.servlet.jsp.jstl.fmt.fallbackLocale</param-name>
<param-value>en</param-value>
</context-param>
<!-- Context Configuration locations for Spring XML files -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext-*.xml,/WEB-INF/security.xml</param-value>
</context-param>
<!--
<context-param>
<param-name>org.ajax4jsf.VIEW_HANDLERS</param-name>
<param-value>com.sun.facelets.FaceletViewHandler</param-value>
</context-param>
-->
<!-- JSF related config -->
<context-param>
<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
<param-value>client</param-value>
<description>
State saving method: "client" or "server" (= default).
See JSF Specification 2.5.2
</description>
</context-param>
<context-param>
<param-name>javax.faces.DEFAULT_SUFFIX</param-name>
<param-value>.jsp</param-value>
</context-param>
<context-param>
<param-name>myfaces_allow_javascript</param-name>
<param-value>true</param-value>
<description>
This parameter tells MyFaces if javascript code should be allowed in the
rendered HTML output.
If javascript is allowed, command_link anchors will have javascript code
that submits the corresponding form.
If javascript is not allowed, the state saving info and nested parameters
will be added as url parameters.
Default: "true"
</description>
</context-param>
<context-param>
<param-name>myfaces_pretty_html</param-name>
<param-value>true</param-value>
<description>
If true, rendered HTML code will be formatted, so that it is "human readable".
i.e. additional line separators and whitespace will be written, that do not
influence the HTML code.
Default: "true"
</description>
</context-param>
<context-param>
<param-name>org.apache.myfaces.COMPRESS_STATE_IN_CLIENT</param-name>
<param-value>true</param-value>
<description>
Use this context parameter to enable compression in MyFaces version 1.1.4 and later.
</description>
</context-param>
<context-param>
<param-name>org.exadel.helper.phaseTracker.cphase</param-name>
<param-value>ANY_PHASE</param-value>
<description>Loggue les phase JSF - a commenter en prod</description>
</context-param>
<!-- Tiles related config -->
<context-param>
<param-name>definitions-config</param-name>
<param-value>/WEB-INF/tiles-defs.xml</param-value>
<description>Fichier de configuration Tiles</description>
</context-param>
<filter>
<filter-name>ajax4jsf</filter-name>
<filter-class>org.ajax4jsf.Filter</filter-class>
</filter>
<filter>
<filter-name>securityFilter</filter-name>
<filter-class>org.acegisecurity.util.FilterToBeanProxy</filter-class>
<init-param>
<param-name>targetBean</param-name>
<param-value>filterChainProxy</param-value>
</init-param>
</filter>
<filter>
<filter-name>cacheFilter</filter-name>
<filter-class>com.opensymphony.oscache.web.filter.CacheFilter</filter-class>
</filter>
<filter>
<filter-name>clickstreamFilter</filter-name>
<filter-class>com.opensymphony.clickstream.ClickstreamFilter</filter-class>
</filter>
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter>
<filter-name>hibernateFilter</filter-name>
<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter>
<filter-name>rewriteFilter</filter-name>
<filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
<init-param>
<param-name>logLevel</param-name>
<param-value>commons</param-value>
</init-param>
</filter>
<filter>
<filter-name>exportFilter</filter-name>
<filter-class>org.displaytag.filter.ResponseOverrideFilter</filter-class>
</filter>
<filter>
<filter-name>extensionsFilter</filter-name>
<filter-class>org.apache.myfaces.webapp.filter.ExtensionsFilter</filter-class>
<init-param>
<param-name>maxFileSize</param-name>
<param-value>2m</param-value>
</init-param>
</filter>
<filter>
<filter-name>gzipFilter</filter-name>
<filter-class>net.sf.ehcache.constructs.web.filter.GzipFilter</filter-class>
</filter>
<filter>
<filter-name>messageFilter</filter-name>
<filter-class>org.firsttest.webapp.filter.MessageFilter</filter-class>
</filter>
<filter>
<filter-name>localeFilter</filter-name>
<filter-class>org.firsttest.webapp.filter.LocaleFilter</filter-class>
</filter>
<filter>
<filter-name>SysoutFilter</filter-name>
<display-name>SysoutFilter</display-name>
<description>TODO : temp</description>
<filter-class>tmp.pag.SysoutFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>SysoutFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/j_security_check</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/dwr/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>*.faces</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>*.jsf</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>securityFilter</filter-name>
<url-pattern>/j_security_check</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>securityFilter</filter-name>
<url-pattern>/dwr/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>securityFilter</filter-name>
<url-pattern>*.faces</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>securityFilter</filter-name>
<url-pattern>*.jsf</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>securityFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>ajax4jsf</filter-name>
<servlet-name>faces</servlet-name>
<!--dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher-->
</filter-mapping>
<!-- Commented out for 2 reasons: 1) it's a pain when developing JSPs, and
2) it causes the Signup webtest to fail -->
<!--filter-mapping>
<filter-name>cacheFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping-->
<filter-mapping>
<filter-name>hibernateFilter</filter-name>
<url-pattern>*.faces</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>clickstreamFilter</filter-name>
<url-pattern>*.faces</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>localeFilter</filter-name>
<url-pattern>*.faces</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>localeFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>exportFilter</filter-name>
<url-pattern>*.faces</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>gzipFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>rewriteFilter</filter-name>
<url-pattern>/*</url-pattern>
<!--dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher-->
</filter-mapping>
<filter-mapping>
<filter-name>messageFilter</filter-name>
<url-pattern>*.faces</url-pattern>
<!--dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher-->
</filter-mapping>
<filter-mapping>
<filter-name>extensionsFilter</filter-name>
<servlet-name>faces</servlet-name>
</filter-mapping>
<filter-mapping>
<filter-name>extensionsFilter</filter-name>
<url-pattern>/faces/myFacesExtensionResource/*</url-pattern>
</filter-mapping>
<listener>
<listener-class>tmp.pag.ListenerContext</listener-class>
</listener>
<listener>
<listener-class>com.opensymphony.clickstream.ClickstreamListener</listener-class>
</listener>
<listener>
<listener-class>net.sf.navigator.menu.MenuContextListener</listener-class>
</listener>
<listener>
<listener-class>org.apache.myfaces.webapp.StartupServletContextListener</listener-class>
</listener>
<listener>
<listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
</listener>
<listener>
<listener-class>org.firsttest.webapp.listener.StartupListener</listener-class>
</listener>
<listener>
<listener-class>org.firsttest.webapp.listener.UserCounterListener</listener-class>
</listener>
<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener2</listener-class>
</listener>
<listener>
<!-- Ce listener doit etre place derriere le listener org.springframework.web.context.request.RequestContextListener -->
<listener-class>de.mindmatters.faces.spring.context.ContextLoaderListener</listener-class>
</listener>
<listener>
<listener-class>org.apache.tiles.listener.TilesListener</listener-class>
</listener>
<servlet>
<servlet-name>faces</servlet-name>
<!--servlet-class>javax.faces.webapp.FacesServlet</servlet-class-->
<!--chgt2servlet-class>org.apache.myfaces.webapp.MyFacesServlet</servlet-class-->
<!-- TODO : ce changement permet d utiliser theme et gestion d erreur, mais plus
fonctions myfaces i.e. compression, ... -->
<servlet-class>de.mindmatters.faces.spring.context.servlet.FacesDispatcherServlet</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet>
<!-- TODO : added temporary to load on startup faces servlet -->
<servlet-name>myfaces</servlet-name>
<servlet-class>org.apache.myfaces.webapp.MyFacesServlet</servlet-class>
<load-on-startup>3</load-on-startup>
</servlet>
<servlet>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>faces</servlet-name>
<url-pattern>*.faces</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>faces</servlet-name>
<url-pattern>*.jsf</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>10</session-timeout>
</session-config>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<error-page>
<error-code>500</error-code>
<location>/error.jsp</location>
</error-page>
<error-page>
<error-code>400</error-code>
<location>/index.jsp</location>
</error-page>
<error-page>
<error-code>403</error-code>
<location>/403.faces</location>
</error-page>
<error-page>
<error-code>404</error-code>
<location>/404.faces</location>
</error-page>
</web-app>
faces-servlet.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
<!--
Ce controleur delegue le traitement de la requete a la page JSF.
Exemple :
requete browser = http://localhost:9082/firsttest/login.faces
servlet faces mappee sur *.faces
en utilisant un prefixe = / et suffixe = .jsp, ce controlleur
delegue a la page jsp /login.jsp
-->
<bean name="/*"
class="org.springframework.web.servlet.mvc.UrlFilenameViewController">
<property name="prefix" value="/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
If I correctly understand the implementation, FacesDispatcherServlet uses it's own lifecycle id : JSF_SPRING_DEFAULT, and not the default one (DEFAULT).
If I use myfaces servlet to load jsf resources (such as phase-listener) no problem, I see that the listener list of the DEFAULT lifecycle is built (using all listeners in faces-config.xml files).
If I use jsf-spring FacesDispatcher servlet to load jsf resources (such as phase-listener), I see that the phase listener list of the JSF_SPRING_DEFAULT lifecycle is NOT built from faces-config.xml.
So I think it is really a bug in jsf spring.
No, it's not. See my posting a few minutes ago.
Hello,
the integration of Spring MVC which is shipped with JSF-Spring creates *two* JSF-Lifecycles. All requests mapped against the 'de.mindmatters.faces.spring.context.servlet.FacesController' will use the default Lifecycle of the underlying JSF-Implementation (e.g. MyFaces). All other 'proprietary' Controllers are running in a JSF-Spring specific Lifecycle. Solution:
Build a WEB-INF/faces-spring-context.xml configuration file as follows (will be read automatically by JSF-Spring):
<?xml version="1.0" encoding="UTF-8"?>
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:jsf="http://jsf-spring.sourceforge.net/schema/jsf"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://jsf-spring.sourceforge.net/schema/jsf http://jsf-spring.sourceforge.net/schema/jsf/jsf-spring.xsd">
<jsf:phase-listener lifecycle-id="JSF_SPRING_DEFAULT" class="foo.BarPhaseListener"/> <!-- for JSF-SPring specific Lifecycle -->
<jsf:phase-listener lifecycle-id="DEFAULT" class="foo.BarPhaseListener"/> <!-- for defaultLifecycle -->
</beans>
BTW
If you use JSF-Spring, please remove the Spring DelegatingResolver; JSF-Spring automatically deploys its own.
Sorry, I couldn't read your previous email.
I understand now (but it's a pity : I'm using quite a few external libraries bundling their faces-config.xml files -> I'll just have to copy their content in faces-spring-XXX.xml).
Thank you very much for your help !
I understand your problem. I'm currently implementing version 4.1 with jsf 1.2 support. Maybe i get it configurable reading the 'default' phase-listeners for the JSF-Spring specific Lifecycle. But don't ask me when it's ready ;-)
Great !
Note bene : will it work for JSF 1.1 components and external librairies ?
yes