# Time-Out Probleme



## Athro (26. Jun 2008)

Hallo,

ich habe folgendes Problem, wenn die Session verloren geht (Time-Out), dann bekomme ich die folgende Fehlermeldung:



> java.lang.IndexOutOfBoundsException: Index: 1, Size: 0
> at java.util.ArrayList.RangeCheck(Unknown Source)
> at java.util.ArrayList.get(Unknown Source)
> at org.apache.commons.beanutils.PropertyUtils.getIndexedProperty(PropertyUtils.java:521)
> ...



Ich habe eine Funktion geschrieben:

```
session.setAttribute(ConstantsDB.SESSIONATTRIBUT, "true"); 			
StartseiteForm startForm = new StartseiteForm();		
request.setAttribute(ConstantsDB.STARTSEITEFORM, startForm);
setSessionVerloren(true);		
return mapping.findForward(ConstantsDB.SHOWSTART);
```
die aufgerufen sollte, wenn die Session verloren geht eine Funktion geschrieben diese Funktion soll das Sessions-Attribut auf true setzten und auf die JSP eine Fehlermeldung ausgeben. 
Nun leider so weit kommt die Anwendung leider nicht, denn in der Reset-Funktion des Formes kracht es, und die Funktion soll in der Action aufgerufen werden.
PS.: ich versucht die Funktion in Reset  aufzurufen, habe ich dieselben Probleme.

Danke 
Athro


----------



## HLX (26. Jun 2008)

Deinem Code nach zu Urteilen verwendest du Struts.

Um Code vor der Struts-Formularverarbeitung auszuführen gibt es zwei Möglichkeiten:

1. Du schreibst einen ServletFilter und hängst ihn vor das ActionServlet. 
www.jsptutorial.org/content/filter
In die doFilter()-Methode schreibst du vor dem "chain.doFilter(request, response)" deinen Code. An dieser Stelle solltest du sicherheitshalber von der Verwendung von Struts-Elementen absehen.

2. Die strutsbasierte (und von Struts vorgeschlagene) Lösung ist das Überschreiben des RequestProcessors. Ist allerdings etwas kniffeliger. Hier eine Kurzbeschreibung des RequestProcessors.
http://struts.apache.org/1.x/userGuide/building_controller.html#request_processor

Der Fehler tritt so wie es aussieht bei der Vorverarbeitung deines Forms auf. Vielleicht gibt´s auch ein Problem mit der Formklasse, oder mit der StrutsConfig so dass dein Workaround eigentlich garnicht erforderlich ist


----------



## Athro (1. Jul 2008)

Hallo HLX,
Danke dass Du beantwortest hast, und entschuldige mich dass so lange es gedauert hat bis ich antworte, denn ich war die letzte Zeit im Unterwegs.

Nun zum (Time-Out) Problem, ich möchte Dir sagen das dieses Problem kommt nur bei der JSP die einen CheckBoxen hat vor, bei allen andren JSP kommt dieses Problem nicht vor.

Ich habe gelesen dass Struts den CheckBoxen nicht wieder auf (false) setzt, ich hab sie im Reset auf false gesetzt aber dass hat auch nicht geholfen.

Dein Vorschlag mit dem Filter habe ich nicht genau verstanden wie und wo soll ich den Filter erstellen vor, im oder nachdem Reset 

Vielen Dank

Athro


----------



## HLX (1. Jul 2008)

Mir ist nicht ganz klar, was eine Checkbox mit einnem Timeout zu tun haben soll. Die Checkboxen in der Reset-Methode auf false zu setzen ist auf jeden Fall der richtige weg. Struts setzt Checkboxen nicht wieder auf false zurück, weil dieser Zustand nicht vom Client an den Server übermittelt wird. Daher ist der Workaround über die Reset-Methode erforderlich.

Ein ServletFilter hat nichts mit Struts zu tun sondern mit der Servlet-Technologie allgemein. Du registrierst ihn in der web.xml und mappst ihn auf dein ActionServlet, da dieses bei jedem Struts-Aufruf angesteuert wird:

```
<filter>
    <filter-name>MyServletFilter</filter-name>
    <filter-class>
        com.myapp.MyServletFilter
    </filter-class>
<filter-mapping>
    <filter-name>MyServletFilter</filter-name>
    <servlet-name>action</servlet-name>
</filter-mapping>
```

Die Filterklasse implementiert javax.servlet.Filter.

Wenn du nun einen Request an Struts schickts wird die doFilter-Methode durchlaufen: 

```
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
    throws IOException, ServletException {
    
    // hier kommt der Code hin, der vor der Struts-Verarbeitung ausgeführt werden soll

    // hier wird automatisch der nächste Filter aufgerufen, falls kein weiterer Filter 
    // vorhanden ist, wird das ActionServlet angesteuert
    doFilter(request, response, chain); 

    // hier kommt der Code hin, der nach der Struts-Verarbeitung ausgeführt werden soll			
}
```

Weitere Infos zu Filtern siehe Tutorial oben.


----------



## Athro (2. Jul 2008)

Hallo HLX,

ich änderte die web.xml Datei Nach deinem Beispiel, und habe ich dazu eine Klasse MyServletFilter die den Filter implementiert, nun bekomme ich das folgende Fehler:


> HTTP Status 404 - /ProjektName/index.jsp
> 
> --------------------------------------------------------------------------------
> 
> ...




```
die web.xml sieht so aus:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee   http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

...
...
...
    
    <filter>
        <filter-name>MyServletFilter</filter-name>
        <filter-class>de.controller</filter-class>
         <init-param>
            <param-name>log_category</param-name>
            <param-value>DurationLog</param-value>
        </init-param>
    </filter>
    
    <filter-mapping>
       <filter-name>MyServletFilter</filter-name>
       <url-pattern>*.do</url-pattern>
    </filter-mapping>

   <servlet>
      <servlet-name>action</servlet-name>
      <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
      <init-param>
         <param-name>config</param-name>
         <param-value>/WEB-INF/struts-config.xml</param-value>
      </init-param>
      <init-param>
         <param-name>debug</param-name>
         <param-value>0</param-value>
      </init-param>
      <init-param>
         <param-name>detail</param-name>
         <param-value>3</param-value>
      </init-param>
      <load-on-startup>0</load-on-startup>
   </servlet>
   <servlet-mapping>
      <servlet-name>action</servlet-name>
      <url-pattern>*.do</url-pattern>
   </servlet-mapping></web-app>
```

und die Klasse MyServletFilter:

```
package de.controller;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class MyServletFilter implements Filter {

   private static Log logger;

   public void init(FilterConfig config) throws ServletException {
      // check whether a category has been
      // configured in the deployment descriptor
      String category = config.getInitParameter("------------>>>>>>>>>>>>>>>>>>>>>log_category");
      if (category != null) {
         logger = LogFactory.getLog(category);
      }
      else {
         logger = LogFactory.getLog(MyServletFilter.class);
      }
   }

   public void doFilter(ServletRequest request, ServletResponse response,
         FilterChain chain) throws IOException, ServletException {

      String url = null;
      if (request instanceof HttpServletRequest) {
         url = ((HttpServletRequest)request).getRequestURL().toString();
      }
      long duration, starttime = System.currentTimeMillis();

      // proceed along the chain
      chain.doFilter(request, response);

      // after response returns, calculate duration and log it
      duration = System.currentTimeMillis() - starttime;
      if (logger.isDebugEnabled()) {
         logger.debug("==========================>>>>>>>>>>duration: " + duration + " - " + url);
      }
   }

   public void destroy() {
   }
```
was mache ich nun falsch?

Danke


----------



## HLX (2. Jul 2008)

Schau mal in die Tomcat-Logs im "logs"-Verzeichnis deines Tomcat. Vielleicht ist deine Anwendung aufgrund eines Fehlers in der web.xml nicht geladen worden.


----------



## Athro (2. Jul 2008)

Hallo HLX,

ich glaube er ist in der web.xml gelandet, den er sieht die ConstantsDB-Klasse, die den Logger-Instanzen mit dem Namen mittels der statischen Funktion Logger.getLogger() geholt werden.

```
public final class ConstantsDB {
...
public static final Logger log = Logger.getLogger(ConstantsDB.class);
...
```

im Tomcat-Logs wird nur dieses Info geschrieben:



> SL: DS ist ok [Function:] setDs [Location: ] de.ktbl.model.ConstantsDB INFO  -



für die Connection Pooling aus den Parametern der Erzeuge ich eine DataSource-Datei : 

```
public class ResourceManagerListener implements ServletContextListener {
	// private Logger log = null;

	DataSourceWrapper ds = null;

	public ResourceManagerListener() {
		super();
	}

	public void contextInitialized(ServletContextEvent sce) {
		ServletContext application = sce.getServletContext();

		String driverClass = application.getInitParameter("driverClass");
		String jdbcURL = application.getInitParameter("jdbcURL");
		String user = application.getInitParameter("user");
		String password = application.getInitParameter("password");

		try {
			ds = new DataSourceWrapper();
			ds.setDriverClassName(driverClass);
			ds.setJdbcURL(jdbcURL);
			ds.setUserName(user);
			ds.setPassword(password);

			application.setAttribute("DataSource", ds);
		} catch (Exception e) {
			application.log("Error creating connection pool: ", e);

			ConstantsDB.log.error("Error creating connection pool: ", e);
		}

		// ---------------DataSource an den Service Locator übergeben-------------

		ServiceLocator.getInstance().setDs(ds);

	}

	public void contextDestroyed(ServletContextEvent sce) {
		ServletContext application = sce.getServletContext();

		application.removeAttribute("DataSource");

	}
}
```

im web.xml wird ResourceManagerListener unter Listner deklariert:

```
<listener>
        <listener-class>
            de.controller.ResourceManagerListener
        </listener-class>
    </listener>
```
gibt hier vileicht ein Problem?


----------



## HLX (2. Jul 2008)

Kann ich mir eigentlich nicht vorstellen. Der Fehler besagt, dass deine JSP-Datei nicht gefunden wird.

Falls du eine welcome-File-List in deiner web.xml hast, nimm die mal raus und lass  "index.jsp" in der URL weg. Dann sollten die Dateien, die im Root-Verzeichnis deiner Webanwendung liegen angezeigt werden. Ist die Datei dabei?

Vielleicht hast du auch einen anderen Kontextnamen anstelle von "ProjektName" angegeben.


----------



## Athro (2. Jul 2008)

ich löschte von dem web.xml des Tomcats die Liste:

```
<welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
```

hat niht geholfen

im web.xml des Struts habe ich den Filter und die listner erstellet:

```
<listener>
        <listener-class>
            de.controller.ResourceManagerListener
        </listener-class>
    </listener>
```




			
				HLX hat gesagt.:
			
		

> Dann sollten die Dateien, die im Root-Verzeichnis deiner Webanwendung liegen angezeigt werden. Ist die Datei dabei?
> 
> Vielleicht hast du auch einen anderen Kontextnamen anstelle von "ProjektName" angegeben.



Die Datei ResourceManagerListener.java ist dabei meinst Du diese Datei? und wo soll ich den Kontextnamen "ProjektName" angeben?


----------



## HLX (2. Jul 2008)

Ich meinte nicht die web.xml des Tomcat. Die ist für den Tomcat selbst.

Du musst die web.xml deiner Anwendung anpassen! Alle anwendungsspezifischen Angaben (ServletFilter etc.) gehören ebenfalls in die web.xml der Anwendung!

Der Kontext wird in der server.xml des Tomcat oder in einer context.xml gesetzt. Falls du eine IDE verwendest wird der Kontext i.d.R. dort in den Projekteinstellungen konfiguriert. Eclipse mit WTP z.B. unter Project-->Properties-->Web Project Settings

Edit: Mit Datei meinte ich die index.jsp, die bei dir scheinbar fehlt. Die sollte im Root-Verzeichnis deiner Web-Anwendung liegen.


----------



## Athro (3. Jul 2008)

HLX hat gesagt.:
			
		

> Ich meinte nicht die web.xml des Tomcat. Die ist für den Tomcat selbst.
> Du musst die web.xml deiner Anwendung anpassen! Alle anwendungsspezifischen Angaben (ServletFilter etc.) gehören ebenfalls in die web.xml der Anwendung!


Im die web.xml meiner Anwendung habe ich Alle spezifischen Angaben  der Anwendung angepasst, und nur die web.xml des Tomcat hat die index.jsp (so habe ich vorher gemeint)



			
				HLX hat gesagt.:
			
		

> Der Kontext wird in der server.xml des Tomcat oder in einer context.xml gesetzt. Falls du eine IDE verwendest wird der Kontext i.d.R. dort in den Projekteinstellungen konfiguriert. Eclipse mit WTP z.B. unter Project-->Properties-->Web Project Settings


Unter Project-->Properties-->Web Project Settings ist der richtige Kontext (ProjektName), im server.xml:

```
<Context docBase="ProjektName" path="/ProjektName" reloadable="true" source="org.eclipse.jst.j2ee.server:ProjektName"/></Host>
```
context.xml hat nur:

```
<Context>
    
    <WatchedResource>WEB-INF/web.xml</WatchedResource>	
    
    <!--
    <Manager pathname="" />
    -->
</Context>
```



			
				HLX hat gesagt.:
			
		

> Edit: Mit Datei meinte ich die index.jsp, die bei dir scheinbar fehlt. Die sollte im Root-Verzeichnis deiner Web-Anwendung liegen.


Die index.jsp liegt bei mir unter (WebContent) also im Root-Verzeichnis meiner Web-Anwendung.

ich kann dieses Fennomen auch nicht verstehen, und zwar warum beim Time out wird es bei mansche JSP eine Fehlermeldung gezeigt (so wie ich wollte) und bei andren bekomme ich kracht es!!!
Ich bin ratlos :bahnhof:


----------



## HLX (3. Jul 2008)

Athro hat gesagt.:
			
		

> Im die web.xml meiner Anwendung habe ich Alle spezifischen Angaben  der Anwendung angepasst, und nur die web.xml des Tomcat hat die index.jsp (so habe ich vorher gemeint)
> 
> Unter Project-->Properties-->Web Project Settings ist der richtige Kontext (ProjektName), im server.xml:
> 
> ...


Prima! Dein Kontext lautet "ProjektName", d.h. deiner Anwendung wird auf dem Tomcat über die URL "localhost:8080/ProjektName" angesprochen. 



			
				Athro hat gesagt.:
			
		

> Die index.jsp liegt bei mir unter (WebContent) also im Root-Verzeichnis meiner Web-Anwendung.


Schon klar, dass sie in deiner IDE liegt, aber kommt sie auch auf dem Tomcat an. Also: welcome-file-list aus der anwendungsspezifischen web.xml entfernen, Tomcat starten ggf. "http://localhost:8080/ProjektName" im Browser eingeben, falls der Eclispe-Browser das nicht automatisch macht. Jetzt müsste eine Liste der Dateien und Ordner im Browser erscheinen, die im Root-Verzeichnis deiner Webanwendung liegen. Also, was passiert? Ist da ne index.jsp und was passiert, wenn du die anklickst?


----------



## Athro (3. Jul 2008)

Ich habe die welcome-file-Liste von web.xml des Tomcat gelöschet und die Anwendung von Browser aufgerufen, ich bekam eine Liste, die im Root-Verzeichnis meiner Webanwendung sind.


> Directory Listing For /
> ________________________________________
> Filename	Size	Last Modified
> css/
> ...


Wenn ich die index.jsp klicke wird die Anwendung gestartet.


----------



## HLX (3. Jul 2008)

Athro hat gesagt.:
			
		

> HTTP Status 404 - /ProjektName/index.jsp
> 
> --------------------------------------------------------------------------------
> 
> ...


----------



## Athro (3. Jul 2008)

Nach dem ich die index.jsp klicke wird die Anwendung gestartet und in der 3 Webflow (bzw auf der 3 Seite -JSP-) kommt das Fehler mit dem Time-Out das am Anfang beschrieben habe:


> HTTP Status 500 -
> 
> --------------------------------------------------------------------------------
> 
> ...


----------



## Athro (3. Jul 2008)

Nach dem ich die index.jsp klicke wird die Anwendung gestartet und in der 3 Webflow (bzw auf der 3 Seite -JSP-) kommt das Fehler mit dem Time-Out das am Anfang beschrieben habe:


> HTTP Status 500 -
> 
> --------------------------------------------------------------------------------
> 
> ...


[/quote]


----------



## HLX (3. Jul 2008)

Sorry, aber muss ich dir hier jeden Wum aus der Nase ziehen? Vorhin hatten wir einen HTTP-Fehler 404 und jetzt ist das alte Problem wieder da. Hast du die Filtergeschichte mal ausprobiert?

Außerdem, nach 3 Klicks gibt es keinen Session-Timeout. Vielleicht liegt dein Problem ganz woanders.

Du solltest den Code mal debuggen. Setzt nen Exception-Breakpoint und überprüfe, warum das Array leer ist. Vielleicht ist auch ein Scope falsch gesetzt.


----------



## Athro (3. Jul 2008)

entschuldige mich, da ich die Filter von web.xml immer wider lösche damit ich die Anwendung testen kann,  habe ich Letztes Mal im web.xml vergessen die Filter rein zu setzen ich habe sie dort kopiert und auf dem Browser bekomme ich die 404 Fehler:


> HTTP Status 404 - /euAgroBiogas/
> 
> --------------------------------------------------------------------------------
> 
> ...


----------



## HLX (3. Jul 2008)

Also, dann ist dein Projekt wohl nicht auf dem Server angekommen. Möglicherweise hat sich durch den Einbau des Filters ein Fehler in deine web.xml eingebaut. Möglicherweise die Tag-Hierarchie nicht eingehalten...

Es wäre gut, wenn du bei auftretenden Fehlern erstmal selbst auf die Suche gehst, manchmal kann es nur ein einfacher Tippfehler sein.

Schau mal im Eclipse-View "Servers" ob die Anwendung gestartet wurde. Mit Sicherheit gab es auch ne Fehlermeldung in der Konsole.

Prinzipiell sollte man beachten, wenn man unter Eclipse Web-Projekte entwickelt: Treten merkwürdige Fehler auf, sollte man sicherheitshalber den Tomcat neu starten. Ggf. schadet es auch nicht das Tomcat-Work-Directory zu säubern (View "Servers" --> rechte Maustaste auf den Tomcat --> Clean Tomcat Work Directory...)

Ansonsten denke ich, dass wir ohne deinen Code hier nicht weiterkommen. Warum ein Timeout das Problem sein soll ist mir auch immer noch nicht klar. Ich habe im Moment das Gefühl du hast erhebliche Wissenslücken in der Java-Web-Technologie.


----------



## Athro (4. Jul 2008)

HLX hat gesagt.:
			
		

> Es wäre gut, wenn du bei auftretenden Fehlern erstmal selbst auf die Suche gehst, manchmal kann es nur ein einfacher Tippfehler sein.


Ich habe dieses Fehler vor fast einem Monat beim Testen entdeckte (ich änderte im web.xml des Tomcats den session-timeout auf 1 Minute) und nach einem Minute Warten kam immer dieses Problem was ich Dir mehr Mals erwähnt habe vor, und das passierte nur auf die Seiten wo ein Checkbox aktiviert wurde.

Wenn dass kein Time-out Problem ist und hat mit Checkbox nicht zu tun warum kommt dieses Problem nur in der JSP wo man ein Checkbox aktiviert und nach Ablauf des session-timeout vor :?: 

Nach her bin ich durch den Code mit Debuger ein Schritt nach andrem gelaufen, und habe ich bemerkt ich, dass der Fehler nach dem Reset und vor validate des Formes (wo das Checkbox aktiviert wurde) vorkommt, ich habe im Rest das Checkbox wieder auf false gesetz, hat es aber nicht viel geholfen Und weil ich wie Deine Gefühle Dir sagten!!!:


			
				HLX hat gesagt.:
			
		

> du hast erhebliche Wissenslücken in der Java-Web-Technologie.



habe ich mit meinen Arbeitskollegen den Code zusammen analisiert, sie konnten leider mir nicht weiter helfen und einer von denen meinte "die Benutzer unsere Webanwendungen benutzen unsere Anwendungen ganz schnell und gehen wider raus d.h.: (die Halbstunde des Tomcats) wird bestimmt reichen deshalb soll ich mich für dieses Problem nicht viel Zeit verlieren."

Aber weil ich mich nicht verloren geben wollte suchte ich im Internet  :###  nach einer möglichen Lösung, viel habe ich leider nicht gefunden, dann habe ich mein Problem hier beschrieben, ich hoffte dass jemand wird mir helfen können.
Aber nach Langer Diskussion mit Dir (HLX) kommst Du mir mit solchen Vorschlägen, 





			
				HLX hat gesagt.:
			
		

> Schau mal im Eclipse-View "Servers" ob die Anwendung gestartet wurde. Mit Sicherheit gab es auch ne Fehlermeldung in der Konsole.
> Prinzipiell sollte man beachten, wenn man unter Eclipse Web-Projekte entwickelt: Treten merkwürdige Fehler auf, sollte man sicherheitshalber den Tomcat neu starten. Ggf. schadet es auch nicht das Tomcat-Work-Directory zu säubern (View "Servers" --> rechte Maustaste auf den Tomcat --> Clean Tomcat Work Directory...)


dir ich allein und mit den Arbeitskollegen mehrmals versucht haben.

Also wenn Du keine Lust oder Zeit  hast die andren zu helfen, dann bitte verschöne sie mindesten mit deinem Moralpredigen!!!


----------



## maki (4. Jul 2008)

HLX Tipp mit dem Filter ist Goldrichtig.

Dir ist die Ursache deines Problemes klar?
Wenn nicht: Die Session läuft ab, die Requests werden aber trotzdem weiterbearbeitet (da kein Filter läuft).
Irgendwann kommt der Request mit der abgelaufenen Session an eine Seite/Servlet, welche Daten aus der (nicht mehr vorhandenen) Session abfrägt, und da kracht es...


----------



## HLX (4. Jul 2008)

Athro hat gesagt.:
			
		

> Also wenn Du keine Lust oder Zeit  hast die andren zu helfen, dann bitte verschöne sie mindesten mit deinem Moralpredigen!!!


Ich habe mehrfach versucht dir zu helfen. Aber irgendwie drehen wir uns hier ständig im Kreis. Dies klappt nicht, dann klappt das andere nicht, dann klappt das andere auf einmal wieder aber das eine (Filter) wurde dafür immer noch nicht richtig ausprobiert. Dazu kommen immer nur wenige und halbbrauchbare Informationen. So wird das Ganze zu einem Ratespiel, dass mit dem eigentlichen Problem nichts zu tun hat.

Wenn sich irgendwie mehrere Probleme anhäufen, die scheinbar mit dem eigentlichen Problem nichts zu tun haben (z.B. HTTP-404-Error), ist meistens gerenell was im Argen - dann liegt das nicht nur an einem Timeout-Fehler. Wenn die Infrastruktur nicht richtig läuft, ist es noch viel schwieriger bei einem speziellen Anwendungsproblem zu helfen.

Lange Rede kurzer Sinn: setzte dich mit ServletFiltern auseinander. Mit diesen kannst du auf die Anwendung einwirken, bevor Struts eingeschaltet wird. Das ist der Schlüssel zu Lösung deines Anwendungsproblems.


----------

