# web.xml / Erreichbarkeit von Servlets



## javaner08 (6. Jun 2011)

Hallo,

es geht um ein kleines Übungsprojekt.

folgende (Standard-)Verzeichnisstruktur : 

web
  |
  |
  L_views
  |
  |
  L_Web-Inf
  |      |
  |      |
  |      L_web.xml
  |
  |
  L_c1.htm
  |
  L_ind.htm

"ind.htm" habe ich in der web.xml unter "welcome-pages" als Start-Seite eingetragen und in ind.htm gibt es einen
Link auf c1.htm

In der web.xml habe ich nun folgendes Servlet eingetragen : 

    <servlet>
      <servlet-name>C1Servlet</servlet-name> 
      <servlet-class>testCh01.C1Servlet</servlet-class> 
    </servlet> 
    <servlet-mapping>
      <servlet-name>C1Servlet</servlet-name> 
      <url-pattern>/C1Servlet</url-pattern> 
    </servlet-mapping>

und dieses C1Servlet wird in c1.htm mit folgender Zeile angesprochen  :
	    <form action="C1Servlet"  method="Post" >

OK, funktioniert auch soweit, wenn ich in dem Formular in c1.htm auf "Submit" klicke, dann wird das JAVA-Servlet
"C1Servlet" ausgeführt.
Aber... : Wenn ich die c1.htm in ein Unterverzeichnis ("views") unterhalb des web-Verzeichnises verschiebe (und dabei natürlich den Link in ind.htm auf c1.htm auf views/c1.htm anpasse), dann wird das C1Servlet nicht gefunden. HTTP-Status 404, requested source not available.

WO muß ich WAS ändern, damit die Sache auch dann funktioniert, wenn c1.htm nicht im web-Verzeichnis liegt sondern in einem Unterverzeichnis von web ?
Geht das irgendwie über die Servlet-Einträge in der web.xml, oder muß ich den action-Eintrag im Formular ändern oder was muß ich machen ?

Das ganze ist als eclipse-Projekt eingerichtet und die "gebuildeten" Java-Klassen befinden sich unter "WEB-INF\classes"


----------



## hexx (6. Jun 2011)

javaner08 hat gesagt.:


> und dieses C1Servlet wird in c1.htm mit folgender Zeile angesprochen  :
> <form action="C1Servlet"  method="Post" >



Mit 
	
	
	
	





```
action="C1Servlet"
```
 gibst du einen relativen Pfad an. Die aufgerufene URL ist also 
	
	
	
	





```
http://host/views/C1Servlet
```
 Du musst also entweder eine absolute URL angeben 
	
	
	
	





```
action="/C1Servlet"
```
 oder das Servletmapping in der web.xml anpassen.


----------



## mvitz (6. Jun 2011)

Und um direkt einen Folgefehler zu vermeiden:
/C1Servlet ist falsch, da Java Webapps einen Kontextnamen (häufig = Name der WAR Datei) haben und eher sellten im Rootcontext laufen.

Aus dem Grund solltest du lieber /<context>/C1Servlet als Action setzen. Um den <context> nicht hartcodieren zu müssen, gibt es in der JSTL den Tag <c:url>.


----------



## maki (6. Jun 2011)

*verschoben*


----------



## javaner08 (6. Jun 2011)

Hallo,

danke erstmal für die Antworten.

Die java-Classes befinden sich - wie schon oben gesagt- unter WEB-INF/classes.

Wenn sich c1.htm direkt unter web befindet, funktioniert alles.
Befindet sich c1.htm unter views (siehe Verzeichnis-Struktur weiter oben), dann funktioniert es eben nicht.

Also in welcher Weise sollte ich da das Servlet-Mapping anpassen ?
Sollte ich unter <servlet-class>testCh01.C1Servlet</servlet-class> noch etwas hinzufügen ? Ich dachte, es reicht aus, wenn der Pfad zu den classes im build-path angegeben ist...

und unter "action=C1Servlet" wird doch eher das angegeben, was unter <servlet-name>C1Servlet</servlet-name> 
angegeben wird und kein kompletter Pfad, oder ?


----------



## hexx (6. Jun 2011)

```
action="C1Servlet"
```
 ist eine relative Pfadangabe (SELFHTML: HTML/XHTML / Allgemeine Regeln für HTML / Referenzieren in HTML). Der Browser vervollständigt die Pfadangabe dann automatisch: Bei 
	
	
	
	





```
/c1.htm
```
 kommt 
	
	
	
	





```
/C1Servlet
```
 dabei heraus, bei 
	
	
	
	





```
/views/c1.htm
```
 wird daraus 
	
	
	
	





```
/views/C1Servlet
```
. Wenn du das so haben willst, musst du halt das Servletmapping anpassen:


```
<servlet-mapping>
  <servlet-name>C1Servlet</servlet-name>
  <url-pattern>/views/C1Servlet</url-pattern>
</servlet-mapping>
```

oder den relativen Pfad anpassen:


```
action="../C1Servlet"
```

oder halt eine absolute Pfadangabe benutzen:


```
action="/C1Servlet"
```

Der Ort der Klassendateien hat damit nichts zu tun.

Und beachte das, was mvitz zum Kontextpfad geschrieben hat. Das hatte ich in meinem ersten Post vergessen.


----------



## javaner08 (6. Jun 2011)

Hallo,

vielen Dank, dass Ihr Euch die Zeit genommen habt, hier Eure Antworten zu posten.

Ich hab's jetzt folgendermaßen hingekriegt : 

In views/c1.htm steht jetzt :

	    <form action="../C1Servlet"  method="Post" >



Und in der web.xml steht nach wie vor : 

    <servlet-mapping>
      <servlet-name>C1Servlet</servlet-name> 
      <url-pattern>/C1Servlet</url-pattern> 
    </servlet-mapping>


... und funktioniert. Das entsprechende servlet wird gefunden.

Aber davon abgesehen schaue ich mir gleich trotzdem nochmal Eure Links bzgl. der relativen Pfade usw.. an.
Vielen Dank.


----------

