Skip to content

21. Fazit

Wir haben die Grundlagen des Struts-2-Frameworks untersucht und eine Anwendung vorgestellt, die mehrere Technologien kombiniert. Anfänger und Leser mit mittleren Kenntnissen finden in diesem Dokument Material, das ihnen beim Lernen und Verbessern hilft. Ein Nachschlagewerk ist weiterhin erforderlich. Ich empfehle erneut das Buch:

Struts 2 in Action“ von Donald Brown, Chad Michael Davis und Scott Stanlick, erschienen bei Manning.

Abschließend möchte ich noch auf einige Probleme eingehen, auf die ich beim Schreiben der Beispiele in diesem Dokument gestoßen bin. Ich habe bereits einige unerwartete Verhaltensweisen von Struts 2 erwähnt, insbesondere bei der Eingabe von Zahlen und Datumsangaben. Hier sind noch einige weitere Probleme, auf die ich gestoßen bin:

Lassen Sie uns die Anwendung [pam-01] vom Tomcat-Server entladen:

Image

Die Apache-Konsole zeigt daraufhin die folgenden Protokolle an:

1
2
3
4
5
6
7
8
janv. 05, 2012 11:18:58 AM org.springframework.context.support.AbstractApplicationContext doClose
Infos: Closing org.springframework.web.context.support.XmlWebApplicationContext@57488b9c: display name [Root WebApplicationContext]; startup date [Thu Jan 05 11:18:45 CET 2012]; root of context hierarchy
janv. 05, 2012 11:18:58 AM org.springframework.beans.factory.support.DefaultSingletonBeanRegistry destroySingletons
Infos: Destroying singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@78ae9d8d: defining beans [config,metier]; root of factory hierarchy
janv. 05, 2012 11:18:58 AM org.apache.tiles.access.TilesAccess setContainer
Infos: Removing TilesContext for context: org.apache.catalina.core.ApplicationContextFacade
janv. 05, 2012 11:19:00 AM org.apache.catalina.startup.HostConfig checkResources
Infos: Repli (undeploy) de l'application web ayant pour chemin de contexte /pam-01

Das Entladen war erfolgreich.

Lassen Sie uns [pam-02] auf die gleiche Weise entladen. Die Protokolle lauten wie folgt:

janv. 05, 2012 11:21:07 AM org.springframework.context.support.AbstractApplicationContext doClose
Infos: Closing org.springframework.web.context.support.XmlWebApplicationContext@5d9131fa: display name [Root WebApplicationContext]; startup date [Thu Jan 05 11:11:10 CET 2012]; root of context hierarchy
janv. 05, 2012 11:21:07 AM org.springframework.beans.factory.support.DefaultSingletonBeanRegistry destroySingletons
Infos: Destroying singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@7b66d238: defining beans [config,metier,employeDao,indemniteDao,cotisationDao,entityManagerFactory,dataSource,org.springframework.aop.config.internalAutoProxyCreator,org.springframework.transaction.annotation.AnnotationTransactionAttributeSource#0,org.springframework.transaction.interceptor.TransactionInterceptor#0,org.springframework.transaction.config.internalTransactionAdvisor,txManager,org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor#0,org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor#0]; root of factory hierarchy
janv. 05, 2012 11:21:07 AM org.springframework.orm.jpa.AbstractEntityManagerFactoryBean destroy
Infos: Closing JPA EntityManagerFactory for persistence unit 'pam-PU'
janv. 05, 2012 11:21:07 AM org.hibernate.impl.SessionFactoryImpl close
Infos: closing
janv. 05, 2012 11:21:07 AM org.apache.tiles.access.TilesAccess setContainer
Infos: Removing TilesContext for context: org.apache.catalina.core.ApplicationContextFacade
janv. 05, 2012 11:21:07 AM org.apache.catalina.loader.WebappClassLoader clearReferencesJdbc
Grave: The web application [/pam-02] registered the JDBC driver [com.mysql.jdbc.Driver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.
janv. 05, 2012 11:21:07 AM org.apache.catalina.loader.WebappClassLoader clearReferencesThreads
Grave: The web application [/pam-02] appears to have started a thread named [Timer-0] but has failed to stop it. This is very likely to create a memory leak.
janv. 05, 2012 11:21:07 AM org.apache.catalina.loader.WebappClassLoader clearReferencesThreads
Grave: The web application [/pam-02] appears to have started a thread named [MySQL Statement Cancellation Timer] but has failed to stop it. This is very likely to create a memory leak.
janv. 05, 2012 11:21:08 AM org.apache.catalina.startup.HostConfig checkResources
Infos: Repli (undeploy) de l'application web ayant pour chemin de contexte /pam-02

Zeilen 12, 14, 16: Es werden schwerwiegende Fehler gemeldet. Zwei davon deuten auf einen möglichen Speicherverlust hin. Tatsächlich weist die Anwendung [pam-02] Speicherverluste auf. Nach einer Weile wird die Anwendung unbrauchbar. Sie müssen dann NetBeans schließen und die Anwendung erneut bereitstellen.

Die Fehler beziehen sich alle auf Threads. Die Anwendung [pam-02] verwendet selbst keine Threads. Wir müssen daher die verwendeten Frameworks vermuten: Struts 2, Spring 2.5 und Tiles. Wir können Tiles mit Fug und Recht ausschließen, da es wahrscheinlich keine Threads verarbeitet. Damit bleiben Struts und Spring übrig.

Wir führen daraufhin ein weiteres Experiment durch:

Wir implementieren die [Web]-Schicht mit dem JSF-Framework anstelle von Struts 2. Sonst ändert sich nichts. Wir erhalten dann dieselben Fehlermeldungen wie bei Struts 2.

Der Übeltäter scheint also Spring zu sein, der hier von Spring verwendete dbcp-Verbindungspool oder vielleicht ich selbst, falls ich Spring nicht korrekt eingesetzt habe. Möglicherweise habe ich eine Spring-Konfiguration vergessen, die die erstellten Threads bereinigen würde; vielleicht habe ich… Die Lösung für dieses Speicherleck-Problem muss daher noch gefunden werden.

Ein weiteres Experiment. Die NetBeans-IDE wird zusammen mit den Servern Tomcat und GlassFish ausgeliefert. Versuchen wir, eine in diesem Dokument erstellte Anwendung auf GlassFish auszuführen:

  • in [2] die Eigenschaften des Projekts [example-08] [1]
  • in [3], die Auswahl des Webservers

Hier ist die im Browser angezeigte Seite:

Die erwartete Portabilität wird nicht erreicht. Hier gibt es zwei Fehler:

  • In [1] funktionierte die Internationalisierung nicht
  • in [2] tritt eine Ausnahme auf

Bei den meisten der in diesem Dokument entwickelten Anwendungen treten dieselben beiden Fehler auf. Ich habe nicht versucht, dieses neue Problem zu beheben.