URL bei WebApp wird immer laenger

Status
Nicht offen für weitere Antworten.

Niki

Top Contributor
Hallo Forum!

Ich versuche gerade anhand eines kleinen Beispiels das MVC Prinzip bei einer WebApp zu verstehen.
Ich habe ein zentrales ControllerServlet welches die Requests dispatched.
Die jeweilige Klassen sollen dann ein Model befüllen und mittels forward die View erneut anzeigen.
Das funktioniert auch zwar, jedoch wird die URL bei einer falschen Eingabe beim Login immer länger.
Hier ist mal der Code:

Controller
Code:
import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import controller.login.LoginBean;

public class ControllerServlet extends HttpServlet {
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		doGet(req, resp);
	}

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		
		String action = req.getParameter("action");
		if("logon".equals(action))
			new LoginBean().login(req.getParameter("user"), req.getParameter("pwd"), req, resp);

	}
}


LoginBean zum validieren der LoginDaten
Code:
import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import model.Model;

public class LoginBean {
	public void login(String user, String pwd, HttpServletRequest request, HttpServletResponse resp) throws ServletException, IOException{		
		HttpSession session = request.getSession();
		if("admin".equals(user) && "master".equals(pwd)){
			Model model = new Model();
			model.setUser(user);
			session.setAttribute("model", model);
			request.getRequestDispatcher("/jsps/greeting.jsp").forward(request, resp);
		} else {
			request.getRequestDispatcher("/index.jsp").forward(request, resp);
		}
	}
}

Model
Code:
public class Model {
	private String user = null;

	public String getUser() {
		return user;
	}

	public void setUser(String user) {
		this.user = user;
	}
	
}

web.xml:
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>WebappMVC</display-name>
  
  <servlet>
		<description></description>
		<display-name>Controller</display-name>
		<servlet-name>ControllerServlet</servlet-name>
		<servlet-class>controller.ControllerServlet</servlet-class>		
	</servlet>
	<servlet-mapping>
		<servlet-name>ControllerServlet</servlet-name>
		<url-pattern>/servlets/*</url-pattern>
	</servlet-mapping>
  
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>  
  </welcome-file-list>
</web-app>

index.jsp
Code:
<html>
<body>
<form action="servlets/logon" method="post">
	<table>
		<tr>
		<td>UserID:</td>
		<td><input type="text" maxlength="6" name="user"></td>
		</tr>
		<tr>
		<td>PWD:</td>
		<td><input type="password" maxlength="8" name="pwd"></td>
		</tr>	
	</table>
	<input type="hidden" name="action" value="logon"/>
	<input type="submit" value="Anmelden" />
</form>
</body>
</html>

greeting.jsp
Code:
<%@ page import="model.Model"%>
<html>
<body>
<%
	Model model = (Model) request.getSession().getAttribute("model");
%>
<h3>Hallo <%= model.getUser() %></h3>
</body>
</html>

Das man keine Scriptlets verwenden soll ist mir schon klar. Mir gings nur darum schnell einmal das MVC abzubilden.

Ruf ich das ganze so auf:
http://localhost:8080/webappmvc/index.jsp
wird die Seite angezeigt, trage ich was falsches ein erzeugt er mir im Browser diese URL:
http://localhost:8080/webappmvc/servlets/logon
wird jedoch wieder etwas falschen eingegeben, wird diese URL angezeigt:
http://localhost:8080/webappmvc/servlets/servlets/logon

Hatte jemand schon mal dieses Problem? Ist wahrscheinlich nur ein kleiner Einstellungsfehler.

Danke schon mal für Hilfe!
 

Niki

Top Contributor
Habs selber gelöst. In der index.jsp gehört der Contextpath hinzugefügt:
Code:
<html>
<body>
<form action="<%=request.getContextPath() %>/servlets/logon" method="post">
	<table>
		<tr>
		<td>UserID:</td>
		<td><input type="text" maxlength="6" name="user"></td>
		</tr>
		<tr>
		<td>PWD:</td>
		<td><input type="password" maxlength="8" name="pwd"></td>
		</tr>	
	</table>
	<input type="hidden" name="action" value="logon"/>
	<input type="submit" value="Anmelden" />
</form>
</body>
</html>
 
M

maki

Gast
Code:
..
<servlet-mapping>
      <servlet-name>ControllerServlet</servlet-name>
      <url-pattern>/servlets/*</url-pattern>
   </servlet-mapping> 

...
<%=request.getContextPath() %>/servlets/logon
..
Nur so am Rande, wieso mappst du /servlets/ auf dein Servlet?
Der servlets path ist soz. der Weg um alle Servlets anzusprechen laut spec.

An deiner Stelle würde ich einfach ein Mapping in der Art
Code:
...
   <servlet-mapping>
      <servlet-name>ControllerServlet</servlet-name>
      <url-pattern>/controller/*</url-pattern>
   </servlet-mapping> 
...
erstellen und es dann auch nutzen:
Code:
...
<%=request.getContextPath() %>/controller/
...
Den Namen der Aktion kannst du dann auch per Post mitschicken, so wird der User bei einem Refresh(F5) gleich gewarnt, auch wenn ihn das nicht unbedingt abhält es trotzdem zu versuchen.
 

Niki

Top Contributor
Da hast du recht, wäre natürlich sprechender. Den Namen der Aktion schick ich als hidden-Field im Form mit. Gibts dafür eine elegantere Möglichkeit?
 
M

maki

Gast
Hidden Field im Formular ist gut, eine andere Möglichkeit wäre ein Button, sogar einfacher, vom Servlet aus sieht man den Unterschied nicht mal.

Wenn du es ohne Form machen willst musst du viel mit JS anbieten, nicht so dolle.

Und dann?

Dann könnte man sicn überlegen, wie man die Namen der Aktionen zu den Action-Klassen mappt.

Am Anfang reicht es, wenn der Controller mit einem if-else Konstrukt prüft und dann die Klasse aufruft.

Später jedoch willst du bestimmt den Namen der Aktion mit der Aktion-Klasse in einer Datei Mappen (per konfiguration).
Ein gemeinsames Interface für alle Aktion-Klassen welches nur eine Methode definiert (zB. execute) macht das Leben hier einfacher.
Da wären wir dann beim Command Handler Pattern angekommen, wir sind fast bei struts :)

Ich finde es gut das du dich der Sache von Anfang an annimmst, fördert das Verständnis, danach hast du wenig Probleme mit Frameworks.
 

Niki

Top Contributor
Genau darum geht es mir eben. JS hört sich gar nicht gut an, ich bin Applikationsentwickler und will daher möglichst wenig mit JS/html zutun haben. Daher finde ich ja eigentlich JSF sehr nett. Das mit einer dynamischen Actionmap, welche sich über eine properties Datei konfigurieren lässt habe ich des öfteren schon umgesetzt. Auch mit einem gemeinsamen Interface. Dabei hab ich immer die Actionklassen in einem ContextListener beim Starten der Applikation geladen, fand ich eigentlich sehr schön gelöst, da diese nur einmalig geladen werden.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M webapp controller funktioniert nicht Web Tier 3
H Singleton für In-Memory-Caching in WebApp Web Tier 4
C Webapp spielt verrückt Web Tier 2
M Classpath für JPA in Tomcat Webapp: Wie konfigurieren? Web Tier 4
J tomcat webapp restarten Web Tier 2
S Webapp und mysql. mysql verliert die verbindung nach langer zeit Web Tier 6
U Grundaufbau der Webapp mit JSP/Servlets Web Tier 7
N Info bei Start von WebApp ausgeben Web Tier 8
L Set<T> Attribut eines Objektes wird zu null in thymeleaf Web Tier 2
C JSP data wird nicht angezeigt Web Tier 6
jann Servlet Bei jedem Request wird eine neue Session erstellt. Web Tier 6
P JSF (Primefaces) SelectOneMenu Value auf Array wird nicht gesetzt Web Tier 0
W Tabelle wird nicht aktualisiert Web Tier 8
A JSF String wird nicht angezeigt Web Tier 2
S JSF CSS wird gefunden aber inhaltlich nicht angewendet Web Tier 2
R get-methode der Managed-Bean wird immer 3 mal ausgeführt Web Tier 4
R JSF ManagedProperty wird nicht erstellt Web Tier 1
G JSF Radio Button ValueChangeListener Wert wird nicht übernommen Web Tier 2
M fileUploadListener geht nicht wenn Element zur Laufzeit gerendert wird Web Tier 2
T JSF Primefaces beim öffnen eines p:dialog wird eine neue View ManagedBean erstellt Web Tier 2
nrg Java-Code in Taglib wird nicht richtig ausgeführt. Web Tier 7
F JSF CSS Verschachtelung wird nicht abgebildet Web Tier 2
F.S.WhiTeY Servlet Servlet wird nicht angesprochen Web Tier 3
D JSF a4j:support wird nicht gefunden Web Tier 2
H JSP, Eclipse, Tomcat - Java Klasse wird nicht gefunden Web Tier 8
T JSF wird nicht ausgeführt Web Tier 4
aze JSF CommandButton:Action wird nicht ausgeführt Web Tier 2
H JSF ActionListener wird ausgeführt, aber ändert den Wert nicht. Web Tier 7
L JSF Beispiel wird nicht ausgeführt Web Tier 2
T JSF Eigener Converter wird nur für Eingabekomponenten aufgerufen? Web Tier 3
M JSF Button - Methode wird nicht aufgerufen Web Tier 4
L einfache JSF-Seite wird nicht angezeigt Web Tier 8
B JSF HtmlCommandButton --- Action wird nicht aufgerufen Web Tier 2
N JSF [Maven] Seam 2.2, Richfaces 3.3 - a4j wird nicht umgewandelt Web Tier 6
P JSF AJAX render wird nicht ausgeführt Web Tier 4
X Seite wird mit AJAX neu geladen Web Tier 4
P Servlet wird nicht gefunden - HTTP Error 503 Web Tier 7
S JSF Primefaces Thema, Css wird geladen, nur die Bilder nicht, bzw Resource wird nicht aufgelöst Web Tier 5
borobudur Servlet Business-Logik wird bei jedem Request neu erstellt Web Tier 13
J JSF JSF2.0 template wird nicht gerendert!? Web Tier 2
C GWT: RPC wird nicht gefunden Web Tier 3
I Beim zurück-Link wird immer ein Request ausgeführt Web Tier 5
E JSP ist es noch aktuell oder wird heute was anderes genutzt? Web Tier 3
D [JSF] Lifecycle Methode wird mehrfach aufgerufen Web Tier 4
J JSF Custom Component ValueExpression wird nur als String erkannt Web Tier 2
E init() wird mehrmals aufgerufen Web Tier 4
L [RichFaces] Applikation wird mit NullPointerException beendet Web Tier 5
E CSS wird nach RequestDispatcher.redirect nicht mehr geladen Web Tier 7
V JSF: dataTable Getter wird nie aufgerufen Web Tier 6
megachucky JSF - JSTL Library wird nicht gefunden Web Tier 4
Z Servlet Response HTTP-Status 200 wird nicht übertragen Web Tier 3
K [gelöst] JSF-Seite wird nicht angezeigt Web Tier 3
H JSF Seite wird plain angezeigt Web Tier 3
G JSP/JSF Inputtext rerender wenn Value geändert wird Web Tier 2
I servlet: init wird auch nach ServletException aufgerufen Web Tier 3
E Struts XML validation schlägt immer fehl Web Tier 1
OnDemand JSF from Entity erstellt immer ein Feld ID Web Tier 6
eskimo328 Macht REST immer sinn? Web Tier 1
F JSF Bean funktioniert nicht immer.. Web Tier 3
S JQuery und Primefaces (Immer wieder Ärger damit) Web Tier 0
7 Struts: bei action immer ein Result nötig? Web Tier 2
Y JSF immer neu deployen Web Tier 6

Ähnliche Java Themen


Oben