# Über Formular Daten zu Servlet



## IceTi (9. Jan 2008)

Hallo,

ich möchte in einer JSP Datei über ein Formular einem Servlet Daten schicken.
Das Servlet steht soweit und hat auch die doPost Methode.

Doch was genau muss ich beim Formular bei action="" angeben?
Der Name des Servlets funktioniert leider nicht.
Eine web.xml habe ich auch nicht.

Danke


----------



## HLX (9. Jan 2008)

Du brauchst grundsätzlich eine web.xml. Diese sollte u.a. folgenden Eintrag enthält


```
<servlet>
    <servlet-name>MyServlet</servlet-name>
    <servlet-class>myPackage.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>MyServlet</servlet-name>
    <url-pattern>/callMyServlet</url-pattern>
</servlet-mapping>
```

Das URL-Pattern führt dich dann innerhalb der Anwendung zum Servlet.


----------



## IceTi (9. Jan 2008)

Bei der action="" trage ich dann also "callMyServlet" ein, oder?

Leider funktioniert das so immer noch nicht.
Die xml Datei liegt bei mir im WEB-INF Odrner (ich arbeite mit Eclipse)


----------



## HLX (9. Jan 2008)

Du hast den "/" vorher vergessen --> /callMyServlet.


----------



## IceTi (9. Jan 2008)

Mit dem Slash geht es auch nicht, noch eine Idee?


----------



## maki (9. Jan 2008)

HLX hat gesagt.:
			
		

> Du hast den "/" vorher vergessen --> /callMyServlet.


Und du hast den Context vergessen


----------



## IceTi (9. Jan 2008)

Was meinst du mit Context... ?
Wo muss ich das eintragen ?


----------



## maki (9. Jan 2008)

Den Context deiner Webanwendung, willst sie ja wohl kaum als Root Context laufen lassen.


----------



## IceTi (9. Jan 2008)

???

Es soll ein Registrierungsformular werden.
Hat doch aber nichts mit dme Problem zu tun oder ?


----------



## maki (9. Jan 2008)

IceTi hat gesagt.:
			
		

> ???
> 
> Es soll ein Registrierungsformular werden.
> Hat doch aber nichts mit dme Problem zu tun oder ?


Wenn das Problem ist, dass du dich offensichtlich nicht genug mit Servlets auseinandrgesetzt hast, dann schon 

Sorry, aber der Context ist wichtig, eine der Grundlagen.

Du willst doch sicher das deine Anwendung auch auf einem Tomcat Server normal laufen kann, oder?


----------



## IceTi (9. Jan 2008)

Es läuft ja schon auf einem TomCat...
Ich denke es liegt irgendwie am Pfad...


----------



## MiDniGG (9. Jan 2008)

Gut

Zum Registrieren hast ja sicher nen Button oder irgendwas mit dem de auf das Servlet verlinken kannst. 

im form teil und action schreib ich normal nie was außer ich glaube, wenn du statt Button Submit als input type nimmst kannste da das Servlet reinschreiben. bin ich etz aba ned sicher... Auf jeden Fall solltest du im form teil einen Namen haben und als methode eben post oder get je nach dem was du nutzt.

So. Meine methode ist es im javascript teil eine function zu definieren z.b.:


```
<script type="text/javascript">

	function subm()
	{
		document.form1.action="<%=getServletContext().getContextPath()%>/LoginServlet";
		document.form1.submi.value="login";
		document.form1.submit();
		document.form1.submi.value="";
	}

</script>
```

So. Da die normalen Buttons doof sind sag ich ihm noch, dass er doch bitte beim click die function laden soll:


```
<input type="button" name="btSend" value="Anmelden" onclick="subm()" />
<input type="hidden" name="submi" />
```

mit "onclick"

dieses komische hiddenfeld braucht man, weil.... gute frage ich weiß nur, dass der button irgendwie zu blöd zum kommunizieren ist und deswegen das hidden-feld dafür einspringen muss ^^

So. Ist das nun geschafft, sollte eigentlich beim klick auf den Button das gewünschte Servlet (hier: LoginServlet) gestartet werden. Dort kann man dann mit den übergebenen Parametern (hier: "login") alles anstellen was man möchte.

So mach ich das zumindest immer. Gibt bestimmt noch schönere wege 


cya


----------



## IceTi (9. Jan 2008)

Ja genau ich habe einen Button.
Es wird halt nur das Servlet nicht gefunden... habe ich jetz schon mit vielen Beispielen vergliechen, ich finde einfach keinen Fehler mehr ...


----------



## maki (9. Jan 2008)

IceTi hat gesagt.:
			
		

> Es läuft ja schon auf einem TomCat...
> Ich denke es liegt irgendwie am Pfad...


Das glaubst du vielleicht 

In manchen IDEs/Tomcat Plugins wird  immer er ROOT context verwendet, keine gute Idee imho, auf dem Prod Server gibt's dann 404 Fehler.

Es ist schon möglich eine Webapp ohne Kontext zu betreiben, aber sehr schäbig.
Es ist aber nicht möglich eine vernünftige Webapp ohne Grundkenntnisse zu schreiben.

"Bildung bremst nicht.."


----------



## maki (9. Jan 2008)

```
<%=getServletContext().getContextPath()%>
```
Na also, da hat jemand seine Hausaufgaben gemacht


----------



## IceTi (9. Jan 2008)

Ja aber kann ich das nicht einfach anders schrieben dann ?
Oder wie mache ich diesen Kontext ?


----------



## MiDniGG (9. Jan 2008)

maki hat gesagt.:
			
		

> ```
> <%=getServletContext().getContextPath()%>
> ```
> Na also, da hat jemand seine Hausaufgaben gemacht



hehe thx :-D


----------



## IceTi (9. Jan 2008)

maki hat gesagt.:
			
		

> ```
> <%=getServletContext().getContextPath()%>
> ```



Probier ich mal aus...


----------



## maki (9. Jan 2008)

http://tomcat.apache.org/tomcat-5.5-doc/config/context.html

Bitte auch die Servlet Spec. beachten.

Sollte eigentlich in jedem Servlet Buch behandelt werden, ist ja wie gesagt eine Grundlage, nix kompliziertes.

Der Context ist Teil der URL, falscher Context = falsche URL.


----------



## MiDniGG (9. Jan 2008)

IceTi hat gesagt.:
			
		

> Es wird halt nur das Servlet nicht gefunden... habe ich jetz schon mit vielen Beispielen vergliechen, ich finde einfach keinen Fehler mehr ...



Kannst ja evtl. mal Codeschnipsls posten, vielleicht findet ja jmd. was und ist dann auch noch so nett es zu sagen.


----------



## Gast (9. Jan 2008)

Das Problem wurde gelöst, danke für die Hilfe


----------



## MiDniGG (9. Jan 2008)

Und die Lösung?

So viel Zeit sollte sein.....Finde ich... 
(Und Haken setzen nicht vergessen ^^)


----------



## Gast (9. Jan 2008)

<%=getServletContext().getContextPath()%> 

hat es ermöglicht, dass das servlet auch gefunden wurde... dann hatten wir eine leere seite vor uns.

Die Ausgaben auf der folgenden Seite haben uns dann nochmal kurz geärgert, aber das ging dann auch fix...

Jetzt müssen wir die Registrierung weiter coden, also fertig ist es noch nicht. Aber immerhin wissen wir nun wie wir weiter kommen 

Danke nochmal


----------



## IceTi (9. Jan 2008)

Hi,

ich habe es nun geschafft Daten von einem Formular an ein Servlet zu schicken.
Doch wird dann halt das Servlet im Browser angezeigt.
Wie mache ich das, dass das Servlet eine anderen Seite aufruft ?

Oder welche Möglichkeiten gibt es da noch, das Servlet erst gar nicht anzuzeigen?

DANKE


----------



## MiDniGG (9. Jan 2008)

Heho,

also wenn ich mich nicht täusche musst du dem Servlet in der verwendeten Methode (post/get) sagen, dass es die JSP wieder aufrufen soll.

Das müsste in etwa so aussehen:


```
protected void doPost / doGet(HttpServletRequest request, HttpServletResponse response)
{
     ...
     request.getRequestDispatcher(index.jsp).forward(request, response);
}
```

Dann solltest du aber natürlich alles was du ausgeben möchtest in die JSP laden.
Und falls du bei richtigem Login zu einer anderen Seite möchtest logischerweise das index.jsp einfach durch AndereSeiteDieGeladenWerdenSoll.jsp ersetzen. :-D

Ich schau morgen aba nochmal nach ob das wirklich so ging... :###

*Edit:* Jop. Passt so wie es dasteht. Man kann statt forward auch include nehmen, was genau allerdings der Unterschied ist wissen wohl nur Google und Wikipedia ;-)


----------



## Niki (10. Jan 2008)

Mich hat das mit dem Kontext ein wenig verwirrt, denn bei mir hat es so geklappt:


```
<html>
<head>
<title>Mail Versand</title>
</head>
<body>


<form action="modules/mail">


To:

<input name="to" type="text" size="30" maxlength="30"></p>


Subject:

<input name="sub" type="text" size="30" maxlength="40"></p>


Message:

<textarea name="msg" cols="50" rows="10"></textarea></p>
<input type="submit" value=" Absenden "></form>
</body>
</html>
```

und wenn ich versuch, den Kontext einzubauen, sagt er, dass er die Methode getContextPath() nicht findet, was mach ich falsch?


```
<html>
<head>
<title>Mail Versand</title>
</head>
<body>


<form action="<%=getServletContext().getContextPath()%>/modules/mail">


To:

<input name="to" type="text" size="30" maxlength="30"></p>


Subject:

<input name="sub" type="text" size="30" maxlength="40"></p>


Message:

<textarea name="msg" cols="50" rows="10"></textarea></p>
<input type="submit" value=" Absenden "></form>
</body>
</html>
```

mit

```
<%=request.getContextPath()%>
```
gehts auch wieder. Bekomm ich da ein anderes ServletContext-Objekt zurück als ihr, dass er die Methode getContextPath() nicht findet?


----------



## maki (10. Jan 2008)

> Man kann statt forward auch include nehmen, was genau allerdings der Unterschied ist wissen wohl nur Google und Wikipedia icon_wink.gif


Steht auch in der Doku und in jedem halbwegs guten Servlet Buch 
In diesem Falle wäre der forward wohl die richtige Wahl.



> und wenn ich versuch, den Kontext einzubauen, sagt er, dass er die Methode getContextPath() nicht findet, was mach ich falsch?


Nach welchen Servletstandard arbeitet deine Webapp?


----------



## Niki (10. Jan 2008)

Meinst du die specification-Version? Das ist 2.4. Ich nehm halt das servlet-api.jar welches beim Tomcat 5.5.23 dabei ist


----------



## Niki (10. Jan 2008)

Ok, alles klar, hab gerade nachgeschaut, gibts erst ab spec 2.5, danke für den Denkanstoß!
Warum funktioniert es aber auch mit action="modules/mail"? Die webapp läuft nicht als root, liegt ganz normal unter webapps...


----------



## maki (10. Jan 2008)

Niki hat gesagt.:
			
		

> Ok, alles klar, hab gerade nachgeschaut, gibts erst ab spec 2.5, danke für den Denkanstoß!
> Warum funktioniert es aber auch mit action="modules/mail"? Die webapp läuft nicht als root, liegt ganz normal unter webapps...


Wie heisst denn deine Webapp? (Ist normalerweise auch der Context)

Es ist möglich einer Webapp mehrere Contexte zuzuweisen, allerdings werden diese dann wie unterschiedliche Anwendungen behandelt, da kann man sich ganz tolle Fehler damit bauen, die erst in der Produktion richtig auffallen


----------



## Niki (10. Jan 2008)

Die webapp heißt kfa. Mehrere Contexte hat sie nicht.


----------



## maki (10. Jan 2008)

Niki hat gesagt.:
			
		

> Die webapp heißt kfa. Mehrere Contexte hat sie nicht.


Versuche doch mal eine Seite aufzurufen, einmal mit dem Context in der URL, einmal ohne.

Was passiert?


----------



## Niki (10. Jan 2008)

naja, die jsp rufe ich auf mit http://localhost:8080/kfa/jsp/mail.jsp
das Servlet ist auf /modules/mail gemappt
Es funktioniert eben beides, mit dem context und ohne dem context in der action, also: /kfa/modules/mail und modules/mail


----------



## Niki (10. Jan 2008)

Es dürfte nur gehen wenn die jsp nicht im ordner jsp liegt, sondern im root von der webapp! Jetzt ist mir das ganze auch klar warum man den context angeben soll!


----------



## maki (10. Jan 2008)

> Es funktioniert eben beides, mit dem context und ohne dem context in der action, also: /kfa/modules/mail und modules/mail


Dann läuft deine Anwendung einmal als ROOT Context, und einmal als kfa.

Sorry, aber eine andere Erklärung gibt es dafür nicht, denn der Context muss stimmen, sonst gibt nen 404 Fehler vom Server.

Wie startest du den Tomcat Server? Aus der IDE? Das WTP Tomat Plugin zB verändert die Tomcat Konfig dauerhaft, das Tomcat Plugin von Sysdeo auch. 
Eine frische und saubere (!) Tomcat installation zum testen sollte helfen es herauszufinden, einfach manuell deployen.

Das würde im Produktivbetrieb zum ernsthaften Problem werden, lieber jetzt lösen.


----------



## Niki (10. Jan 2008)

Ich starte meine webapp nie aus der IDE, genau aus solchen Gründen.
Ich bezweifle dass meine Applikation als root gestartet wird. Soweit ich das verstanden habe lag der Fehler daran, dass die jsp im Ordner jsp liegt, und er dann als url : kfa/jsp/modules/mail verwendet hat, wenn man als action "modules/mail" verwendet.
Wenn ich aber als action "<%=request.getContextPath()%>/modules/mail" verwende ist die url /kfa/modules/mail weil der context /kfa ist, dann findet er auch das Servlet
Lieg ich richtig?


----------



## maki (10. Jan 2008)

Ja, du liegst richtig.

Eine relative URL wird vom Browser vervollständigt, mit context, servernamen und Port.

d.h. aus modules/mail wir http://servername:port/kfa/modules/mail
aber aus */*modules/mail wird http://servername:port/modules/mail

Dann ist ja alles in Butter


----------

