The web.xml configuration:
<?xml version="1.0"?> <!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> <!-- The filter used to publishRequestHandledEvent
to Spring. Should be mapped to the same url pattern than the FacesServlet. --> <filter> <filter-name>RequestHandled</filter-name> <filter-class>de.mindmatters.faces.spring.RequestHandledFilter</filter-class> </filter> <filter-mapping> <filter-name>RequestHandled</filter-name> <url-pattern>/faces/*</url-pattern> </filter-mapping> <!-- The listener used to load the parent application context (the spring beans). --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- The declaration of yourFacesServlet
. Map it to whatever url pattern you like. --> <servlet> <servlet-name>FacesServlet</servlet-name> <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>FacesServlet</servlet-name> <url-pattern>/faces/*</url-pattern> </servlet-mapping> </web-app>
A web.xml configuration with net.sourceforge.myfaces JSF-implementation 1.0.2 (because an internal spring-based VariableResolver is used a few features which are not supported by MyFaces yet, e.g. list-entries, map-entries..., are enabled):
<?xml version="1.0"?> <!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> <!-- The filter used to publishRequestHandledEvent
to Spring. Should be mapped to the same url pattern than the FacesServlet. --> <filter> <filter-name>RequestHandled</filter-name> <filter-class>org.springframework.web.jsf.RequestHandledFilter</filter-class> </filter> <filter-mapping> <filter-name>RequestHandled</filter-name> <url-pattern>/faces/*</url-pattern> </filter-mapping> <!-- The listener used to load the parent application context (the spring beans). --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- The declaration of MyFaces startup-listener. --> <listener> <listener-class>net.sourceforge.myfaces.webapp.StartupServletContextListener</listener-class> </listener> <!-- The declaration of yourFacesServlet
. Map it to whatever url pattern you like. --> <servlet> <servlet-name>FacesServlet</servlet-name> <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>FacesServlet</servlet-name> <url-pattern>/faces/*</url-pattern> </servlet-mapping> </web-app>
In this example, we just use two beans:
example.NameBean
name
public void action(ActionEvent event)
public void valueChanged(ValueChangeEvent event)
example.ReferencingBean
referencedBean
<!-- a purely JSF managed bean -->
<managed-bean>
<managed-bean-name>jsfBean</managed-bean-name>
<managed-bean-class>example.NameBean</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
<managed-property>
<property-name>name</property-name>
</managed-property>
</managed-bean>
<!-- a de.mindmatters.faces.spring.SpringBeanFactory
used to define the scope of a Spring managed bean -->
<managed-bean>
<managed-bean-name>scopedAccessSpringBean</managed-bean-name>
<managed-bean-class>de.mindmatters.faces.spring.SpringBeanFactory</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
<!-- a purely JSF managed bean that holds a reference to a Spring managed bean -->
<managed-bean>
<managed-bean-name>referencingBean</managed-bean-name>
<managed-bean-class>example.ReferencingBean</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
<managed-property>
<property-name>referencedBean</property-name>
<value>#{managedPropertyAccessSpringBean}</value>
</managed-property>
</managed-bean>
<!-- a purely Spring managed bean --> <bean id="directAccessSpringBean" class="example.NameBean"/> <!-- a Spring managed bean supplied with a scope within JSF --> <bean id="scopedAccessSpringBean" class="example.NameBean" singleton="false"/> <!-- a purely Spring managed bean being referenced by a JSF managed bean (but which of course can be accessed directly as well) -> <bean id="managedPropertyAccessSpringBean" class="example.NameBean" singleton="false"/>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %> <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %> <html> <head><title>test</title></head> <body bgcolor="white"> <f:view> <h:messages/> <h:form> purely JSF managed bean: <h:inputText value="#{jsfBean.name}" valueChangeListener="#{jsfBean.valueChanged}"/> <h:commandButton value="action" actionListener="#{jsfBean.action}"/> <br/> purely Spring managed bean: <h:inputText value="#{directAccessSpringBean.name}" valueChangeListener="#{directAccessSpringBean.valueChanged}"/> <h:commandButton value="action" actionListener="#{directAccessSpringBean.action}"/> <br/> scoped Spring managed bean: <h:inputText value="#{scopedAccessSpringBean.name}" valueChangeListener="#{scopedAccessSpringBean.valueChanged}"/> <h:commandButton value="action" actionListener="#{scopedAccessSpringBeanaction}"/> <br/> referenced Spring managed bean: <h:inputText value="#{referencingBean.referencedBean.name}" valueChangeListener="#{referencingBean.referencedBean.valueChanged}"/> <h:commandButton value="action" actionListener="#{referencingBean.referencedBean.action}"/> <br/> <h:commandButton id="submit" action="save" value="save"/> </h:form> </f:view> </body> </html>