21. Fazit
Die Grundlagen des Struts-2-Frameworks wurden behandelt und eine Anwendung vorgestellt, die mehrere Technologien vereint. Leser mit Anfänger- oder Mittelstufenniveau finden in diesem Dokument Material, um sich weiterzubilden und Fortschritte zu machen. Es fehlt jedoch noch ein Nachschlagewerk. Ich empfehle erneut das Buch:
„Struts 2 in Action“ von Donald Brown, Chad Michael Davis und Scott Stanlick, erschienen im Manning-Verlag.
Abschließend möchte ich noch auf einige Probleme eingehen, auf die ich beim Schreiben der Beispiele für dieses Dokument gestoßen bin. Ich habe bereits auf unerwartete Verhaltensweisen von Struts 2 hingewiesen, insbesondere bei der Eingabe von Zahlen und Datumsangaben. Hier sind einige weitere Probleme, auf die ich gestoßen bin:
Entladen wir die Anwendung [pam-01] vom Tomcat-Server:

Die Apache-Konsole zeigt daraufhin folgende Protokolleinträge an:
| 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 Herunterladen verlief erfolgreich.
Entfernen wir auf die gleiche Weise [pam-02]. Die Protokolleinträge lauten dann 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]; Wurzel der Werkshierarchie
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
|
In den Zeilen 12, 14 und 16 werden schwerwiegende Fehler gemeldet. Zwei davon weisen auf einen möglichen Speicherleck hin. Tatsächlich weist die Anwendung [pam-02] Speicherlecks auf. Nach einer Weile ist die Anwendung nicht mehr nutzbar. Man muss dann NetBeans schließen und die Anwendung neu bereitstellen.
Die Fehler beziehen sich alle auf Threads. Die Anwendung [pam-02] verwendet selbst keine Threads. Daher sind die verwendeten Frameworks Struts 2, Spring 2.5 und Tiles im Verdacht. Tiles kann man mit Fug und Recht ausschließen, da es wahrscheinlich keine Threads verwaltet. Es bleiben also Struts und Spring.
Wir führen nun ein weiteres Experiment durch:
Wir implementieren die Schicht [web] mit dem Framework JSF anstelle von Struts 2. Sonst ändert sich nichts. Wir erhalten nun dieselben Fehlermeldungen wie bei Struts 2.
Der Übeltäter scheint also Spring zu sein, der hier von Spring verwendete dbcp-Verbindungspool oder aber ich selbst, falls ich Spring nicht richtig eingesetzt habe. Vielleicht habe ich eine Spring-Konfiguration vergessen, die das Aufräumen der erstellten Threads ermöglicht, vielleicht habe ich … Die Lösung für dieses Speicherleck-Problem muss also noch gefunden werden.
Ein weiteres Experiment. IDE NetBeans lässt sich zusammen mit den Servern Tomcat und GlassFish installieren. Versuchen wir, eine in diesem Dokument erstellte Anwendung auf GlassFish auszuführen:
- in [2] die Projekteigenschaften von [exemple-08] [1]
- in [3], die Auswahl des Webservers
Hier ist die im Browser angezeigte Seite:
Die erwartete Portabilität ist nicht gegeben. Hier gibt es zwei Fehler:
- Bei [1] hat die Internationalisierung nicht funktioniert
- in [2] tritt eine Ausnahme auf
Bei den meisten in diesem Dokument entwickelten Anwendungen treten dieselben beiden Fehler auf. Ich habe nicht versucht, dieses neue Problem zu beheben.