[JSP + Tomcat + Servlet] Servlet Pfad im form-tag

Helios co.

Lt. Commander
Registriert
März 2005
Beiträge
1.863
Hallo @all,

zunächst einige Details:
-> Ich schreibe ein größeres JSP Projekt und versuche mich daher im MVC Konzept.
-> Als IDE nutze ich Eclipse (das MyEclipse Plugin)
-> Einfache JSPs vom browser aus aufzurufen stellt kein Problem dar (habe ich zumindest schon mit den aktuellen EInstellungen gemacht)
-> Das EInbinden von Java Klassen hat auch schon gefunzt, bis dato in der Art:
Code:
<%@ page import = "klassen.FrontController" %>

<jsp:useBean id="fc" class="klassen.FrontController" scope="session"/>
<jsp:setProperty name="fc" property="*"/>

-> Jetzt möchte ich folgende probieren:
Code:
 <form name="indexForm" 
   action="/klassen.FrontController" 
   method="POST">


	<table width="300" border="0" align="left">
		<tbody><tr>
		<td>Click for Registration:</td>
		<td><input type = "hidden" name = "action" value = "registration">
			<input type = "submit" name = "Submit" value = "Registration">
		</td></tr>
		<tr>
		<td>Click for Login:</td>
		<td><input type = "hidden" name = "action" value = "login">
			<input type = "submit" name = "Submit" value = "Login">
		</td></tr>
		</tbody>
	</table>
	
	
 </form>

-> klassen ist hier bei ein Paket, in dem sich die Klasse FrontController. java befindet.
-> Die Idee ist es also die EIngabe an den FrontController weiterzuleiten. Dieser prüft dann den Wert action, ob es sich um login oder registration handelt und arbeitet dann entsprechend weiter.

-> dafür bekomme ich jtzt aber eine 404 Exception im Browser, die wie folgt aussieht:
Code:
type Status report

message /klassen.FrontController

description The requested resource (/klassen.FrontController) is not available.


Woran könnte es liegen? Ich habe schon alle möglichen Pfade ausprobiert.
Gelesen habe ich, dass Tomcat Probleme machen kann, wenn die Servlets nicht im Standardverzeichnis liegen (stimmt das? Wenn ja: Welches Verzeichnis ist das?)


UPDATE:

Wenn ich in der JSP die FrontController Klasse zusätzlich importiere, und zwar in der Art:
Code:
<%@ page import = "klassen.FrontController"; %>

kriege ich folgenden Fehler:

Code:
 type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

org.apache.jasper.JasperException: /index.jsp(2,0) Unterminated &lt;%@ page tag
	org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:40)
	org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:407)
	org.apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.java:132)
	org.apache.jasper.compiler.Parser.parseDirective(Parser.java:522)
	org.apache.jasper.compiler.Parser.parseElements(Parser.java:1444)
	org.apache.jasper.compiler.Parser.parse(Parser.java:138)
	org.apache.jasper.compiler.ParserController.doParse(ParserController.java:216)
	org.apache.jasper.compiler.ParserController.parse(ParserController.java:103)
	org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:154)
	org.apache.jasper.compiler.Compiler.compile(Compiler.java:315)
	org.apache.jasper.compiler.Compiler.compile(Compiler.java:295)
	org.apache.jasper.compiler.Compiler.compile(Compiler.java:282)
	org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:586)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:317)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

note The full stack trace of the root cause is available in the Apache Tomcat/6.0.18 logs.
 
Zuletzt bearbeitet:
hast du die Web.xml richtig angegeben? Wenn du unsicher bist poste hier mal :)

Also beim MVZ Pattern ahst du 3 Schichten:

jsp-Seiten als View

Servlets als Controller

Buisness Logic und DB als Model

Was ich bei dir vermisse ist die Controllerschicht, dein forward aus dem Loginformular geht direkt an eine Java-Klasse die ich dem Model zuschreiben würde.

Zu deinem Fehler, ich denke der Fehler leigt auch in diesem Fehler der Controller fängt den Klick auf, erzeugt eine Actionklasse und in dieser Actionklasse imporierst du dann deine benötigten Klassen.
In JSPs sollten nur Beans importiert werden keine berechnenden Klassen!

Grüße Gusty
 
Nun ja, es gibt ja wenn ich das richtig verstanden habe 2 web.xml Dateien. Die eine liegt im WEB-INF Ordner des Projekts. Die andere liegt im Tomcat Verzeichnis (conf Ordner).
Das ineterssante ist jedoch, dass ich unter denselben Einstellungen bereits Java Klassen in JSPsimportieren konnte. (ohne irgendwelche Änderungen an der web.xml vornehmen zu müssen)


Die erste sieht bei mir so aus:
Code:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>HelloWorld</display-name>
  <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>

Die zweite ist zu lange um sie hier zu posten (wobei, wenn man die mime type mapping sentfernt ginge es sogar).


Zu deiner Antwort:
Der FrontController ist bei mir der Controller, welcher als Servlet implementiert ist.
Code:
public class FrontController extends HttpServlet

Ich gehe was das angeht eigentlich nach einem Tutorial vor. Aber vielleicht habe ich da etwas falsch verstanden. Das obige Beispiel soll eigentlich nur 2 Buttons anzeigen (login und registration). Je nach dem was geklickt wurde (das entscheidet der Controller anhand von "action"). Anhand dessen soll dann der FrontController andere Klassen (also die Logik) instantzieren. Diese schreiben Werte in die DB oder lesen aus ihr aus. Diese Werte liegen dann dem FrontController zur Verfügung. Dieser bringt sie in die richtige Form und wählt die passende View (alsoeine JSP) aus.
 
Zuletzt bearbeitet:
Ok ;)

Die Zweite ist die wichtigere da werden deine Servlets gemapped.
In deiner xml gibst du nur deine Start Webseite an, was aber nach strengen MVC-Pattern eine Verletzung darstellt. Ist ja ok, wenn du die Index.jsp als erste Webseite angibst.
So, bei der Klickt aber der Nutzer nur auf Login oder Regestrieren, also musst du diesen Klick abfangen.

action="Login"

So als Bsp. habe ich nun eine ControllerServlet.java, das mapping in der XML (Web-INF) schaut so aus:

Code:
<servlet>
		<servlet-name>ControllerServlet</servlet-name>
		<servlet-class>MeinProjekt.controller.ControllerServlet</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>ControllerServlet</servlet-name>
		<url-pattern>/ControllerServlet</url-pattern>
	</servlet-mapping>
So in dem ControllerServlet entscheidest was passiert:

Code:
if (action.equals("Login") {

- Erzeuge eine Actionklasse zum ausführen des Login

Code:
LoginAction myAction = new LoginAction ();
String forward = myAction.doAction();

- Nun werden in der der LoginAction.java die benötigeten Klassen aus deinem Package geladen und dann der Loginvorgang vollzogen und eine Rückgabe für den Controller erzeugt.
z.B. "fail" für fehlschlagen oder "success".

- Nun wertet der Controller die Rückgabe aus und schickt sie an die View weiter
zb. bei "fail"

Code:
if (forwardInfo.equals("fail")) {
			
			url = res.encodeURL("/WEB-INF/jsp/user/error.jsp");
			req.getRequestDispatcher(url).forward(req, res);

Ich hoffe ich konnte helfen! :)
 
HI,

jap das konnste du allerdings!
Vielen Dank!

Vielleicht aber noch eine Frage:
Und zwar bezüglich Sessions in JSP.

Ich habe mich jetzt eibisschen damit beschäftigt und kam dabei zu "komischen" Ergebnissen (mal hats geklappt und mal nicht).

Was ich will, ist in einer JSP (aus der View )z.B. Namen und Adresse eingeben lassen. Dass soll dann in ein User Objekt gedrückt werden, und das soll wiederum in eine Session, welche in einer 2ten JSP ausgelesen wird (und das Objekt rausgeholt). Hier wird das Objekt dann weiterverarbeitet.

Könntest du mir den prinzipiellen Ablauf (also Code) dazu skizzieren?
 
Zuletzt bearbeitet:
also ich könnte dir schon den Code geben, allerdings lernst du dabei nichts, poste mal wie du ein Session Attribut erzeugst und wie du es anhängst, ein Tipp, die View hat nichts mit Session zu tun im strikten MVC ist eine jsp, nur für die Darstellung zuständig!

mfg
Gusty
 
Das macht Sinn,und dann möchte ich die Tage auch gerne drauf zurückkommen.
Im Moment habe ich leider ein dringlicheres Problem, und vielleicht kannst du/ihr mir zunächst hierbei helfen?

Folgendes Szenario:

Ich habe eine pic.js, welche in einer Schleife 3 Bilder anzeigt. Eine weitere Schleife erzeugt für jedes Bild 3 Checkboxes (ich mache das in Schleifen, weil die Darstellung bei Bedarf dynamisch geändert werden soll).

Die Checkboxes (bei allen Bildern) sind gleich benannt (Also z.B.: rot, grün, k.a.).

Weiterhin soll es einen "Next"- Button geben, der bewirken soll, dass die angeklickten Checkboxes (also die Werte) gespeichert werden sollen.
Anschließend sollen im selben JSP drei weitere Bilder geladen werden.
Und das geht so lange, wie Bilder in einem Vector vorhanden sind.

Fragen
1. Ist so etwas überhaupt möglich, ohne dass man eine weitere JSP braucht? (an die dann die Werte geschickt werden)
2. Die Checkboxes sind ja für alle Bilder gleichbenannt. D.h. doch, dass ich ein Problem bei der Auswertung haben werde!?
3. Hat jemand sonst eine Idee, wie man das geschilderte Problem lösen kann?


Nachtrag: Kann mir denn keiner helfen oder habe ich mich schlicht besch.!* ausgedrückt?
 
1. Ja ist es durch Fallunterscheidung Scriptlets, Taglibs in den JSP, aber eher unschön und wird irgendwann unübersichtlich.
2. Naja du hast ein Bild geldaen dem verpasst du eine ID, die Checkboxen bekommen einen Namen und ich denke es wird in eine Datenbank gespeichert, oder ein Array schon hast du eine Zuordnung (pic0001, grün, rot) (pic0002, blau) etc.
3. Und das Ende der Schleife wenn der Vector bei next null zurückliefert gehst du auf eine andere JSP und holst die Daten und wertest sie aus
 
1. Ja ist es durch Fallunterscheidung Scriptlets, Taglibs in den JSP, aber eher unschön und wird irgendwann unübersichtlich.
So sieht es momentan auch aus, aber als Afänger, der ich nun einmal bin, ist mir auch keine besser Lösung eingefallen.


3. Und das Ende der Schleife wenn der Vector bei next null zurückliefert gehst du auf eine andere JSP und holst die Daten und wertest sie aus
Hmm so weit komme ich garnicht. In einer Controller.jsp werden die Daten mit Hilfe einer Bean aus der DB geholt und in den Vector gesteckt. Hier ist dann auch meine while-Schleife über den Vector. Diese holt jeweils 3 Bilder aus dem Vector und mittels <jsp:forward... wird die pic.jsp aufgerufen und diese stellt die 3 bilder samt checkboxen dar und der Next-Button ist auch hier.

Das Problem ist jetzt, dass ich im Controller den klick quasi abfangen muss, damit die Schleife fortgesetzt werden kann.
Und genau das geht nicht (falls das überhaupt gehen kann)

Bin momentan echt ratlos.
 
Zuletzt bearbeitet:
Zurück
Oben