Struts Grundlagen Frage

Status
Nicht offen für weitere Antworten.

oetzi

Bekanntes Mitglied
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:

Code:
   <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

Top Contributor
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:
Code:
<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
Code:
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.
 
G

Guest

Gast
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

Bekanntes Mitglied
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...
 
G

Guest

Gast
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

Top Contributor
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

Bekanntes Mitglied
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:
Code:
<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.

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:
Code:
<?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.
Code:
<form action="/login.do" method="post">

Die Java Klasse 'LoginAction.java' sieht so aus:
Code:
	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
Code:
<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

Top Contributor
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.
Code:
<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:
Code:
<html:form action="login.do">...

oetzi hat gesagt.:
Die Java Klasse 'LoginAction.java' sieht so aus:
Code:
	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");
	}
Statt die Requestparameter auszulesen, solltest du sie auf eine Formularklasse mappen. Dazu findest du sicher auch etwas im Tutorial.
 

oetzi

Bekanntes Mitglied
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:
Code:
<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.:
Die Java Klasse 'LoginAction.java' sieht so aus:
Code:
	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");
	}
Statt die Requestparameter auszulesen, solltest du sie auf eine Formularklasse mappen. Dazu findest du sicher auch etwas im Tutorial.

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

Top Contributor
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.
Code:
<form action='<%= request.getContextPath() +"/login.do"%>'>...
 

oetzi

Bekanntes Mitglied
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)
Code:
    <servlet-name>action</servlet-name>
    <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
und
Code:
  <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
Code:
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

Top Contributor
Deine Erkenntnisse sind weitestgehend korrekt. :toll:

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

HLX

Top Contributor
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

Bekanntes Mitglied
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:
Code:
<%@ 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

Top Contributor
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

Bekanntes Mitglied
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

Top Contributor
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

Bekanntes Mitglied
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:

Code:
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

Top Contributor
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

Bekanntes Mitglied
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! :)
 
M

maki

Gast
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

Bekanntes Mitglied
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

Top Contributor
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

Bekanntes Mitglied
jo, meiner Meinung nach ist da alles bei.
Allerdings rätsel ich immer noch über die Fehlermeldung:
Code:
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

Top Contributor
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:
Code:
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.
 
M

maki

Gast
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

Bekanntes Mitglied
@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?
 

oetzi

Bekanntes Mitglied
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

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

maki

Gast
}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

Bekanntes Mitglied
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.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
I heutzutage Struts 1 oder 2 in der Praxis? Web Tier 4
K Struts Struts forwarded lokal auf fertige Webseite Web Tier 2
M Struts 2 - "There is no Action mapped for namespace..." - globale Lösung? Web Tier 3
S Tomcat 7, Struts, JPA baut keine Verbindung auf Web Tier 13
D Struts 2 , DIV Container mit verschiedner Farbe Web Tier 2
K Struts request Zugriff Web Tier 4
2 Anwendung mit Zuständen und Struts Web Tier 5
P Struts 2 Download Dateinamen Web Tier 2
ruutaiokwu struts 2 & jsf kombinieren Web Tier 2
D Struts und CSS Web Tier 4
7 Struts+AJAX- Session-Handling? Web Tier 2
7 Struts und Ajax. Problem mit Actions Web Tier 2
7 Struts iterator index JS-Funktion übergeben?? Web Tier 2
7 Struts: bei action immer ein Result nötig? Web Tier 2
7 Struts vom popup wieder zurück ins alte Fenster? Web Tier 2
7 statische Variablen in Struts-Tags nutzen? Web Tier 6
7 Struts Performance-Schwäche Web Tier 5
7 Struts Actionaufruf durch JS Web Tier 4
L Struts 2 Iterator Validation Web Tier 4
Tandibur Struts 2 - Startseite festlegen Web Tier 5
J Struts aus JSP ActionForm-Eigenschaft lesen Web Tier 5
7 Struts 2 nebeneinanderliegende Textfelder Web Tier 4
E Struts: Text in JSP aus Action heraus setzen Web Tier 4
F Struts Tabellen Web Tier 3
F Meinungsumfrage Struts / Javascript Web Tier 3
F Problem mit Struts Web Tier 2
T Json mit Struts 2 Web Tier 2
2 Blätterfunktion in Struts? Web Tier 2
S Struts - Http Port ändern Web Tier 11
L Struts JSTL Form Variable Übermitteln Web Tier 2
S GET in struts und JSF Web Tier 6
O JSP: HTML tags werden vor struts tags angezeigt Web Tier 3
L Struts Validation Error Web Tier 17
L STRUTS: javax.servlet.jsp.JspException Web Tier 3
O struts - Gültigkeit einer Action an Session binden?! Web Tier 4
N MessageResources von Struts in Form-Bean Web Tier 4
pusteblume JavaScript mit Struts auslesen? Web Tier 3
A Struts - JSP - HTML - Visualisierungsproblem Web Tier 3
M Properties der JSP nach input-result leer (Struts 2) Web Tier 2
M Zugriff aus eigenen Tags auf Struts Value Stack Web Tier 2
M Struts 2 Submit Button lokalisieren Web Tier 5
G Struts 2 Validation Web Tier 5
pusteblume Struts multibox - dynamische checkboxen Web Tier 5
G Struts 2 - Validation Frage Web Tier 5
T Action mapping Frage (Struts) Web Tier 2
J Struts 2 session ID auslesen? Web Tier 5
G Kurze Frage zu Servlets&Struts Web Tier 4
G Performance Struts vs Faceltes vs JSP Web Tier 9
N Struts - reset, wie komme ich an das ActionMapping Web Tier 2
T In einem Struts Tag Werte mit Java einfügen Web Tier 2
B struts-blank, eclipse und tomcat6 konfigurieren Web Tier 7
T Tabelle mit checkboxen in Struts Web Tier 19
T Button abfrage mit Struts leicht gemacht ? Web Tier 3
B Struts: html:checkbox Web Tier 2
U Problem bei Validierung mit Struts 2 Web Tier 1
A JSF und Struts unter einen Hut bringen (SingleSignOn) Web Tier 2
R Webhoster mit Struts Web Tier 13
S Struts: Validierung mit mask Web Tier 2
G radio button deselect mit struts Web Tier 7
pkm Frage zum URL-Pattern des Bereitstellungsdeskriptors Web Tier 11
A Anfänger-Frage Servlet/Applet/JSP Web Tier 0
C Wahrscheinlich einfache Frage bzgl. JSF Web Tier 2
F JSF Frage zu valueChangeListener Web Tier 1
F JSF synchronized(session) Frage ? Web Tier 1
F JSF h:selectManyCheckbox Css Frage Web Tier 2
F JSF p:selectCheckboxMenu Frage Web Tier 0
S JSF Allgemeine Frage zu JSF Web Tier 10
U Servlet Allgemeine Frage zu Servlets Web Tier 2
K Frage zu Taglibs in JSF Web Tier 3
C Kleinere Frage EJB/JSF Web Tier 7
M Design-Frage: JSP, Servlets und CSS Web Tier 11
M Frage zur Konfiguration einer RichFaces DataTable Web Tier 4
F Frage zu Java Beans Web Tier 17
F Frage zum Validator Web Tier 2
J Frage zu Checkbox bei JSF Web Tier 3
S Frage bezüglich Einblendung eines Zusatzfeldes Web Tier 2
O Escapen oder nicht Escapen, das ist hier die Frage :) (Struts2) Web Tier 2
H Frage zu Servlet getRequestDispatcher Web Tier 2
S JSF: Frage wegen managed-bean Web Tier 3
E File upload mit jsp (frage zum speicherort) Web Tier 12
G Kurze Frage zu editier-Formularen Web Tier 7
O kurze Frage zur Tomcat Installation Web Tier 2
E einfache Frage zu Servlet (Counter erzeugen) Web Tier 7
W getServletConfig().getInitParameter(.) Frage Web Tier 5
G Frage zu Tiles Web Tier 4
M Grundlegende Frage zu Servlets und JSPs Web Tier 12

Ähnliche Java Themen

Neue Themen


Oben