# Struts Grundlagen Frage



## oetzi (26. Aug 2008)

Hallo zusammen,
arbeite mich gerade anhand von diesem Tutorial hier in Struts ein:
http://www.visualbuilder.com/jsp/struts/tutorial/pageorder/14/


Laut dem Tutorial soll in der struts-config.xml folgendes drin stehen:


```
<action
      path="/login"
      type="de.mk.struts.action.LoginAction"
      validate="false">
      <forward name="success" path="/manageusers.jsp" />
      <forward name="failure" path="/index.jsp" />
    </action>
```

Da ich mich zwar möglichst genau an das Tutorial gehalten habe, es aber leider nicht klappt, habe jetzt mal eine grundsätzliche Frage, was dieses ganze abfangen und weiterleiten betrifft.

Mein Verständnis bisher ist folgendes:
1.
type: gibt an, welcher Controller/Action aufgerufen werden soll. Aber wann wird der aufgerufen?? Hat das evtl. was mit dem path=... zu tun?

2.
und wie funktionieren genau diese forward geschichten? Wer kann in welcher Weise "success" bzw. "failure" zurückgeben? Ich meine die LoginAction Klasse. Ist das richtig?

3.
Mit 2. zusammenhängend:Worauf bezieht sich der path=... bei den forward-Tags? Sprich wo müssen die jeweiligen seiten liegen?


Wäre für Hilfe sehr dankbar!

Schönen Gruß

oetzi


----------



## HLX (26. Aug 2008)

oetzi hat gesagt.:
			
		

> Mein Verständnis bisher ist folgendes:
> 1.
> type: gibt an, welcher Controller/Action aufgerufen werden soll. Aber wann wird der aufgerufen?? Hat das evtl. was mit dem path=... zu tun?


"type" gibt die Action-Klasse an, die aufgerufen wird. Den Aufruf übernimmt das zentrale ActionServlet, dass du in der deiner 'web.xml' registriert hast. Um die Action anzusteuern musst du in deiner Anwendung den Pfad "login.do" verwenden. Bsp:

```
<html:form action="login.do">...
```
Anhand des ".do" erkennt der Servlet-Container, dass er das zentrale ActionServlet aufrufen muss. Dazu hast du das URL-Mapping "*.do" in deiner 'web.xml' stehen. Das ActionServlet (bzw. der RequestProcessor) erkennt an der Angabe "login", dass die LoginAction aufgerufen werden muss.



			
				oetzi hat gesagt.:
			
		

> 2.
> und wie funktionieren genau diese forward geschichten? Wer kann in welcher Weise "success" bzw. "failure" zurückgeben? Ich meine die LoginAction Klasse. Ist das richtig?


Die Execute-Methode deiner Action erwartet die Rückgabe eines solchen Forwards. Hier entscheidest du also, wohin weitergeleitet werden soll. Auf die Erfolgsseite kommst du z.B. mit 
	
	
	
	





```
return mapping.findForward("success");
```



			
				oetzi hat gesagt.:
			
		

> 3.
> Mit 2. zusammenhängend:Worauf bezieht sich der path=... bei den forward-Tags? Sprich wo müssen die jeweiligen seiten liegen?


Die Pfade beginnen immer direkt nach deinem Anwendungskontext bzw. im Root-Verzeichnis deiner Webanwendung.


----------



## Guest (26. Aug 2008)

Das sieht alles ziemlich nach Struts 1 aus. Mittlerweile gibt es bereits Struts 2, das radikal überarbeitet wurde und kaum noch etwas mit Struts 1 zu tun hat. 

Wenn du dich in Struts einarbeiten willst, würde ich dir empfehlen gleich mit Struts 2 zu beginnen.


----------



## oetzi (26. Aug 2008)

Danke schonmal für die schnelle Antwort!
Ich komme von hier jetzt grad nicht an den Quellcode. Muss ich also morgen ausprobieren. Werde dann nochmal Feedback geben, ob es funktioniert hat 

@"Gast" 
Ich habe sehr lange gesucht, bis ich dieses relativ ausführliche Tutorial für Struts gefunden habe. Weiß jetzt leider nicht, für welche Version das ist und kann es im Tutorial selber auch nirgendwo erkennen.

Wenn jemand ein gutes Tutorial kennt, bitte her damit! 

Die die ich bis jetzt gefunden habe, beschreiben mehr allgemein, wofür Struts gut ist oder geben allgemeine Codebeispiele für Struts.

Da es aber das erste Framework überhaupt für mich ist, fällt es mir schwer immer zu wissen, wo denn die Codefragmente hinkommen, bzw. überhaupt zu verstehen was jetzt wie wo und überhaupt "Struts-like" ist...


----------



## Guest (26. Aug 2008)

Dann ist das Tutorial vielleicht wirklich besser für dich, da es für Struts2 meines Wissen bisher noch keine guten Tutorials gibt. Du musst allerings wissen, daß sich Struts2 deutlich von Struts1 unterscheidet und du wieder umlernen musst, solltest du mal struts2 einsetzen wollen/müssen.


----------



## SnooP (27. Aug 2008)

Wenn man mit Webentwicklung noch gar nichts zu tun hat - ist imho ein kleines Reindenken in Struts1 schon ganz sinnig, weil es halt noch am nächsten in Richtung Servlets geht...

wenn man nicht konkrete Projektaussichten hat wo struts 1 gefragt ist, würde ich mich aber auch nicht mehr zu sehr darin vertiefen und dann eher Richtung struts2 gehen, wobei hier schon einiges mehr vom Entwickler verlangt wird, weil einfach die Doku und die Unterstützung im Netz oder durch Literatur noch nicht soo gegeben ist - zudem sich ständig einiges ändern tut 

Eine vollständig andere Richtung wäre JSF oder noch ganz anders Grails... letzteres ist für besonders schnelle Erfolge bzw. später auch besonders fixes Erstellen von Seiten gut geeignet...


----------



## oetzi (27. Aug 2008)

so, moin moin 



			
				HLX hat gesagt.:
			
		

> "type" gibt die Action-Klasse an, die aufgerufen wird. Den Aufruf übernimmt das zentrale ActionServlet, dass du in der deiner 'web.xml' registriert hast. Um die Action anzusteuern musst du in deiner Anwendung den Pfad "login.do" verwenden. Bsp:
> 
> ```
> <html:form action="login.do">...
> ...



Den Sinn des Ganzen habe ich (glaube ich  ) verstanden, aber ich muss hier nochmal nachhaken, da mir das Tutorial nicht genug Infos gibt.

Meine web.xml sieht so aus:

```
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java..........>
  <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>3</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>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>
```


Muss ich jetzt noch irgendwo dieses "zentrale ActionServlet"/zentralen Controler definieren? 
Ich versteh grad nicht, wohin (also an welche Klasse) alle *.do URLs geleitet werden. Da ist das Tutorial etwas ungenau.


Ich versuche mal anhand eines Beispiels zu zeigen wo ich hänge:

In meiner index.jsp habe ich die beiden felder 'login' und 'passwort'. Zur Übung soll laut dem Tutorial einfach der zugehörige Action-Controler überprüfen, ob da beides mal "admin" drin steht und halt jenachdem auf die "success" oder die "failure"-Seite weiterleiten.

Die Kopfzeile meines Formulars sieht so aus.

```
<form action="/login.do" method="post">
```

Die Java Klasse 'LoginAction.java' sieht so aus:

```
public ActionForward execute(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) 
	{
		String user = request.getParameter("userId");
		String password = request.getParameter("password");
		if(user!=null && password!=null && user.equals("admin") && password.equals("admin"))
		    return mapping.findForward("success");
			return mapping.findForward("failure");
	}
```

Und der vollständigkeitshalber hier nochmal die struts-config.xml

```
<struts-config>
  <data-sources />
  <form-beans />
  <global-exceptions />
  <global-forwards />
  <action-mappings >
   <action
      path="/login"
      type="de.mk.struts.action.LoginAction"
      validate="false">
      <forward name="success" path="/manageusers.jsp" />
      <forward name="failure" path="/index.jsp" />
    </action>
  </action-mappings>
  <message-resources parameter="de.mk.struts.ApplicationResources" />
</struts-config>
```

So wenn ich jetzt in dem Formular auf den submit-Button klicke, bekomme ich den HTTP 404 Fehler (The requested resource (/login.do) is not available.)

Also irgendwo funktioniert doch da die Weiterleitung nicht.

Könnt ihr mir da nochmal nen Tipp geben?


EDIT: @SnoopP: werde dann wohl erstmal bei Struts bleiben. Wenn ich erstmal das Grundprinzip richtig verinnerlicht habe, hoffe ich mal, dass der Umstieg auf Struts 2 auch irgendwie klappt.


----------



## HLX (27. Aug 2008)

oetzi hat gesagt.:
			
		

> Muss ich jetzt noch irgendwo dieses "zentrale ActionServlet"/zentralen Controler definieren?


Nein, ist bereits alles in deiner web.xml enthalten.



			
				oetzi hat gesagt.:
			
		

> Ich versteh grad nicht, wohin (also an welche Klasse) alle *.do URLs geleitet werden. Da ist das Tutorial etwas ungenau.


Das ist auch nichts Struts-spezifisches sondern gilt für alle Java-Webanwendungen: Du mappst in der 'web.xml' alle *.do URLs auf das zentrale ActionServlet, d.h. die Klasse org.apache.struts.action.ActionServlet wird aufgerufen. Diese übernimmt die weitere Arbeit für dich.



			
				oetzi hat gesagt.:
			
		

> Die Kopfzeile meines Formulars sieht so aus.
> 
> ```
> <form action="/login.do" method="post">
> ```


Du verwendest hier die normalen HTML-Tags. Bei denen ist es erforderlich, den ContextPath deiner Web-Anwendung hinzuzuzfügen. Verwende stattdessen wie oben beschrieben das Struts-Tag mit dem HTML-Präfix. Dann funktionierts:

```
<html:form action="login.do">...
```



			
				oetzi hat gesagt.:
			
		

> Die Java Klasse 'LoginAction.java' sieht so aus:
> 
> ```
> public ActionForward execute(ActionMapping mapping, ActionForm form,
> ...


Statt die Requestparameter auszulesen, solltest du sie auf eine Formularklasse mappen. Dazu findest du sicher auch etwas im Tutorial.


----------



## oetzi (27. Aug 2008)

Vielen Dank schonmal für deine Mühe!!
Ich habe gerade gesehen, dass ein paar Kapitel weiter diese ganze Tag Nutzung erklärt wird.
Darum würde ich gerne, rein um das aktuelle Verhalten nachzuvollziehen, gerne diese "unsaubere" Lösung hinbekommen. Wenn ich jetzt schon andere Sachen einbaue, passt es ja nicht mehr mit dem Tutorial zusammen.



			
				HLX hat gesagt.:
			
		

> Du verwendest hier die normalen HTML-Tags. Bei denen ist es erforderlich, den ContextPath deiner Web-Anwendung hinzuzuzfügen. Verwende stattdessen wie oben beschrieben das Struts-Tag mit dem HTML-Präfix. Dann funktionierts:
> 
> ```
> <html:form action="login.do">...
> ```


-> was heißt contextPath? Könntest du mir für dieses Beispiel mal das Form-Tag komplett aufschreiben? Also bitte "unsauber" nicht mit den Struts-Tags.



			
				HLX hat gesagt.:
			
		

> oetzi hat gesagt.:
> 
> 
> 
> ...



s.o. 
Wenn das jetzt nicht komplett falsch ist, würde ich es erstmal so lassen und es dann später dem Tutorial nach anpassen.


----------



## HLX (27. Aug 2008)

oetzi hat gesagt.:
			
		

> -> was heißt contextPath? Könntest du mir für dieses Beispiel mal das Form-Tag komplett aufschreiben? Also bitte "unsauber" nicht mit den Struts-Tags.


Der ContextPath ist der Pfad, unter dem deine Webanwendung angesprochen werden kann. Pfade beginnen auf dem Servlet Container immer mit dem ContextPath der jeweiligen Anwendung. Die Struts-Tags hängen diesen Pfad automatisch an die URL. Wenn du keinen speziellen Context für deine Anwendung definierst, ist der ContextPath normalerweise der Name deiner Webanwendung.

```
<form action='<%= request.getContextPath() +"/login.do"%>'>...
```


----------



## oetzi (27. Aug 2008)

also ich komme einfach nicht drauf wo der fehler liegt...
Kann ich dann irgendwas grundsätzliches falsch gemacht haben?? z.b. die Dokumentenstruktur oder so?
Habe mich eigentlich probiert komplett ans Tutorial zu halten...

Wenn ich in der index.jsp was eingebe und auf submit klicke, bekomme ich folgenden Fehler
(vielleicht kann man daraus ja was erkennen):





Liege ich mit folgendem Ablauf richtig? (Damit probier ich mal irgendwelche Denkfehler auszuschließen)

1. Durch die Einträge (in web.xml)

```
<servlet-name>action</servlet-name>
    <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
```
und

```
<servlet-mapping>
    <servlet-name>action</servlet-name>
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>
```
sage ich dem Tomcat, wohin alle requests gehen sollen. Nämlich an dieses ominöse ???:L  ActionServlet.

2. Irgendwas steht dann in diesem ActionServlet drin (wie das genau aussieht ist mir noch nicht ganz klar), wodurch die struts-config.xml eingelesen wird, woran dann wiederrum erkannt wird, dass login.do zu der Klasse hier

```
type="de.mk.struts.action.LoginAction"
```
weitergeleitet werden soll.

3. Diese wiederrum gibt success oder failure wieder woraufhin die LoginAction die jeweilige Folgeseite aufruft.


----------



## HLX (27. Aug 2008)

Deine Erkenntnisse sind weitestgehend korrekt.  :toll: 

Zu deinem Problem: mit welcher URL rufst du denn die 'index.jsp' auf?


----------



## oetzi (27. Aug 2008)

hey das freut mich ja schon mal 

so ruf ich die auf:


----------



## HLX (27. Aug 2008)

Ich seh da jetzt erstmal nichts, was zu Problemen führen sollte. Hast du mal überprüft, ob alle Anwendungsteile auf dem Server vorhanden und aktuell sind? Starte, falls noch nicht geschehen, auch den Server nochmal durch.

Falls alles da ist und es immer noch nicht klappt, kannst du nochmal die index.jsp posten.


----------



## oetzi (28. Aug 2008)

moin moin,
da hängt man an solch einer Kleinigkeit Tage lang... 
Naja aller Anfang ist schwer 

Ich habe mal Auto Build ausgemacht und alles per Hand ein "Build All" in der Eclipse angestoßen.
Server neu gestartet. 
-> Nix tut sich.

Mhh, die Fehlermeldung:
"HTTP Status 404 - /registration/login.do"
deutet doch stark daraufhin, dass diese ganze Weiterleitung nicht klappt. Nur habe ich keine Ideen, woran das jetzt schlussendlich liegen kann.

Naja hier mal die index.jsp:

```
<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP 'index.jsp' starting page</title>
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->
  </head>
  
  <body>
  <%= request.getContextPath()%>
    <form action='<%= request.getContextPath() +"/login.do"%>'>
          <table border="0">
             <tr>
                <td>Login:</td>
                <td><input type="text" name="userId" /></td>
          </tr>
          <tr>
             <td>Password:</td>
             <td><input type="text" name="password" /></td>
          </tr>
          <tr>
          <td colspan="2" align="center"><input type="submit" value="Login"/></td>
        </tr>
       </table>
	</form>
  </body>
</html>
```


----------



## HLX (28. Aug 2008)

Ich habe deinen Code bei mir getestet und er funktioniert einwandfrei.

Der Fehler weist darauf hin, dass der Server das Servlet nicht findet. Irgendwas stimmt mit deiner web.xml bzw. mit dem URL-Mapping für das ActionServlet nicht. Würde das Servlet gefunden, hättest du im Fehlerfall andere Fehlermeldungen.


----------



## oetzi (28. Aug 2008)

mhpf so ein Mist...
Hier mal ein Link von meinem kompletten Projekt. 
http://uploaded.to/?id=cfhp6b
Ist nicht viel, aber vielleicht kann sich das einer mal angucken, wenn er ein paar Minuten Zeit hat.
Ich könnt ja wetten, dass das irgend ein kleiner Fehler ist...
Ich komme aber einfach nicht drauf, was es noch sein könnte


----------



## HLX (29. Aug 2008)

Da stimmt wohl was nicht mit deiner Projektstruktur. Du hast den Ordner "registration" zweimal. Der Ordner WEB-INF befindet sich im zweiten Registration-Ordner. WEB-INF muss jedoch im Root-Verzeichnis deiner Web-Anwendung liegen - dort wo auch index.jsp und manageusers.jsp sind.

Eine typische Struktur wäre:

<_ProjektVerzeichnis_>
-- <.myeclipse>
-- <.settings>
-- <src>
---- ...
-- <_Rootverzeichnis Webanwendung_> (z.B. WebContent)
---- index.jsp
---- manageusers.jsp
---- <WEB-INF>
------ web.xml
------ ...


----------



## oetzi (31. Aug 2008)

hi HLX,
bin erst heute wieder dazu gekommen mich meinem Problem zu widmen. Immer diese Betriebsausflüge... 

so, meine Struktur entspricht doch fast der, die du aufgezeichnet hast.
<< -- <Rootverzeichnis Webanwendung> (z.B. WebContent) >>
Das Rootverzeichnis heißt bei mir halt auch registration. Fand ich am Anfang auch eigenartig, hatte mich da auch einfach an das Tutorial gehalten. Aber wie gesagt, das müsste doch soweit richtig sein oder?
Das einzige was falsch war, waren die beiden jsp Dateien. Die lagen im obersten Verzeichnis, müssten aber nach deiner Auflistung im Rootverzeichnis (bei mir das 2. registration) liegen.

Hab jetzt mal die beiden JSP Dateien in den Unterordner verschoben. Hier einfach mal meine aktuelle Struktur:




So, mir ist jetzt aber ein anderes Problem eher zufällig aufgefallen.
Wenn ich den Tomcat normal über die exe im bin verzeichis starte, startet der ohne Probleme. Wenn ich ihn allerdings über die Eclipse starte, bekomme ich folgende Meldung:


```
31.08.2008 18:06:41 org.apache.catalina.core.AprLifecycleListener init
INFO: The APR based Apache Tomcat Native library which allows optimal performance in production environments
was not found on the java.library.path: C:\Programme\Java\jre1.6.0_05\bin;E:\Tomcat6\bin
31.08.2008 18:06:41 org.apache.coyote.http11.Http11Protocol init
INFO: Initializing Coyote HTTP/1.1 on http-8080
31.08.2008 18:06:41 org.apache.catalina.startup.Catalina load
INFO: Initialization processed in 481 ms
31.08.2008 18:06:41 org.apache.catalina.core.StandardService start
INFO: Starting service Catalina
31.08.2008 18:06:41 org.apache.catalina.core.StandardEngine start
INFO: Starting Servlet Engine: Apache Tomcat/6.0.18
31.08.2008 18:06:42 org.apache.catalina.core.ApplicationContext log
INFO: ContextListener: contextInitialized()
31.08.2008 18:06:42 org.apache.catalina.core.ApplicationContext log
INFO: SessionListener: contextInitialized()
31.08.2008 18:06:43 org.apache.catalina.core.ApplicationContext log
INFO: Marking servlet action as unavailable
31.08.2008 18:06:43 org.apache.catalina.core.ApplicationContext log
SCHWERWIEGEND: Error loading WebappClassLoader
  delegate: false
  repositories:
    /WEB-INF/classes/
----------> Parent Classloader:
org.apache.catalina.loader.StandardClassLoader@18d9850
 org.apache.struts.action.ActionServlet
java.lang.ClassNotFoundException: org.apache.struts.action.ActionServlet
	at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1387)
	at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1233)
	at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1094)
	at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:992)
	at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4058)
	at org.apache.catalina.core.StandardContext.start(StandardContext.java:4371)
	at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:791)
	at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:771)
	at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:525)
	at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:926)
	at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.java:889)
	at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:492)
	at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1149)
	at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:311)
	at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)
	at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053)
	at org.apache.catalina.core.StandardHost.start(StandardHost.java:719)
	at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
	at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
	at org.apache.catalina.core.StandardService.start(StandardService.java:516)
	at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
	at org.apache.catalina.startup.Catalina.start(Catalina.java:578)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288)
	at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)
31.08.2008 18:06:43 org.apache.catalina.core.StandardContext loadOnStartup
SCHWERWIEGEND: Servlet /registration threw load() exception
java.lang.ClassNotFoundException: org.apache.struts.action.ActionServlet
	at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1387)
	at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1233)
	at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1094)
	at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:992)
	at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4058)
	at org.apache.catalina.core.StandardContext.start(StandardContext.java:4371)
	at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:791)
	at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:771)
	at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:525)
	at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:926)
	at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.java:889)
	at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:492)
	at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1149)
	at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:311)
	at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)
	at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053)
	at org.apache.catalina.core.StandardHost.start(StandardHost.java:719)
	at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
	at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
	at org.apache.catalina.core.StandardService.start(StandardService.java:516)
	at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
	at org.apache.catalina.startup.Catalina.start(Catalina.java:578)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288)
	at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)
31.08.2008 18:06:43 org.apache.coyote.http11.Http11Protocol start
INFO: Starting Coyote HTTP/1.1 on http-8080
31.08.2008 18:06:43 org.apache.jk.common.ChannelSocket init
INFO: JK: ajp13 listening on /0.0.0.0:8009
31.08.2008 18:06:43 org.apache.jk.server.JkMain start
INFO: Jk running ID=0 time=0/32  config=null
31.08.2008 18:06:43 org.apache.catalina.startup.Catalina start
INFO: Server startup in 1450 ms
```

Wenn der die ActionServlet klasse nicht findet, wäre das natürlich evtl. die Lösung, warum die Weiterleitung nicht funktioniert. Aber warum findet er die nicht? Auf dem obigen Screenshot habe ich mal das Lib Verzeichnis mit drauf genommen. Da sieht man ja, dass die struts.jar mit drin ist. Müsste doch eigentlich reichen oder?


----------



## HLX (1. Sep 2008)

oetzi hat gesagt.:
			
		

> So, mir ist jetzt aber ein anderes Problem eher zufällig aufgefallen.
> Wenn ich den Tomcat normal über die exe im bin verzeichis starte, startet der ohne Probleme. Wenn ich ihn allerdings über die Eclipse starte, bekomme ich folgende Meldung:


Der Tomcat startet in beiden Fällen. Wenn du den Tomcat über die exe startest wird halt nichts an der Oberfläche ausgegeben. Auftretende Fehler findest du dann in den Log-Dateien im logs-Verzeichnis des Tomcat.



			
				oetzi hat gesagt.:
			
		

> Wenn der die ActionServlet klasse nicht findet, wäre das natürlich evtl. die Lösung, warum die Weiterleitung nicht funktioniert. Aber warum findet er die nicht? Auf dem obigen Screenshot habe ich mal das Lib Verzeichnis mit drauf genommen. Da sieht man ja, dass die struts.jar mit drin ist. Müsste doch eigentlich reichen oder?


Der auftretende Fehler beim Start des Tomcat ist mit ziemlicher Sicherheit die Ursache für dein Problem. Ich vermute, dass das Deployment nicht richtig läuft, weiß allerdings leider nicht, wie dies bei MyEclipse funktioniert. Du könntest deine Anwendung mal als WAR-Archiv exportieren und schauen, ob der Export vollständig ist.

Überprüfe außerdem mal, ob in den J2EE-Libraries die 'jsp-api.jar' ist. Falls ja, entferne sie.


----------



## oetzi (1. Sep 2008)

HLX hat gesagt.:
			
		

> Der auftretende Fehler beim Start des Tomcat ist mit ziemlicher Sicherheit die Ursache für dein Problem. Ich vermute, dass das Deployment nicht richtig läuft, weiß allerdings leider nicht, wie dies bei MyEclipse funktioniert. Du könntest deine Anwendung mal als WAR-Archiv exportieren und schauen, ob der Export vollständig ist.
> 
> Überprüfe außerdem mal, ob in den J2EE-Libraries die 'jsp-api.jar' ist. Falls ja, entferne sie.



-> jsp-api.jar ist nicht vorhanden

Bin jetzt mal in den tomcat_home/webapps/registration ordner und habe dort 'jar cfv reg.war *.*' ausgeführt. Wie soll ich aber jetzt überprüfen, ob der export vollständig ist?
Habe die war-Datei mal über den Tomcat Manager deployt, mit dem selben negativen Ergebnis wie zuvor. Langsam macht es keinen Spaß mehr  Aber aufgeben will ich trotzdem nicht 


So, wenn dieses ganze Zeugs mit myEclipse nicht funktioniert mal ne andere Frage:

WIE KANN ICH STRUTS "PER HAND" NUTZEN? ^^

Als ich mich dafür entschieden habe mir für das was ich vorhabe Struts anzueignen, habe ich nach allen möglichen Tutorials gegoogelt, habe aber quasi nichts einsteigerfreundliches gefunden...
Und da ich immer wieder Hinweise auf MyEclipse gefunden habe, hatte ich mir halt die Testversion davon mal runtergeladen. Es hieß halt immer, dass dort Struts mit drin sei. 
Ich weiß bis jetzt noch nicht wirklich, was wirklich Struts ist!
Vieles in dem Tutorial (z.b. diese ganze Weiterleitungsgeschichte) dürfte doch ne reine Tomcat/Java Technik sein und hat doch nichts mit Struts zu tun?!? So spontan fallen mir nur diese Tag-Libs ein, die wohl definitiv Struts-Technik sind.

So, da mir diese Hintergrundinfos fehlen, weiß ich gar nicht, wie ich jetzt quasie per Hand struts nutze.
Hatte mir mal das "struts-2.0.11.2" runtergeladen, aber damit kann ich auch reichlich wenig anfangen.

Vorallem die Tutorials von apache selbst finde ich ziemlich daneben! Wie kann man in nem Turial Tools wie Maven nutzen?? Da muss ich ja quasi erstmal nen Tut für Maven machen. Das kann ja nicht so ganz Sinn der Sache sein...


Wenn du, oder natürlich sonst jemand, ein gutes Struts Tutorial/Einführung kennt, dann sofort her damit!


----------



## maki (1. Sep 2008)

Wenn du dich mit Servlets auskennst, sollte die Konfiguration einer Webapp mit den struts Bibliotheken kein großes Problem sein.

Servlets sind die absolute Grundlage und sollten auf jedenfall gut verstanden sein, struts selbst ist sehr gut dokumentiert, man muss es eben lesen. Aber ohne Kenntnisse über Servlets wird das eh nix...

Ps: Die struts-blank.war webapp die mit den Binaries kommt ist ein guter Ausgangspunkt für eigene Webapps, sollte man doch importieren können nachdem sie entpackt ist  Ersetzt aber nicht die Grundlagen...


----------



## oetzi (1. Sep 2008)

naja sagen wir mal so,
ich habe gerade frisch meine Ausbildung zum Fachinformatiker abgeschlossen.
Allerdings habe ich leider(!) nicht viel programmiert in der Zeit. Einige ganz gute Schulungen hatten wir, da aber externe Firmen bei uns zu 90% die programmierarbeit übernehmen war es das dann auch.

Darum habe ich mir ja jetzt vorgenommen privat was rumzuprogrammieren um in der Praxis was zu vertiefen 

Java Kenntnisse habe ich würd ich sagen ganz gute, mitsamt dem ganzen OOP Kram etc 
Habe auch schon einmal vor ca. 1,5 Jahren ne kleine Java-Applet Anwendunge geschrieben. Also ganz grün bin ich bei der Sache hier auch nicht mehr hinter den Ohren  
Allerdings muss ich ganz klar zugeben, dass ich nicht aus dem 'effeff' weiß, wie was wo welche Technik genutzt/eingebunden wird, aber dafür wollte ich ja halt ein größeres Projekt mal angehen.

Da mir aber eindringlich empfohlen worden ist, dass ganze nach dem MVC Modell zu machen (da ich dieses Modell kenne, halte ich das selber auch für sehr sinnvoll) und mir bei Java Applets Struts nahegelegt worden ist, probiere ich halt jetzt die ganze Zeit mich da rein zu arbeiten.

Leider ja noch nicht wirklich mit Erfolg 
(soviel zu meinen Hintergründen)


----------



## HLX (1. Sep 2008)

oetzi hat gesagt.:
			
		

> Bin jetzt mal in den tomcat_home/webapps/registration ordner und habe dort 'jar cfv reg.war *.*' ausgeführt. Wie soll ich aber jetzt überprüfen, ob der export vollständig ist?



Das meinte ich nicht. Du kannst doch sicher auch mit MyEclipse ein WAR-Archiv exportieren. In Eclipse geht das z.B. über "Menüleiste --> File --> Export... --> Web --> WAR file.

Das muss doch auch in MyEclipse gehen.

Der Inhalt des WARs entspricht deiner Web-Anwendung, wie du sie von der IDE aus ausführst. Extrahiere das WAR und überprüfe, ob es Vollständig ist, also ob alle Bibliotheken, Klassen JSPs etc. vorhanden sind und an der richtigen Stelle liegen.


----------



## oetzi (1. Sep 2008)

jo, meiner Meinung nach ist da alles bei.
Allerdings rätsel ich immer noch über die Fehlermeldung:

```
SCHWERWIEGEND: Error loading WebappClassLoader
  delegate: false
  repositories:
    /WEB-INF/classes/
----------> Parent Classloader:
org.apache.catalina.loader.StandardClassLoader@54172f
 org.apache.struts.action.ActionServlet
java.lang.ClassNotFoundException: org.apache.struts.action.ActionServlet
```

im classes ordner direkt ist liegt halt nichts mehr. weiß jetzt nicht, ob die Fehlermeldung das direkt bedeutet, oder ob die einfach in irgendeinem Unterordner die ActionServlet Klasse sucht.

Mhh, hier mal meine war Datei. Ist vielleicht nicht schlecht, wenn du mal drüber guckst. Auf mich verlasse ich mich nicht 

http://uploaded.to/?id=o60nat


----------



## HLX (2. Sep 2008)

Du kannst jetzt das WAR-Archiv ins webapps-Verzeichnis deines Tomcat legen und es somit ohne Entwicklungsumgebung deployen. Sollte deine Anwendung dort bereits entpackt liegen, entferne sie vorher. Tritt der Fehler immer noch auf?

Falls ja, vermute ich immer noch einen Fehler in deiner Struktur. In der Fehlermeldung oben kommt folgender Text vor:

```
SCHWERWIEGEND: Servlet /registration threw load() exception
java.lang.ClassNotFoundException: org.apache.struts.action.ActionServlet
```
Du hast doch gar kein Servlet "registration"  :autsch: 

Überprüfe also nochmal die Verzeichnisstruktur der Anwendung.


----------



## maki (2. Sep 2008)

> Habe auch schon einmal vor ca. 1,5 Jahren ne kleine Java-Applet Anwendunge geschrieben. Also ganz grün bin ich bei der Sache hier auch nicht mehr hinter den Ohren icon_wink.gif


Applets haben rein gar nix  mit Servlets zu tun und letztere muss man wirklich verstehen wenn man damit etwas anfangen will, und das willst du doch, oder?



> und mir bei Java Applets Struts nahegelegt worden ist, probiere ich halt jetzt die ganze Zeit mich da rein zu arbeiten.


Nochmal: Applets haben nix mit Servlets zu tun , dir fehlen die absoluten Grundlagen, du bist noch nicht bereit für struts, du musst dich erst mit Servlets auseinandersetzen.


----------



## oetzi (2. Sep 2008)

@maki: Bin grad an nem Servlet Tutorial dran. Bis jetzt bin ich noch über nichts "besonderes" gestolpert. Alles sehr Java-like. Mit dem Unterschied halt, der Kommunikation über request und response.
Gibt es denn sonst noch irgendwelche gravierenden Unterschiede, die ich mir auf jedenfall noch angucken sollte?

Eine generelle Frage nochmal zur Projektstruktur eines solchen Webprojektes!
Ich hänge nämlich gerade (bei dem Servlet Tutorial) an dem selben Problem, an dem ich auch bei dem Struts Tutorial anfangs hing.

Wenn ich ein ganz frisches Projekt (mit der Eclipse) erzeuge, bekomme ich folgende Verzeichnisstruktur:

ProjektXYZ
--src
--libs....
--WebRoot
----META-INF
----WEB-INF
----index.jsp

--> Wenn ich jetzt über localhost:8080/ProjektXYZ mir einfach die index.jsp anzeigen lassen will, bekomme ich sofort den Fehler>
The requested resource (/ProjektXZY/) is not available.
Verschiebe ich jetzt die index.jsp direkt in das Hauptverzeichnis, also so:

ProjektXYZ
--src
--libs....
--WebRoot
----META-INF
----WEB-INF
--index.jsp

funktionert es ohne Probleme.

Das versteh ich mal überhaupt nicht!!
Wie kann ein frisch angelegtes, also von mir noch nicht verfrickeltes  Projekt direkt NICHT laufen? 

Wie ist die Projektstruktur jetzt richtig??
muss die index.jsp in das Hauptverzeichnis ProjektXYZ oder in das WebRoot Verzeichnis?


----------



## HLX (3. Sep 2008)

Sie muss ins WebRoot-Verzeichnis. Dieses Verzeichnis muss allerdings auch als "WebRoot" im MyEclipse-Projekt registriert sein (z.B. beim anlegen des Projektes im Project-Wizzard).

Verwende mal folgendes Tutorial. Dann sollte es eigentlich funktionieren:
www.myeclipseide.com/documentation/quickstarts/webprojects/#web_development_tool_overview


----------



## oetzi (3. Sep 2008)

danke für die Ausdauer mit mir ^^

Hab jetzt das MyEclipse Tutorial angefangen.
Bin bei folgendem Punkt:
http://www.myeclipseide.com/documentation/quickstarts/webprojects/#test_application
Dort steht ja unter anderem, dass nach dem starten des Tomcats folgendes erscheinen soll:



> Verify that the output includes a message similar to the following:
> 
> 
> INFO: Installing web application at context path /HelloWorld from URL file:C:\dev\webservers\Tomcat5.0\webapps\HelloWorld



Tut es bei mir aber nicht! Es kommt nur das was ich schon vor Tagen hier gepostet habe. Sprich diese ganze Fehlergeschichte 
"java.lang.ClassNotFoundException: org.apache.struts.action.ActionServlet" bla bla bla....

Könnte es nicht sein, dass zwar der Tomcat irgendwie startet, aber durch die auftretenden Fehler die verschiedenen webapps nicht richtig "läd"?

Ich kann auf jedenfall noch nichtmal diese helloworld.jsp anzeigen lassen, obwohl ich 100%ig alles gemacht habe, wie in diesem Tutorial!

Kann irgendwie der Tomcat selber verfrickelt sein??


----------



## HLX (3. Sep 2008)

Probier´s aus. Installiere dir z.B. mal Tomcat 5.5 und JDK 1.5 und versuche erneut zu deployen.


----------



## maki (3. Sep 2008)

> }Gibt es denn sonst noch irgendwelche gravierenden Unterschiede, die ich mir auf jedenfall noch angucken sollte?


Multithreading da es jedes Servlet nur einmal gibt pro Servletmapping.
Würde dir nicht schaden die web.xml und die grundlegende Struktur einer webapp zu verstehen, alles wichtige Grundlagen die dir fehlen, deine Probleme die du jetzt hast rühren daher dass dir die Grundlagen fehlen.

Aber manche wollen das eben auf die harte und demotivierende Tour lernen


----------



## oetzi (3. Sep 2008)

bin jetzt nicht mehr zu viel gekommen, da ich mich ab morgen früh für ne Woche in den Urlaub verabschiede.
Danach werde ich mich wieder dran setzen.


----------

