konto usunięte

Temat: Spring Web Flow i JSF

No trzeba troche rozruszac to forum, gdyz wieje tu pustka a Spring sie preznie rozwija przeciez;)


Ma ktos z Was jakies doswiadczenia w integracji Spring Web Flow (SWF) z JSF? Z dokumentacji wynika, ze oczywiscie jest to mozliwe ale jedynie poprzez facelets.
Niestety w takiej konfiguracji nie moge uzywac Spring Security, gdyz biblioteka tagow security zwyczajnie nie jest interpretowana w faceletach. Oczywiscie sa na to obejscia (acegijsf) ale zastanawiam sie czy jednak nie da sie tego zrobic wykorzystujac JSP.
Poki co, udalo mi sie wyswietlac komponenty JSF na stronach JSP w trakcie flowa.

Jesli juz ktos sie z tym zmagal, to bylbym wdzieczny za jakies wskazowki.

konto usunięte

Temat: Spring Web Flow i JSF

ok, udalo mi sie zintegrowac JSF z WebFlow w zakresie takim jaki mnie narazie zadowala.
Michał Grębowiec

Michał Grębowiec Senior Software
Developer

Temat: Spring Web Flow i JSF

A możesz powiedzieć jak tego dokonałeś. Od jakiegoś czasu próbuje zintegrować JSF 1.2 i SWF. Głównie zależy mi na informacji jakie biblioteki dołączyłeś i jak wyglądają pliki konfiguracyjne i na jakim serwerze robiłeś deploy.

konto usunięte

Temat: Spring Web Flow i JSF

Jasne, ze moge. Zadna tajemnica;)
Pierwsze to oczywiscie biblioteki JSF. Ja wykorzystalem implementacje RI plus Richfaces. Plik faces-config.xml u mnie zawiera tylko jedynie wpis:
<application>
<variable-resolver>
org.springframework.web.jsf.DelegatingVariableResolver
</variable-resolver>
</application>
i nic wiecej. Jak widac nie definuje zadnych managed-beanow, gdyz JSF uzywam tylko dla jego komponentow. Reszta frameworka nie jest mi potrzebna.
Poniewaz w swojej aplikacji uzywam Spring MVC, zatem musialem podmienic w klasie ViewResolvera org.springframework.web.servlet.view.UrlBasedViewResolver, pole viewClass na: org.springframework.faces.mvc.JsfView
Te klase znajdziesz w org.springframework.faces-2.0.1.RELEASE.jar
To jest biblioteka ze SpringWebFlow.
Oczywiscie w web.xml musialem dodac servlet JSF plus dodatkowe wpisy wlasciwe dla Richfaces.
Jesli chodzi o WebFlow, to nie musisz trzymac sie faceletow. Mnie facelety nie urzadzaly, bo za duzo roboty bylo z wlaczeniem tam SpringSecurity. Takze dziala to na zwyklych stronach jsp i chodzi na Tomcat.Dariusz S. edytował(a) ten post dnia 03.10.08 o godzinie 14:55
Michał Grębowiec

Michał Grębowiec Senior Software
Developer

Temat: Spring Web Flow i JSF

Niestety wskazówki niewiele mi pomogły. Zrezygnowałem już z faceltetów. Podczas odpalenia zdefiniowanego flowa wywala mi błąd:
java.lang.IllegalStateException: Unable to create the default expression parser for Spring Web Flow: Neither a Unified EL implementation or OGNL could be found.
Nie wiem za bardzo jak wyeliminować ten błąd. Próbowałem już dodawać jary: el-impl oraz el-api ale nic to nie pomogło.
Byłbym wdzięczny jakbyś mógł mi podesłać na maila jakąś prostą aplikację SWF + JSF (najlepiej z libami albo informacją jakie biblioteki należy dołączyć).
Michał Grębowiec

Michał Grębowiec Senior Software
Developer

Temat: Spring Web Flow i JSF

Udało mi się wreszcie połączyć SWF i JSF 1.2. Co prawda jest jeszcze pare rzeczy które nie grają ale działa. Ciekawi mnie jedna rzecz... Mam zdefiniowanego beana w konfiguracji springa:
<bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<property name="viewClass" value="org.springframework.faces.mvc.JsfView"/>
<property name="prefix" value="/WEB-INF/" />
<property name="suffix" value=".jsp" />
</bean>
Generalnie jako suffix ma zdefiniowane .jsp jednak jak definiuje view-state we flow i podam mu jako atrybut view="login" to standardowo bierze jako widok plik login.xhtml a nie login.jsp co wynikałoby z powyższej konfiguracji. Aby zmusić go żeby pobrał właściwy widok czyli login.jsp jako atrybut view podaje mu jawnie "login.jsp". Wpis ten wygląda następująco:
<view-state id="login" view="login.jsp">
...
</view-state>

Ktoś wie czemu tak się dzieje?
Albo jak można temu zaradzić?
W dokumentacji SWF wyczytałem że integracja SWF z JSF działa w oparciu o facelet z tym że ja tego nie użyłem

konto usunięte

Temat: Spring Web Flow i JSF

A co masz w pliku konfiguracyjnym webflowa?
Bo tam tez musisz mu okreslic viewresolver. U mnie wyglada to tak:
<webflow:flow-builder-services id="myView" view-factory-creator="myViewFactoryCreator"/>
<bean id="myViewFactoryCreator" class="org.springframework.webflow.mvc.builder.MvcViewFactoryCreator">
<property name="viewResolvers" ref="viewResolver2"/>
</bean>
gdzie viewResolver2 to oczywiscie referencja do viewresolvera dla JSF.
Michał Grębowiec

Michał Grębowiec Senior Software
Developer

Temat: Spring Web Flow i JSF

Udało się wyeliminować problem z suffixem wg Twoich wskazówek ale za to pojawił się inny problem. Wcześniej na stronie działały mi commandLinki które to po kliknięciu wywoływały mi inny stan w obrębie flow a po dodaniu tego:
webflow:flow-builder-services id="myView" view-factory-creator="myViewFactoryCreator"/>
<bean id="myViewFactoryCreator" class="org.springframework.webflow.mvc.builder.MvcViewFactoryCreator">
<property name="viewResolvers" ref="viewResolver2"/>
</bean>
po naciśnięciu na link nic się nie dzieje. Zastanawia mnie czego jeszcze mi brakuje.
W pliku konfiguracyjnym webmvc-config.xml mam takie definicje:
<bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/WEB-INF/" />
<property name="suffix" value=".jsp" />
</bean>
<bean id="viewResolver2" class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<property name="viewClass" value="org.springframework.faces.mvc.JsfView"/>
<property name="prefix" value="/WEB-INF/flows/"/>
<property name="suffix" value=".jsp" />
</bean>

Plik webflow-config.xml ma taką zawartość:
<webflow:flow-executor id="flowExecutor" />
<webflow:flow-registry id="flowRegistry"
flow-builder-services="facesFlowBuilderServices">
<webflow:flow-location path="/WEB-INF/flows/login/login.xml" />
</webflow:flow-registry>
<webflow:flow-builder-services id="facesFlowBuilderServices" view-factory-creator="myViewFactoryCreator"/>
<bean id="myViewFactoryCreator" class="org.springframework.webflow.mvc.builder.MvcViewFactoryCreator">
<property name="viewResolvers" ref="viewResolver2"/>
</bean>

Definicja flowa login.xml
<view-state id="login" view="login/loginForm">
<var name="testBean" class="mg.formhandlers.TestFormHandler"/>
<on-render>
<set name="flowScope.name" value="testFormHanlder.name"></set>
</on-render><transition on="next" to="test"/>
<transition on="finish" to="finish"/>
</view-state>
<view-state id="test" view="login/testForm">
<transition on="finish" to="finish"/>
</view-state>
<end-state id="finish" view="externalRedirect:contextRelative:spring/intro"/>

Widok loginForm jest zdefiniowany tak

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="/WEB-INF/tld/html_basic.tld" prefix="h" %>
<%@ taglib uri="/WEB-INF/tld/jsf_core.tld" prefix="f" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<f:view>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
tekst loginu
<h:form>
<h:outputText value="#{testBean.name}"></h:outputText>
<div>
<h:commandLink id="finish" action="finish" value="finishV">finish</h:commandLink>
</div>
<div>
<h:commandButton id="finishButton" action="finish" value="finish">finish button</h:commandButton>
</div>
<div>
<h:commandLink id="next" action="next">next</h:commandLink>
</div>
</h:form>
</body>
</html>
</f:view>

Przed dodaniem view-factory-creator działały mi powyższe commandLinki. Natomiast po dodaniu nie działają tzn. po ich naciśnięciu żadna akcja się nie wywołuje.
Szymon Biliński

Szymon Biliński Programista Java

Temat: Spring Web Flow i JSF

A próbowałeś przy pomocy "natywnych" tagów z przestrzeni Web Flow ?


<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
[b]xmlns:sf="http://www.springframework.org/tags/faces"[/b]
template="/WEB-INF/layout/standard.xhtml">

...

<h:form>
...
<[b]sf:[/b]commandButton id="cancel" action="cancel" value="#{msg['cancel']}"/>
...
</h:form>

...

</ui:composition>


A tak na marginesie, korzystając z JSF bez facelets odbierasz sobie naprawdę bardzo dobre narzędzie - ja bym jeszcze trochę z nimi powalczył ;)

Następna dyskusja:

Spring JavaConfig




Wyślij zaproszenie do