JSF+Spring integation


Directory structure of this example

jsf2-spring-example-folder
1. Project Dependencies

Use Maven to grab all the JSF 2.0 and Spring library dependencies.

File : pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
  http://maven.apache.org/maven-v4_0_0.xsd">
 
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.mkyong.common</groupId>
  <artifactId>JavaServerFaces</artifactId>
  <packaging>war</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>JavaServerFaces Maven Webapp</name>
  <url>http://maven.apache.org</url>
 
  <repositories>
    <repository>
       <id>java.net.m2</id>
       <name>java.net m2 repo</name>
       <url>http://download.java.net/maven/2</url>
     </repository>
  </repositories>
 
  <dependencies>
 
  	<!-- Spring framework --> 
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring</artifactId>
		<version>2.5.6</version>
	</dependency>
 
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-web</artifactId>
		<version>2.5.6</version>
	</dependency>
 
    <!-- For Java EE Application Server, uncomment this library 
  	and comment the rest of the libraries
    <dependency>
      <groupId>javax.faces</groupId>
      <artifactId>jsf-api</artifactId>
      <version>2.0</version>
      <scope>provided</scope>
    </dependency>
     -->
 
  	<!-- For Servlet Container like Tomcat -->
  	<!-- http://download.java.net/maven/2 -->
	<dependency>
	  <groupId>com.sun.faces</groupId>
	  <artifactId>jsf-api</artifactId>
	  <version>2.1.0-b03</version>
	</dependency>
 
	<dependency>
	  <groupId>com.sun.faces</groupId>
	  <artifactId>jsf-impl</artifactId>
	  <version>2.1.0-b03</version>
	</dependency>
 
	<!-- EL 2.2 to support method parameter in EL -->
        <dependency>
	  <groupId>org.glassfish.web</groupId>
	  <artifactId>el-impl</artifactId>
	  <version>2.2</version>
	</dependency>
 
        <!-- http://repo1.maven.org/maven2/ -->
        <dependency>
	  <groupId>javax.servlet</groupId>
	  <artifactId>jstl</artifactId>
	  <version>1.2</version>
	</dependency>
 
	<dependency>
	  <groupId>javax.servlet</groupId>
	  <artifactId>servlet-api</artifactId>
	  <version>2.5</version>
	</dependency>
 
	<dependency>
	  <groupId>javax.servlet.jsp</groupId>
	  <artifactId>jsp-api</artifactId>
	  <version>2.1</version>
	</dependency>
 
  </dependencies>
 
  <build>
    <finalName>JavaServerFaces</finalName>
 
    <plugins>
       <plugin>
           <groupId>org.apache.maven.plugins</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>
2. Spring Bean

A Spring bean declaration, later uses Spring to DI this “userBo” into JSF 2.0 managed bean property.

File : UserBo.java

package com.mkyong.user.bo;
 
public interface UserBo{
 
	public String getMessage();
 
}

File : UserBoImpl.java

package com.mkyong.user.bo.impl;
 
import com.mkyong.user.bo.UserBo;
 
public class UserBoImpl implements UserBo{
 
	String name;
 
	public void setName(String name) {
		this.name = name;
	}
 
	public String getMessage() {
 
		return "JSF 2 + Spring Integration saying : " + name;
 
	}
 
}

File : applicationContext.xml

<beans xmlns="http://www.springframework.org/schema/beans"
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.5.xsd">
 
	<bean id="userBo" class="com.mkyong.user.bo.impl.UserBoImpl">
		<property name="name" value="mkyong.com" />
	</bean>
 
</beans>
3. JSF 2.0

A simple JSF 2.0 web application.

File : UserBean.java

package com.mkyong;
 
import java.io.Serializable;
 
import com.mkyong.user.bo.UserBo;
 
//DI via JSF managed bean
public class UserBean implements Serializable{
 
	//DI via Spring
	UserBo userBo;
 
	public void setUserBo(UserBo userBo) {
		this.userBo = userBo;
	}
 
	public String printMsgFromSpring() {
 
		return userBo.getMessage();
 
	}
 
}

File : default.xhtml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"   
      xmlns:h="http://java.sun.com/jsf/html"
      >
 
    <h:body>
 
    	<h1>JSF 2.0 + Spring Example</h1>
 
 		#{user.printMsgFromSpring()}
 
    </h:body>
 
</html>

JSF 2.0 + Spring Integration

The main concern is how to inject Spring “UserBo” bean into JSF managed bean “UserBean“.

File : UserBean.java

//DI via JSF managed bean
public class UserBean implements Serializable{
 
	//DI via Spring
	UserBo userBo;
1. Spring Listeners

Add following two Spring’s listeners into web.xml.

  <listener>
	<listener-class>
		org.springframework.web.context.ContextLoaderListener
	</listener-class>
  </listener>
  <listener>
	<listener-class>
		org.springframework.web.context.request.RequestContextListener
	</listener-class>
  </listener>

See full example of web.xml.

File : web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xmlns="http://java.sun.com/xml/ns/javaee" 
	xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
	id="WebApp_ID" version="2.5">
 
  <display-name>JavaServerFaces</display-name>
 
  <!-- Add Support for Spring -->
  <listener>
	<listener-class>
		org.springframework.web.context.ContextLoaderListener
	</listener-class>
  </listener>
  <listener>
	<listener-class>
		org.springframework.web.context.request.RequestContextListener
	</listener-class>
  </listener>
 
  <!-- Change to "Production" when you are ready to deploy -->
  <context-param>
    <param-name>javax.faces.PROJECT_STAGE</param-name>
    <param-value>Development</param-value>
  </context-param>
 
  <!-- Welcome page -->
  <welcome-file-list>
    <welcome-file>faces/default.xhtml</welcome-file>
  </welcome-file-list>
 
  <!-- JSF mapping -->
  <servlet>
    <servlet-name>Faces Servlet</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
 
  <!-- Map these files with JSF -->
  <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>
  <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>*.xhtml</url-pattern>
  </servlet-mapping>
 
</web-app>
2. SpringBeanFacesELResolver

Add SpringBeanFacesELResolver as el-resolver in faces-config.xml, and declare JSF managed bean like normal. Now, whenever JSF sees a bean name, it try JSF rules first, then Spring rules next. In this case, when JSF see #{userBo}, it will match it with Spring’s “userBo” bean.

File : faces-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<faces-config
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"
    version="2.0">
 
	<application>
    	        <el-resolver>
    		    org.springframework.web.jsf.el.SpringBeanFacesELResolver
    	        </el-resolver>
  	</application>
 
	<managed-bean>
		<managed-bean-name>user</managed-bean-name>
		<managed-bean-class>com.mkyong.UserBean</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>
Note
Alternatively, you can add  DelegatingVariableResolver in variable-resolver, but API variable-resolver is deprecated after JSF 1.1. You should use  el-resolver instead.

<application>
	<variable-resolver>
		org.springframework.web.jsf.DelegatingVariableResolver
	</variable-resolver>
</application>
3. Demo

Done, run it and see output below : http://localhost:8080/JavaServerFaces/faces/

jsf2-spring-example-output
Download Source Code
Download It –  JSF-2-Spring-Integration-Example.zip (11KB)
Reference
  1. SpringBeanFacesELResolver JavaDoc
  2. Spring how to do dependency injection in your session listener
  3. Spring tutorial
This article is under -  JSF 2 Tutorials , Tags : 
Founder and Chief Editor of Mkyong.com, love Java and open source stuff. Follow him on  Twitter, or befriend him on  Facebook or  Google Plus.


http://www.mkyong.com/jsf2/jsf-2-0-spring-integration-example/


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值