This page (revision-184) was last changed on 21-Apr-2017 08:27 by Dieter Käppel

This page was created on 09-Aug-2012 13:29 by Dieter Käppel

Only authorized users are allowed to rename pages.

Only authorized users are allowed to delete pages.

Page revision history

Version Date Modified Size Author Changes ... Change note
184 21-Apr-2017 08:27 36 KB Dieter Käppel to previous
183 21-Apr-2017 08:27 36 KB Dieter Käppel to previous | to last
182 15-Jan-2016 10:18 36 KB Dieter Käppel to previous | to last
181 15-Jan-2016 10:16 36 KB Dieter Käppel to previous | to last

Page References

Incoming links Outgoing links

Version management

Difference between version and

At line 315 added 5 lines
!!Hintergrund
In [JSF] werden oft Render-Attribute direkt in AJAX- und anderen Anweisungen angegeben. Da diese lose gekoppelt sind, wird im günstigen Fall eine Fehlermeldung entstehen, dass die entsprechende Id nicht mehr im Component Tree vorhanden ist. Der nachträgliche Einbau zusätzlich zu rendernder Components ist nicht vorgesehen, diese müssen explizit am Render-Attribut aller betreffenden Anweisungen hinzugefügt und gepflegt werden.
Aus diesem Grund führt [JSF Ext] die (Render-)Events ein. Events können zwar aus der View durch den Tag <e:raise> erzeugt werden, sinnvoll ist meist jedoch die Erzeugung durch die raise-Methode auf der Java-Seite. Dadurch bleibt die lose Kopplung von View und Controller erhalten. Die können Controller können Ereignisse auslösen, auf die sich Teile der View registrieren um neu gerendert zu werden.
At line 620 added 99 lines
!!!Spring Framework Integration
[JSF Ext] arbeitet mit dem Spring Framework zusammen. Für die Spring-JSF-Integration ist es sinnvoll zunächst den EL-Resolver von Spring zu registrieren:
{{{
<faces-config>
<application>
<el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver>
</application>
</faces-config>
}}}
!!Scopes
Wenn man nicht nur JSF Managed Beans im Custom Scope von [JSF Ext] haben möchte, kann dieser auch in der applicationContext.xml registriert werden:
{{{
<bean class="org.springframework.beans.factory.config.CustomScopeConfigurer">
<property name="scopes">
<map>
<entry key="view">
<bean class="com.intersult.jsf.spring.ViewScope"/>
</entry>
<entry key="scope">
<bean class="com.intersult.jsf.spring.CustomScope"/>
</entry>
</map>
</property>
</bean>
}}}
__Hinweis:__ [JSF Ext] enthält zusätzlich noch einen Scope, mit dem der ViewScope von JSF registriert werden kann.
Um Werte aus Scopes in Beans zu injizieren, können die Scopes
{{{
<bean class="com.intersult.jsf.spring.EventBeanProcessor"/>
<bean name="scopes" class="com.intersult.jsf.Scopes" factory-method="instance" lazy-init="true"/>
<bean name="scope" factory-bean="scopes" factory-method="getScope" lazy-init="true"/>
}}}
!Beispiel
Zum Beispiel wäre dann folgende Konstruktion möglich:
Beim Laden des Scopes:
{{{
<e:load scopeId="rule-remove">
<f:param name="rule" value="#{rule}"/>
</e:load>
}}}
Innerhalb des Scopes:
{{{
<h:commandButton value="#{messages['remove']}" action="#{ruleEditController.remove}">
<f:ajax/>
<f:setPropertyActionListener value="#{scope.rule}" target="#{ruleEdit.rule}"/>
<e:unload/>
</h:commandButton>
}}}
Der Controller dazu:
{{{
@Component
@Lazy
public class RuleEditController {
@Value("#{scope.rule}")
private Rule rule;
@Transactional
public void remove() {
...
}
}
}}}
__Erklärung:__ Damit ist es möglich, eine Entity- oder andere Modell-Bean innerhalb eines Scopes zu bearbeiten, dessen Lebenszyklus an ein AJAX-Popup gekoppelt ist. Es ist keine weitere Java-Bean erforderlich, die in einem Scope abgelegt werden muss. Alle parameterisierten Beans werden beim Beenden (Unload) des Scopes freigegeben.
!!Events
Um die Annotation @Listener auch in Spring-Beans verwenden zu können, kann man den EventBeanProcessor in Spring registrieren:
{{{
<bean class="com.intersult.jsf.spring.EventBeanProcessor"/>
}}}
!Beispiel
Der Listener kann verwendet werden, um Inhalte von Ergebnislisten bei bedarf neu zu generieren:
{{{
@Component
@Lazy
public class QueryController {
@Transactional
@Listener(Rule.EVENT_CHANGED)
public void execute() {
...
}
}}}