This page (revision-7) was last changed on 15-Dec-2014 12:36 by Dieter Käppel

This page was created on 19-Nov-2012 13:14 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
7 15-Dec-2014 12:36 5 KB Dieter Käppel to previous
6 15-Dec-2014 12:36 4 KB Dieter Käppel to previous | to last
5 12-Mar-2013 12:59 4 KB Dieter Käppel to previous | to last
4 31-Dec-2012 14:54 4 KB Dieter Käppel to previous | to last
3 31-Dec-2012 14:52 2 KB Dieter Käppel to previous | to last
2 31-Dec-2012 14:44 1 KB Dieter Käppel to previous | to last
1 19-Nov-2012 13:14 2 KB Dieter Käppel to last

Page References

Incoming links Outgoing links

Version management

Difference between version and

At line 1 changed one line
Der [Application Support] ist eine Bibliothek mit integrativen Code für [JSF2], [JSF Ext], Spring Framework und JPA / Hibernate. Ziel ist, häufig verwendete Komponenten für den einfachen Aufbau einer Applikation erfolgreich zu kombinieren. [Application Support] liefert eine Reihe nützlicher Bausteine.
Der [Application Support] ist eine Bibliothek mit integrativen Code für [JSF2], [JSF Ext], Spring Framework und JPA / Hibernate. Ziel ist, häufig verwendete Komponenten für den einfachen Aufbau einer Applikation erfolgreich zu kombinieren. [Application Support] liefert eine Reihe nützlicher Bausteine. [Application Support] kann über das [Intersult Maven Repository] bezogen werden:
At line 3 added 8 lines
{{{
<dependency>
<groupId>com.intersult</groupId>
<artifactId>application-support</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
}}}
At line 10 changed 2 lines
!!!Validators
Es ist sinnvoll, in Web-Applikationen zwei Arten von Validatoren zu nutzen:
!!!Bean-Validators
Die Annotations direkt an Java-Bean-Properties stellen sicher, dass ein Wert nur in einem bestimmten Zustand in die Datenbank geschrieben wird. Bean-Validation in [JSF2] validiert die Annotations bereits im Frontend und bietet die Möglichkeit einen Fehler unmittelbar dem Benutzer zu melden. Die Annotations können auch in anderen Beans verwendet werden, die nicht in die Datenbank geschrieben werden. Die saubere Konfiguration wird dabei durch [JSF Ext] hergestellt.
At line 13 changed 2 lines
* __Bean-Validators:__ Die Annotations direkt an Java-Bean-Properties stellen sicher, dass ein Wert nur in einem bestimmten Zustand in die Datenbank geschrieben wird. Bean-Validation in [JSF2] validiert die Annotations bereits im Frontend und bietet die Möglichkeit einen Fehler unmittelbar dem Benutzer zu melden. Die Annotations können auch in anderen Beans verwendet werden, die nicht in die Datenbank geschrieben werden. Die saubere Konfiguration wird dabei durch [JSF Ext] hergestellt.
* __JSF-Validators:__ Diese Validators werden direkt im Frontend angebracht, also in den XHTML-Dateien. Damit können Felder unterschiedlich validiert werden und Situations abhängige Logik implementiert werden. Zum Beispiel kann gesprüft werden, ob zwei Felder gleich sein müssen. Eine Sonderrolle spielt das Attribut required bei vielen UIInput-Elementen, mit dem eine Eingabe erzwungen werden kann.
!!!Spring Custom Injections
Der Application-Support stellt das Interface InjectionFactory<A extends Annotation> zur Verfügung. Damit können auf sehr einfache Weise eigene Injection-Anntotations erstellt werden.
At line 16 changed 2 lines
!!Unique-Validator
Mit dem Unique-Validator kann ein Property geprüft werden, ob es nur einmal in der Datenbank existiert:
!!Beispiel Scope-Injection
Generell ist es in Spring möglich, durch die @Value-Annotation beliebige Werte durch EL-Expression zu injecten, zum Beispiel durch #{scope.field} einen Wert aus einem [JSF Ext] Scope. Die Nachteile bestehen in der jeweiligen Angabe der EL-Expression, obwohl der Feldname bereits als Information ausreichend wäre, sowie dass der Wert nicht Null sein darf.
At line 27 added 2 lines
Daher eine ScopeInjectionFactory:
At line 20 changed 3 lines
<h:outputLabel for="name" value="Name"/>
<h:inputText id="name" value="#{userEdit.user.name}" required="true"
validator="intersult.Unique"/>
@Component
public class ScopeInjectionFactory implements InjectionFactory<ScopeValue> {
@Override
public Class<ScopeValue> getAnnotationType() {
return ScopeValue.class;
}
@Override
public Object create(Class<?> type, String beanName, ScopeValue annotation) {
Scopes scopes = Scopes.instance();
if (scopes == null)
return null;
Scope scope = scopes.getScope();
if (scope == null)
return null;
return scope.get(beanName);
}
}
At line 25 changed one line
__Erklärung:__ Der Unique-Validator holt sich die Entity-Klasse und Property über die EL-Expression für das Attribut "value" und prüft ob dieser bereits in der Datenbank vorhanden ist. Falls die Bean bereits persistent ist, wird der betreffende Wert außgenommen, sodass die Bean auch mit demselben Wert für das Property geupdatet werden kann.
Die dazugehörige Annotation:
{{{
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.METHOD})
public @interface ScopeValue {
}
}}}
Die Spring-Injection der [JSF Ext] Scopes ist auch in der [Jsf Spring Integration] enthalten.
!!!Factory Methods
Eine andere Möglichkeit zur Injection sind Factory Methods. Diese bedienen die standardmäßige Annotation @Autowired, im Unterschied zu Injection Factories. Der Design-Zweck liegt im Generieren spezieller Beans, die zum Beispiel von der Basisbean abgeleitet sein können. Durch eine Factory generierte Beans brauchen auch keine Spring-Annotation besitzen, sie können sogar während der Laufzeit durch einen Bytecode-Generator erzeugt werden.
Ein einfaches Beispiel kann so aussehen:
{{{
@Component
public class AutowireTest {
@Autowired
private InjectBean injectBean;
@Factory
public InjectBean injectBeanFactory() {
return new InjectBean("from factory");
}
@Test
public void test() {
System.out.println(injectBean.getText());
}
}
public class InjectBean {
private String text;
public InjectBean(String text) {
this.text = text;
}
public String getText() {
return text;
}
}
}}}
__Erklärung:__ In diesem Fall ist InjectBean ein einfaches POJO. Die Factory und die Verwendung liegen sogar innerhalb der gleichen Component, natürlich kann die Factory auch durch jede andere Spring-Component implementiert werden.
!!!Session Events
In einem Servlet treten neben dem HttpServletRequest auch Events vom Typ HttpSessionEvent auf, wie zum Beispiel bei einem HttpSessionListener. Möchte man darin Spring-Operationen durchführen, braucht man einen ordentlich initialisierten Spring-Context inklusive den RequestAttributes.
Die Klasse EventRequestAttributes stellt diese zur Verfügung:
{{{
WebApplicationContext applicationContext =
WebApplicationContextUtils.getRequiredWebApplicationContext(event.getSession().getServletContext());
EventRequestAttributes request = new EventRequestAttributes(event);
try {
RequestContextHolder.setRequestAttributes(request);
} finally {
request.requestCompleted();
RequestContextHolder.resetRequestAttributes();
}
}}}
Die Klasse ContextSessionListener implementiert dies bereits für den HttpSessionListener, sodass sie bequem abgeleitet werden kann:
{{{
public class UserListener extends ContextSessionListener {
@Override
public void sessionCreated(HttpSessionEvent event, WebApplicationContext applicationContext) {
Authenticator authenticator = applicationContext.getBean(Authenticator.class);
authenticator.createSession(event.getSession());
}
@Override
public void sessionDestroyed(HttpSessionEvent event, WebApplicationContext applicationContext) {
Authenticator authenticator = applicationContext.getBean(Authenticator.class);
if (authenticator.getCurrentUser() != null)
authenticator.logout(event.getSession());
}
}
}}}