Tradycyjną drogą integracji JSF i Springa było odwoływanie się z managed beans do spring beans z użyciem tradycyjnych metod wstrzykiwania kontekstu aplikacji. W poniższym artykule pokażę jak można zastąpić managed beans których używamy w technologi JSF, spring beanami które tworzy i udostępnia Spring.
Zacznijmy więc od ściągnięcia odpowiednich bibliotek do Springa które możemy umieścić w katalogu WebContent/WEB-INF/lib naszej aplikacji (zakładam że dysponujesz już jakąś aplikacją z wykorzystaniem JSF, jeśli nie to polecam zajrzeć najpierw do artykułu JSF + Tomcat 6 + Eclipse - Hello World). Linki do potrzebnych bibliotek zamieszam poniżej:
- spring-asm-3.0.2.RELEASE
- spring-beans-3.0.2.RELEASE
- spring-context-3.0.2.RELEASE
- spring-core-3.0.2.RELEASE
- spring-expression-3.0.2.RELEASE
- spring-web-3.0.2.RELEASE
Spring - stworzenie beana
Zacznijmy od stworzenia prostego beana springowego. Do tego celu potrzebować będziemy prostej klasy javowej z jedną metodą (getHello()) która wypisz na ekran napisz powitalny (pamiętajmy o tym że bean ten będzie wykorzystany w JSF dlatego metody wypisujące napis na ekran mają prefiks get).
package com.blogspot.mkorwel.spring; import org.springframework.stereotype.Component; /** * * @author Mateusz Korwel * */ @Component public class HelloBean { public String getHello() { return "Hello Spring"; } }
Klasa HelloBean jest opatrzona adnotacją @Component co sugeruje że będzie to bean springowy. Następnym krokiem konfiguracji springa będzie stworzenie pliku konfiguracyjnego. W moim przykładzie plik ten znajduję się w katalogu WebContent/WEB-INF i nazywa się applicationContext.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:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> <context:component-scan base-package="com.blogspot.mkorwel.spring" /> </beans>
Jest to tradycyjny plik konfiguracyjne do springa, z wpisem który wskazuje springowi w jakich pakietach znajdują się spring beany (czyli wszystkie klasy które opatrzone są adnotacją @Component o której już wspomniałem).
Integracja
Do integracji Springa i JSF będziemy musieli zmodyfikować plik WebContent/WEB-INF/web.xml i WebContent/WEB-INF/faces-config.xml. Do pliku web.xml dodajemy informacje o springowym kontekście aplikacji:
<listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <listener> <listener-class> org.springframework.web.context.request.RequestContextListener</listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/applicationContext.xml</param-value> </context-param>a do pliku faces-config.xml informację o wykorzystanie spring beanów jako managed beanów
<application> <el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver> </application>
Użycie nowej funkcjonalności
Kiedy wszystko jest już skonfigurowane możemy wykorzystywać nasze spring beany jako managed beany, do tego celu stworzyłem prostą stronkę hello.jsp (w katalogu WebContent):
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <%@ taglib prefix="f" uri="http://java.sun.com/jsf/core"%> <%@ taglib prefix="h" uri="http://java.sun.com/jsf/html"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>JSF Spring</title> </head> <body> <f:view> <h:outputText value="#{helloBean.hello}"></h:outputText> </f:view> </body> </html>
Po umieszczeniu naszej aplikacji (nazwa mojej aplikacji to JSFSpring) na serwerze i uruchomieniu (http://localhost:8080/JSFSpring/hello.jsf) na stronie powinien pojawić się napisz Hello Spring.