# Tomcat Anfängerfrage arbeiten mit JSP



## Souljumper (17. Mai 2008)

hi, ich versuche mich grad etwas in den tomcat einzuarbeiten, mit mehr oder weniger erfolg.

ich möchte jetzt erstmal für mein Projekt erreichen, dass nur eine index.jsp direkt zugänglich ist. dort soll man sich dann einloggen (derzeit einfach auf ok drücken, ist keine db oder ähnliches hinter) und dann kommt man auf eine seite wo hello world steht.

meine index.jsp liegt top-lvl in meinem Verzeichnis(is doch richtig ?) und sieht so aus


```
<html>
<head>
<title>Login</title>
</head>
<body>
<form action="/Toobee/hello" method="post">
Username: <input type="text" name="username">

Password: <input type="password" name="pwd">

<input type="submit" value="LogIn">
</form>
</body>
</html>
```

meine web.xml sieht so aus:

```
<!DOCTYPE web-app PUBLIC
  '-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN'
  'http://java.sun.com/dtd/web-app_2_3.dtd'>
<web-app>

  <servlet>
    <servlet-name>hello</servlet-name>
    <servlet-class>HelloServlet</servlet-class>
  </servlet>
  
  <servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/hello</url-pattern>
  </servlet-mapping> 
  
</web-app>
```

meine hello world seite is dann eine normale java-klasse

```
import java.io.*;

import javax.servlet.http.*;
import javax.servlet.*;

public class HelloServlet extends HttpServlet {
  public void doGet (HttpServletRequest req,
                                         HttpServletResponse res)
        throws ServletException, IOException
  {
        PrintWriter out = res.getWriter();
        out.println(new String("Hello world"));
        out.close();
  }
}
```

was ich gerne hätte ist, das man die index seite nur erreicht wenn man 
localhost:8080/<Ordner>/index.jsp

eingibt, ich hab aber nicht geschafft herauszufinden, wie man den zugriff für jsp seiten in der web.xml eintragen muss.

sämtliche anderen servlets/jsp in diesem ordner sollen dabei nicht zugänglich sein, mein helloWorld serlvet kann man derzeit auch über localhost:8080/<ordner>/hello erreichen....

kann mir jemand sagen wie ich das eintragen muss, oder was ich falsch mache ?


----------



## maki (17. Mai 2008)

Wieso falsch?

Das hier:

```
<servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/hello</url-pattern>
  </servlet-mapping>
```
führt zu dem hier:


> mein helloWorld serlvet kann man derzeit auch über localhost:8080/<ordner>/hello erreichen


----------



## Souljumper (17. Mai 2008)

ja, ok.

mir gehts aber momentan darum das problem mit der index.jsp zu lösen. ich krieg die einfach nicht zum laufen.

wenn ich localhost:8080/<servlet-ordner>/index.jsp 

im browser eintippe, soll meine jsp seit erscheinen.

ich hab versucht das zu erreichen in dem ich folgen web.xml eintragungen ausprobiert habe:

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

tut sich leider gar nichts.... und ich hab versucht die jsp als normales servlet zu handhaben, da ich gelesen hab das es eh umgesetzt wird in eine .java file und dann kompiliert wird.


```
<servlet>
    <servlet-name>index</servlet-name>
    <servlet-class>index_jsp</servlet-class>
  </servlet>
  
  <servlet-mapping>
    <servlet-name>index</servlet-name>
    <url-pattern>/index.jsp</url-pattern>
  </servlet-mapping>
```

diese variante führt aber zu einer exception


> type Exception report
> 
> message
> 
> ...



also mein ziel ist es, dass meine index.jsp nur über den pfad localhost:8080/<servlet-ordner>/index.jsp aufgerufen werden kann. wie erreiche ich das?


----------



## maki (17. Mai 2008)

> wenn ich localhost:8080/<servlet-ordner>/index.jsp
> 
> im browser eintippe, soll meine jsp seit erscheinen.


Was soll <servlet-ordner> sein?

Meinst du deine WebApp, auch Context genannt?


```
<welcome-file-list>
     <welcome-file>index.jsp</welcome-file>
</welcome-file-list>
```
Das ist richtig, der Aufruf aber soll so aussehen:
http://localhost:8080/<webapp>/

Wenn du index.jsp direkt aufrufst mit
http://localhost:8080/<webapp>/index.jsp
muss es auch funktionieren, aber in diesem Falle wird das welcome-file-list element der web.xml auh gar nicht ausgewertet.

Das hier is quatsch:

```
<servlet>
    <servlet-name>index</servlet-name>
    <servlet-class>index_jsp</servlet-class>
  </servlet>
 
  <servlet-mapping>
    <servlet-name>index</servlet-name>
    <url-pattern>/index.jsp</url-pattern>
  </servlet-mapping>
```

Bedenke auch dass alle URIs case-sensitive sind, schliesslich geht es hier um Java 

Welche Bücher/Tutorials nutzt du?
Ist alles nicht so trivial als dass man es durch trial&error lernen könnte.


----------



## Souljumper (17. Mai 2008)

ich benutze noch keine tutorials, oder eher gesagt, ich habe keine gefunden die mir das thema mit der index.jsp näher bringen konnten.

mit <servlet-ordner> ist der Ordner meiner Web-Anwendung gemeint, also der ordnre der unter webapps im tomcat installationsverzeichnis liegt, wenn man dieses den benutzt (was bei  mimr nicht der fall ist, ich hab meine web-applikation nach außen gelegt, einfach um die verschiedenen funktionen von tomcat auf dem doit-yourself weg kennen zu lernen )

ok, es ist also normal das wenn ich nur den pfad meiner webapp angebe, und es eine index.jsp gibt, er diese automatisch nimmt?! (hast recht, mit direkt zumgriff über <webapp>/index.jsp geht es auch, hab ich wohl übersehen)

welche tutorials oder bücher kannst du den empfehlen?


----------



## dajos7 (20. Mai 2008)

Hallo,

schau mal eine Struktur für ein Web Projekt sieht zB so aus:


```
/ROOT
|
+ /WEB-INF
|  |
|  + /classes
|  |   |
|  |   + /de
|  |       |
|  |       +HelloServlet.class
|  |
|  + web.xml
|
|
+index.jsp
```
Achte auf case-sensitivity. Das wurde mir zu deinem Fehlerchen hier in einigen Foren angeboten. "classes" muss immer Lowercase sein!

Eine Standard web.xml sieht so aus.

```
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
	<display-name>testserver4444</display-name>
	
<servlet>
    <servlet-name>hello</servlet-name>
    <servlet-class>HelloServlet</servlet-class>
  </servlet>
 
  <servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/hello</url-pattern>
  </servlet-mapping> 

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

Verwendet werden sollten das JDK und selbstverständlich ein Container, der die WebAnwendung hält zB tomcat. Das JRE hat zB keinen compiler. Ab Version 5.5 von Tomcat ist dann auch JRE verwendbar. Aber das sollte man als Entwickler nicht machen, schon alleine wegen der Dokumention, die man da zusätzlich bekommt. 

Ebenso solltest Du dein Servlet abändern: DoPost wird hier verlangt, was Du in der Form auch bekannt machst, verwendest aber im Servlet nur doGet, das führt zu einem 405 Fehlerchen 
Verwende ebenso keine default Packages! Also immer mindestens ein Package einrichten. Ich hab hier in Bsp. immer "de".


```
package de;
import java.io.*;

import javax.servlet.http.*;
import javax.servlet.*;

public class HelloServlet extends HttpServlet {

	private static final long serialVersionUID = -3654876251516837609L;

	public void doGet(HttpServletRequest req, HttpServletResponse res)
			throws ServletException, IOException {
		PrintWriter out = res.getWriter();
		out.println(new String("Hello world"));
		out.close();
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
		doGet(req, res);
	}
	
}
```


Ändere deine index.jsp auch zu dem hier um:


```
<html>
<head>
<title>Login</title>
</head>
<body>
<form action="./hello" method="post">
Username: <input type="text" name="username">

Password: <input type="password" name="pwd">

<input type="submit" value="LogIn">
</form>
</body>
</html>
```


PS verwende immer eine IDE. Die nimmt dir sehr sehr viel Arbeit ab. Heute arbeitet niemand mehr wirklich ohne IDE. Ich verwende privat Lomboz, die ist frei und umfasst sehr sehr viele Packete. Ebenso lässt sie sich, weil sie auf Eclipse basiert mit weiteren Plugins erweitern.

Dein Projekt lief hier in 5 min mit den minimalen Änderungen mit dem POST direkt. Läuft auch sofort wenn ich das in einen standalone ROOT im Tomcat ausführe.

Wenn Du mehr wissen willst melde dich mal bei mir mit einer PM. Ich progammiere hauptberuflich Web Anwendungen und kann Dir da ein wenig was zeigen und auch Tutorials empfehlen. Wenn Du icq oder ähnliche IM hast ist das auch hilfreich.

Normalerweise verwendet man für solche dinge dann Struts oder JSF. Das macht das gestalten der URL zugriffe etwas einfacher, ebenso lassen sich forms wesentlich leichter erzeugen. Aber Du möchtest ja von grund auf was lernen. 

Über den Context-ROOT kann man in der Server.xml das RootVerzeichnis setzen:
zB

```
...

<Context docBase="testserver" path="/testserver" reloadable="true"/>
...
```

Dann gibt es eine Option im Tomcat, die nennt sich Directory Browsing. Ist keine welcome datei vorhanden, die in der web.xml festgelegt wurde, dann wird das Verzeichnis angezeigt. Diese kann man deaktivieren, indem man ein DefaultServlet in der web.xml lädt und dort den Parameter setzt:
( Quelle )


```
...
<servlet>
	
        <servlet-name>local_default</servlet-name>
        <servlet-class>
          org.apache.catalina.servlets.DefaultServlet
        </servlet-class>
        <init-param>
            <param-name>debug</param-name>
            <param-value>0</param-value>
        </init-param>
        <init-param>
            <param-name>listings</param-name>
            <param-value>false</param-value>
        </init-param>
        <init-param>
            <param-name>readonly</param-name>
            <param-value>true</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

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

...
```

Weiter kann ich Dir noch sagen, dass jsp seiten ausserhalb der WEB-INF eigentlich nichts zu suchen haben. JSP Seiten liegen (zumindest mache ich das so) immer in der WEB-INF Struktur, damit dort niemand zugreifen kann.  Man kann JSP-Seiten im Verzeichnis haben, die nach aussen nicht referenziet sind. Ebenso wird die Verzeichnisstruktur nach aussen hin unkenntlich gemacht:


```
...
   <servlet>
    <servlet-name>hello2</servlet-name>
    <jsp-file>/WEB-INF/test.jsp</jsp-file>
  </servlet>
  <servlet-mapping>
    <servlet-name>hello2</servlet-name>
    <url-pattern>/hello2</url-pattern>
  </servlet-mapping> 
...
```

Man leitet dann von der index.jsp direkt auf eine innenliegende login.jsp weiter, die man über ein definiertes URL Pattern zB /login.do oder auch /login macht. damit ist man von dem Verzeichniskrams weg und hat volle Kontrolle über die definierten URL patterns.


----------



## robthemobb (17. Jul 2008)

Hallo zusammen,

ich bin auch neu in der Materie und mir machen diese drei Dateien auch schon zu schaffen.

Ich habe nun mal die web.xml wie sie mein Vorredner geschrieben hat kopiert, habe in Eclipse ein Tomcat-projekt angelegt und dort die HelloServlet.java in den Ordner WEB-INF/src gelegt mit dem package "de"
Die index.jsp liegt im Projektordner, der heisst bei mir Kimberly.

über localhost/Kimberly/index.jsp komm ich zwar auf die index-Seite, aber sobald ich den submit-Button drücke bekomme ich die fehlermeldung 404, von wegen servlet sei nicht available...

Kann es sein, dass die Nutzung von packages was damit zu tun hat? 
Ich habe vor ein paar Tagen "nur" ein Servlet geschrieben, dass helloworld ausgibt und mit defaultpackage kein Problem, sobald ich aber ein package benant habe, ging es nicht mehr...

viele grüße, rob


----------



## robthemobb (17. Jul 2008)




----------



## robthemobb (17. Jul 2008)

Hallo zusammen,

ich bin auch neu in der Materie und mir machen diese drei Dateien auch schon zu schaffen.

Ich habe nun mal die web.xml wie sie mein Vorredner geschrieben hat kopiert, habe in Eclipse ein Tomcat-projekt angelegt und dort die HelloServlet.java in den Ordner WEB-INF/src gelegt mit dem package "de"
Die index.jsp liegt im Projektordner, der heisst bei mir Kimberly.

über localhost/Kimberly/index.jsp komm ich zwar auf die index-Seite, aber sobald ich den submit-Button drücke bekomme ich die fehlermeldung 404, von wegen servlet sei nicht available...

Kann es sein, dass die Nutzung von packages was damit zu tun hat? 
Ich habe vor ein paar Tagen "nur" ein Servlet geschrieben, dass helloworld ausgibt und mit defaultpackage kein Problem, sobald ich aber ein 
	
	
	
	





```
package
```
 benant habe, ging es nicht mehr...

viele grüße, rob


----------



## robthemobb (17. Jul 2008)

so, habe es eben nochmal mit nem defaultpackage gemacht, da ging es.

kann mir das bitte einer erklären? hängt das mit der .classpath datei zusammen? 
habe da eben schon ein wenig drin rumgespielt, aber bin zu keinem adäquaten ergebnis gekommen...

rob


----------



## maki (17. Jul 2008)

Hallo robthemobb,

darf man fragen wieviel Erfahrung/Kenntnisse du schon in Java hast?

Für mich sieht das hier nach der Ursache aus:


> und dort die HelloServlet.java in den Ordner WEB-INF/src gelegt mit dem package "de"


So sollte der komplette Pfad sein: WEB-INF/src/de/HelloServlet.java

Java Klassen ohne package sind mies, können nicht importiert werden, sollte man nie machen.

Ansonsten sind Servlets wirklich gut beschrieben, welche Doku nutzt du?


----------



## robthemobb (17. Jul 2008)

also nochmal zum verständnis die HelloServlet liegt in Eclipse im Packege de, welches im Ordner WEB-INF/src ist.
Daraus ergibt sich ja für den Tomcat der pfad.

hm, ja default packages sind mieß, hat mein  prof mir auch immer beigebracht. habe mit java so halbwegs gute kenntnisse für nen informatik-studenten. aber noch nie was mit jsp und so gemacht. schwerpunkt liegt halt doch woanders 


aber nochmal zum pfad zurück, das scheint ganz interessant zu sein:

muss ich den evtl irgendwo bekannt geben? denn wenn das package da ist, ist ja auch ein ordner da, der nen anderem pfad (einem der benutzt wird) nicht gleicht, was die 404 erklärt.

welche doku/tut ich benutze. hm schwierig. bastel mir aus allem was zusammen. im endeffekt soll ich mit den lowagie.itext geschichten was machen. wollt mir vorher mal die jsp geschichte anschauen.

ich find das alles nicht so wirklich gelungen. mal isses nicht komplett implementiert, dann mal wieder schlecht beschrieben. da scheint noch nachholbedarf zu sein.
oder habt ihr tips für mich, welche gut sind?

rob


----------



## maki (17. Jul 2008)

WEB-INF/src/de/

War das der Pfad unter der die Datei HelloServlet.java lag, ja oder nein?
Wenn nein dann war das dein Problem.

Für Tomcat ist das kein Pfad, sondern der Classpath für Java.

Webanwendungen sind komplex in Java, nicht dafür geeignet durch trial&error erlernt zu werden, stattdessen wundert man sich nur..

Ich persönlich steh auf die Servlet Spek. + ein paar Tutorials aus dem Web und ein gutes Buch (früher fand ich die von O'reilly gut, k. A. was heute gut ist).


----------



## robthemobb (17. Jul 2008)

also pfad im expülorer
C:\itext-core\Kimberly\WEB-INF\classes\de

pfad in eclipse Kimberly(Projekt)/ \"WEB-INF/src\"/de(package)/HelloServlet.java


also antwort auf deine frage: ja, dort lag sie. 
also nicht mein problem, schade. 
.classpath sieht so aus:
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
	<classpathentry kind="var" path="TOMCAT_HOME/common/lib/servlet-api.jar"/>
	<classpathentry kind="var" path="TOMCAT_HOME/common/lib/jasper-runtime.jar"/>
	<classpathentry kind="var" path="TOMCAT_HOME/common/lib/jsp-api.jar"/>
	<classpathentry kind="src" path="WEB-INF*/src/de"/*>
	<classpathentry kind="src" output="work" path="work"/>
	<classpathentry kind="output" path="WEB-INF/classes"/>
</classpath>
gibt den 404 fehler


<?xml version="1.0" encoding="UTF-8"?>
<classpath>
	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
	<classpathentry kind="var" path="TOMCAT_HOME/common/lib/servlet-api.jar"/>
	<classpathentry kind="var" path="TOMCAT_HOME/common/lib/jasper-runtime.jar"/>
	<classpathentry kind="var" path="TOMCAT_HOME/common/lib/jsp-api.jar"/>
	<classpathentry kind="src" path="WEB-INF/*src*"/>
	<classpathentry kind="src" output="work" path="work"/>
	<classpathentry kind="output" path="WEB-INF/classes"/>
</classpath>
gibt den 500fehler

alles nicht so gut.

ne idee?

sorry, dafür dass ich so kurz angebunden bin. bin ein wenig vom tag abgef...

rob


----------



## maki (17. Jul 2008)

Würde da gar nicht lange rumsuchen.

Stattdessen: New -> Projekt... -> Dynamic Web Project


----------



## robthemobb (17. Jul 2008)

gerne, danke!

wo ist der vorteil?


----------



## maki (18. Jul 2008)

Wenn du noch kein dyn. Webprojekt hattest, ist das der sauberste Weg.

Ansonsten habe ich es persönlich lieber, auf einer sauberen Ausgangsbasis zu starten wenn der Verlust (1 Servlet?) nicht allzugross ist bevor ich anfange Fehler zu suchen, speziell wenn ich die Technologie & IDE noch nicht richtig verstehe.

Der Classpath sollte eigentlich anstandslos funktionieren, k.A. was da schief gelaufen ist.

Denkst du daran den Tomcat Server neu zu starten nachdem du Klassen geändert hast?


----------

