JSF 2 + Spring 3 integration example – [Link] [Link]
JSF 2 + Spring 3 integration example –
[Link]
mkyong
In this tutorial, we will show you how to integrate JSF 2.0 with Spring 3 using :
1. JSF XML [Link]
2. Spring annotations
3. JSR-330 standard injection
Tools and technologies used :
1. JSF 2.1.13
2. Spring [Link]
3. Maven 3
4. Eclipse 4.2
5. Tomcat 6 or 7
1. Directory Structure
A standard Maven project for demonstration.
1 of 11 11/10/18, 10:36 PM
JSF 2 + Spring 3 integration example – [Link] [Link]
2. Project Dependencies
Declares JSF 2, Spring 3, JSR-330 inject, and Tomcat’s dependencies.
[Link]
<project xmlns="[Link]
xmlns:xsi="[Link]
xsi:schemaLocation="[Link]
[Link]
<modelVersion>4.0.0</modelVersion>
<groupId>[Link]</groupId>
<artifactId>JavaServerFaces</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>JavaServerFaces Maven Webapp</name>
<url>[Link]
<dependencies>
<!-- Spring framework -->
<dependency>
<groupId>[Link]</groupId>
2 of 11 11/10/18, 10:36 PM
JSF 2 + Spring 3 integration example – [Link] [Link]
<artifactId>spring-core</artifactId>
<version>[Link]</version>
</dependency>
<dependency>
<groupId>[Link]</groupId>
<artifactId>spring-web</artifactId>
<version>[Link]</version>
</dependency>
<!-- JSR-330 -->
<dependency>
<groupId>[Link]</groupId>
<artifactId>[Link]</artifactId>
<version>1</version>
</dependency>
<!-- JSF -->
<dependency>
<groupId>[Link]</groupId>
<artifactId>jsf-api</artifactId>
<version>2.1.13</version>
</dependency>
<dependency>
<groupId>[Link]</groupId>
<artifactId>jsf-impl</artifactId>
<version>2.1.13</version>
</dependency>
<dependency>
<groupId>[Link]</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>[Link]</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>[Link]</groupId>
<artifactId>jsp-api</artifactId>
<version>2.1</version>
</dependency>
<!-- EL -->
<dependency>
<groupId>[Link]</groupId>
<artifactId>el-impl</artifactId>
<version>2.2</version>
</dependency>
<!-- Tomcat 6 need this -->
<dependency>
<groupId>[Link]</groupId>
<artifactId>el-ri</artifactId>
<version>1.0</version>
</dependency>
3 of 11 11/10/18, 10:36 PM
JSF 2 + Spring 3 integration example – [Link] [Link]
</dependencies>
<build>
<finalName>JavaServerFaces</finalName>
<plugins>
<plugin>
<groupId>[Link]</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.1</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
3. JSF 2 + Spring Integration
Spring’s bean in Spring Ioc context, and JSF’s managed bean in JSF Ioc context, how
to make both working together? The solution is defined Spring’s
SpringBeanFacesELResolver in [Link]. Check this official Spring guide.
[Link]
<?xml version="1.0" encoding="UTF-8"?>
<faces-config xmlns="[Link]
xmlns:xsi="[Link]
xsi:schemaLocation="[Link]
[Link]
version="2.1">
<application>
<el-resolver>
[Link]
</el-resolver>
</application>
</faces-config>
See following 3 examples to inject Spring’s bean in JSF managed bean.
3.1. XML Schema Example
Many developers still prefer to use XML to manage beans. With
SpringBeanFacesELResolver, just uses EL ${userBo} to inject Spring’s bean into JSF’s
managed bean.
[Link]
4 of 11 11/10/18, 10:36 PM
JSF 2 + Spring 3 integration example – [Link] [Link]
package [Link];
public interface UserBo{
public String getMessage();
[Link]
package [Link];
import [Link];
public class UserBoImpl implements UserBo{
public String getMessage() {
return "JSF 2 + Spring Integration";
[Link] – JSF backing bean
package [Link];
import [Link];
import [Link];
public class UserBean{
//later inject in [Link]
UserBo userBo;
public void setUserBo(UserBo userBo) {
[Link] = userBo;
}
public String printMsgFromSpring() {
return [Link]();
[Link] – Declares userBo bean
<beans xmlns="[Link]
xmlns:xsi="[Link]
xsi:schemaLocation="[Link]
[Link]
5 of 11 11/10/18, 10:36 PM
JSF 2 + Spring 3 integration example – [Link] [Link]
<bean id="userBo" class="[Link]"></bean>
</beans>
[Link] – Declares managed bean and inject userBo
<?xml version="1.0" encoding="UTF-8"?>
<faces-config
xmlns="[Link]
xmlns:xsi="[Link]
xsi:schemaLocation="[Link]
[Link]
version="2.0">
<managed-bean>
<managed-bean-name>user</managed-bean-name>
<managed-bean-class>[Link]</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
<managed-property>
<property-name>userBo</property-name>
<value>#{userBo}</value>
</managed-property>
</managed-bean>
</faces-config>
3.2. Spring Annotations – Auto Scan
This example is using Spring annotations. Injects like a normal bean with
@ManagedBean, @Autowired and @Component, it just works as expected.
[Link]
package [Link];
import [Link];
import [Link];
@Service
public class UserBoImpl implements UserBo{
public String getMessage() {
return "JSF 2 + Spring Integration";
[Link]
package [Link];
6 of 11 11/10/18, 10:36 PM
JSF 2 + Spring 3 integration example – [Link] [Link]
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
@Component
@ManagedBean
@SessionScoped
public class UserBean{
@Autowired
UserBo userBo;
public void setUserBo(UserBo userBo) {
[Link] = userBo;
}
public String printMsgFromSpring() {
return [Link]();
}
[Link] – Enable the component auto scan
<beans xmlns="[Link]
xmlns:xsi="[Link]
xmlns:context="[Link]
xsi:schemaLocation="[Link]
[Link]
[Link]
[Link]
<context:component-scan base-package="[Link]" />
</beans>
Mixed use of both JSF and Spring annotations are working fine, but it look weird
and duplicated – @Component and @ManagedBean together. Actually, you can just uses a
single @Component, see following new version, it’s pure Spring, and it works!
[Link]
package [Link];
import [Link];
import [Link];
import [Link];
import [Link];
@Component
@Scope("session")
public class UserBean{
7 of 11 11/10/18, 10:36 PM
JSF 2 + Spring 3 integration example – [Link] [Link]
@Autowired
UserBo userBo;
public void setUserBo(UserBo userBo) {
[Link] = userBo;
}
public String printMsgFromSpring() {
return [Link]();
}
3.3. JSR-330 Annotation
Since Spring 3.0, Spring offer supports for JSR-330 injection standard. Now, you can
uses @Inject to replace for @Autowired and @Named for @Component. This is
recommended to solution, follow JSR-330 standard make the application more
portable to other environments, and it works fine in Spring framework.
[Link]
package [Link];
import [Link];
import [Link];
@Named
public class UserBoImpl implements UserBo{
public String getMessage() {
return "JSF 2 + Spring Integration";
[Link]
package [Link];
import [Link];
import [Link];
import [Link];
import [Link];
@Named
@Scope("session") //need this, JSR-330 in Spring context is singleton by default
public class UserBean {
@Inject
UserBo userBo;
8 of 11 11/10/18, 10:36 PM
JSF 2 + Spring 3 integration example – [Link] [Link]
public void setUserBo(UserBo userBo) {
[Link] = userBo;
}
public String printMsgFromSpring() {
return [Link]();
}
[Link] – Need component auto scan also
<beans xmlns="[Link]
xmlns:xsi="[Link]
xmlns:context="[Link]
xsi:schemaLocation="[Link]
[Link]
[Link]
[Link]
<context:component-scan base-package="[Link]" />
</beans>
4. Demo
Example in 3.1, 3.2 and 3.3 are doing exactly the thing – Inject userBo into JSF bean,
just different implementation. Now, create a simple JSF page to show the the result.
[Link]
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"[Link]
<html xmlns="[Link]
xmlns:h="[Link]
>
<h:body>
<h1>JSF 2.0 + Spring Example</h1>
#{[Link]()}
</h:body>
</html>
[Link]
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="[Link]
9 of 11 11/10/18, 10:36 PM
JSF 2 + Spring 3 integration example – [Link] [Link]
xmlns="[Link]
xmlns:web="[Link]
xsi:schemaLocation="[Link]
[Link]
id="WebApp_ID" version="2.5">
<display-name>JavaServerFaces</display-name>
<!-- Add Support for Spring -->
<listener>
<listener-class>
[Link]
</listener-class>
</listener>
<listener>
<listener-class>
[Link]
</listener-class>
</listener>
<!-- Change to "Production" when you are ready to deploy -->
<context-param>
<param-name>[Link].PROJECT_STAGE</param-name>
<param-value>Development</param-value>
</context-param>
<!-- Welcome page -->
<welcome-file-list>
<welcome-file>[Link]</welcome-file>
</welcome-file-list>
<!-- JSF Mapping -->
<servlet>
<servlet-name>facesServlet</servlet-name>
<servlet-class>[Link]</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>facesServlet</servlet-name>
<url-pattern>*.jsf</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>facesServlet</servlet-name>
<url-pattern>*.xhtml</url-pattern>
</servlet-mapping>
</web-app>
Done, see output : [Link]
10 of 11 11/10/18, 10:36 PM
JSF 2 + Spring 3 integration example – [Link] [Link]
Download Source Code
References
1. Spring reference – SpringBeanFacesELResolver
2. Spring how to do dependency injection in your session listener
3. Spring 3 and JSR-330 @Inject and @Named example
11 of 11 11/10/18, 10:36 PM