# action url nach der umleitung finden



## DreamArtist (14. Aug 2006)

Morgen liebe Javaner,

ich habe ein Problem mit Stuts.

Ich habe meine struts-config in der ich von *.do auf diverse *.jsp mappe.
Ich mache eine Datenbankabfrage die mehr 0-n Ergebnisse zurückliefert.
Damit diese nicht alle auf einer Seite angezeigt werden müssen habe ich einen 
Tag geschrieben in der ich die Bean angeben kann deren Collection angezeigt werden soll.
Um nun jedoch eine Blätterlogik einzubinden muss ich in dem Tag wieder auf die Action verweisen da meine jsp ja unter WEB-INF liegen. 

Die eigentliche Frage nun:

Wie komme ich einen Tag zu der Action-URL die aufgerufen wurde ehe auf die jsp umgeleitet wird?

lg DreamArtist


----------



## HLX (14. Aug 2006)

1. JSPs gehören nicht in WEB-INF.
2. Was meinst du mit Blätterlogik?


----------



## DreamArtist (14. Aug 2006)

Danke für die AW
Blätterlogik = ich habe 300 Ergebnisse und möchte in n Schritte durch diese Navigieren(blättern)

JSP gehören nicht in WEB-INF, ich weis das dies von SUN so vorgegeben ist, jedoch wurde diese aus Sicherheitsgründen in den WEB-INF Ordner verschoben.

lg DreamArtist


----------



## HLX (14. Aug 2006)

Aha, und beim Blättern sendest du wieder eine HTTP-Nachricht an deine Action. In dieser solltest du Parameter setzen, die dein Tag anschließend verarbeiten kann.


----------



## DreamArtist (14. Aug 2006)

Die Parameter habe ich, nur die *.do hab ich nicht, wie komme ich in meinem selbstgeschriebenen Tag zu den?


----------



## HLX (14. Aug 2006)

Was willst du mit deiner Action? Alles was dort zugreifbar ist kannst du an deinen View per Parameter übermitteln.


----------



## DreamArtist (14. Aug 2006)

ich glaube ich habe das etwas falsch erklärt.

folgender ablauf:

EingabeFormularseite = /WEB-INF/jsp/formulare/suchMaske.jsp

In dieser ist ein Formular mit den suchfeldern die auf die

ErgebnisSeite = /WEB-INF/jsp/seiten/ergebnis.jsp

Nun habe ich einen Generische Tag geschrieben der das Struts-Formular aus den Session-Scope holt und
die Ergebnisse anzeigt.

Nun kommen aber mehrere Suchmasken und Ergebnismasken im weiteren Projektverlauf hinzu, 
für diese will ich ebenfalls den Tag nehmen.

Das alles funktioniert schon *AUSSER *wie komme ich auf die JSP wenn ich nicht die struts-action aufrufen kann?

lg DreamArtist


----------



## HLX (14. Aug 2006)

Ich raff hier glaube ich irgendwas nicht.  ???:L  Spielt dein Tag die Rolle des Navigators? Wohin leitet denn dein ActionServlet weiter, wenn du die Navigation in einem Tag vornehmen möchtest? Wie kann überhaupt zwischen den Seiten navigiert werden? Was tut der Benutzer um sich ein Ergebnis anzeigen zu lassen?


----------



## DreamArtist (16. Aug 2006)

HLX hat gesagt.:
			
		

> Ich raff hier glaube ich irgendwas nicht.  ???:L  Spielt dein Tag die Rolle des Navigators? Wohin leitet denn dein ActionServlet weiter, wenn du die Navigation in einem Tag vornehmen möchtest? Wie kann überhaupt zwischen den Seiten navigiert werden? Was tut der Benutzer um sich ein Ergebnis anzeigen zu lassen?



Der Tag soll auf die aufgerufene Seite verweisen, nur ergänzt er den Aufruf um ein paar für ihm interessante Paramater(wieviele Ergebnisse wurden angezeigt, wieviele sollen angezeigt werden...) 

Der Ablauf ist dann:

1. Benutzer gibt eine Suche ein
2. Benutzer wird auf die Ergebnisseite umgeleitet
3. Benutzer klickt auf "nächste Seite" bei der angezeigte HTML-Ergebnisliste
4. Tag leitet auf die selbe Seite um nur mit der Zusatzinfo bei welchen Ergebnissatz der Benutzer derzeit lag

Und genau bei dem 4. Punkt stößt es sich

lg DreamArtist


----------



## HLX (16. Aug 2006)

Verstehe. Hier würde ich dir empfehlen (auch wenn´s schwer fällt) einige Dinge in eine Action zu verschieben. Im Sinne von MVC und Struts ist dies m.E. eine saubere und komfortabler Lösung. Es findet eine Interaktion mit dem Server statt, die eine Veränderung der Ausgabeseite zur Folge hat. Mit deinem Tag verschiebst du ein Logik bzw. Controller-Problem in den View. 

Was glaubst du welche Lösung mächtiger ist?
1. Ausgabeseite --> Server (Tag-Verarbeitung) --> Ausgabeseite
2. Ausgabeseite --> Server (Action) --> Ausgabeseite
--> Die Action hat viel mehr Mittel zur Verfügung, deine Anfrage adäquat zu Verarbeiten als das Tag.  

Also: Sobald auf weiter geklickt wird soll eine Action die entsprechende Bean mit neuen Werten versorgen sobald und anschließend wieder auf die Ergebnisseite leiten. ob du Serverseitig die Werte von der DB neu anforderst oder in einem Cache hälst bleibt dir überlassen.


----------



## DreamArtist (16. Aug 2006)

Das wäre soweit ja kein Problem aber

dann müsste ich für jede Ergebnisliste diese Navigationsschritte in die Action packen und verliere dadurch den
Vorteil Code nur einmal zu implementieren. Als vernünfitg sehe ich hier an das der Tag die Parameter angibt diese jedoch in der Action ausgelesen werden und an den Business-Controller weitergeleitet werden der wiederrum auf das DAO zugreift und die Daten ausliest.
Aber so ist es auch :wink: , da alle Applikation den geleichen Tag verwendet kann ich hier auch einigermassen garantieren das diese Methodik Applikationsübergreifend funktioniert und nicht von jeder Applikation in jeder der zahlreichen Action implementiert werden muss. 

Ich sehe darin kein Widerspruch zu MVC und auch nicht in der OOP  :### 

Und als Nachdruck: Der Tag soll nicht für ein Anwendungsfall benutzt werdne sondern für mehrere 100, obwohl er meiner Meinung nach ab dem 3. schon geschrieben werden sollte.

lg DreamArtist


----------



## KSG9|sebastian (16. Aug 2006)

HLX hat schon recht...das ganze sollte ungefähr so aussehen

Ablauf sollte jsp -> tag -> action sein. Und bei nem klick auf Next wird dieselbe Aktion wieder aufgerufen, nur eben mit nem anderen Parameter.

Da hast du nicht mehr Code oder sonstwas, nur eben ne saubere Trennung.


----------



## DreamArtist (16. Aug 2006)

Wird ja auch so gemacht!

Mein Problem ist ja das ich vom Tag nicht mehr auf die ActionURL umleiten kann damit die Action aufgerufen wird!

ich will in meinm tag der eine liste darstellt ja nur wieder die selbe action aufrufen nur mit einen anderen beginn und optional count.


----------



## KSG9|sebastian (17. Aug 2006)

Was genau macht den dein Tag?Warum machste das ganze nicht so:


```
<strutslink><custom-tag>wert</custom-tag></strutslink>
```

Dann kannst du über den Link die Action aufrufen und über den CustomTag diverse Parameter ablegen. Die Action die du aufrufst MUSS in der JSP bekannt sein, oder hast du bei nem Klick auf nen Link nen zufälligen Forward? *g*


----------



## DreamArtist (17. Aug 2006)

Wie kann ich denn in meiner TagKlasse auf den action Link zugreifen.

Hier der Code der Methode für die Navigation


```
private String printNavigation(){
		HttpServletRequest request = (HttpServletRequest)pageContext.getRequest();
		StringBuffer buffer = new StringBuffer();
		buffer.append("<tr>");
		buffer.append("<td colspan=\"" + (keys.length+1) + "\">");
		buffer.append("<div style=\"text-align=center\">");
		buffer.append("<span style=\"padding-left=2px; padding-right=2px;\">");
		buffer.append(HTMLList.PFEIL_ANFANG);
		buffer.append("</span>");
		buffer.append("<span style=\"padding-left=2px; padding-right=2px;\">");
		buffer.append(HTMLList.PFEIL_ZURUECK);
		buffer.append("</span>");
		
		
		String sonderZeichen = "?";
		if(request.getParameterMap().size()!=0){
			sonderZeichen += "&";
		}
		String count = "0";
		if(request.getParameter("count")!=null){
			count = request.getParameter("count");
		}
		
		try{
		buffer.append("<span style=\"padding-left=3px; padding-right=3px;\">");
		
		//+++++++++++++++++++++++++++++++++++++++++++++++++
		//Hier z.B.: will ich auf die ActionURL zugreifen
		//+++++++++++++++++++++++++++++++++++++++++++++++++
		String plus10 = "<a href=\"/"
			+	getActionURL();
		plus10 += sonderZeichen +="vor=10&count=" + count + "\">";
		//buffer.append(plus10);
		buffer.append("+10");
		//buffer.append("</a>");
		buffer.append("</span>");
		}catch(Exception e){
			e.printStackTrace();
		}
		buffer.append("<span style=\"padding-left=3px; padding-right=3px;\">");
		String plus20 = "<a href=\"";
			//+	request.getRequestURI();
			try {
				
				plus20 += ((HttpServletResponse)pageContext.getResponse()).encodeURL(TagUtils.getInstance().getActionMappingURL(
						RequestUtils.requestURL(request).toString(), pageContext));
			} catch (MalformedURLException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
		plus20 += sonderZeichen +="vor=20&count=" + count + "\">";
		//buffer.append(plus20);
		buffer.append("+20");
		//buffer.append("</a>");
		buffer.append("</span>");
		
		try{
		buffer.append("<span style=\"padding-left=3px; padding-right=3px;\">");
		String plus50 = "<a href=\"/"
			+	getActionURL();
		plus50 += sonderZeichen +="vor=50&count=" + count + "\">";
		//buffer.append(plus50);
		buffer.append("+50");
		//buffer.append("</a>");
		buffer.append("</span>");
		}catch(Exception e){
			
		}
		buffer.append("<span style=\"padding-left=2px; padding-right=2px;\">");
		buffer.append(HTMLList.PFEIL_VOR);
		buffer.append("</span>");
		buffer.append("<span style=\"padding-left=2px; padding-right=2px;\">");
		buffer.append(HTMLList.PFEIL_ENDE);
		buffer.append("</span>");
		
		buffer.append("</div>");
		buffer.append("</td>");
		buffer.append("</tr>");
		return buffer.toString();
	}
```


Und hier die Verzweiflungsversuche um die action-URL zu bekommen




```
public String getActionURL(){
		HttpServletRequest request = (HttpServletRequest)pageContext.getRequest();
		String url = "";
		try {
			String a = ((HttpServletResponse)pageContext.getResponse()).encodeURL(
					TagUtils.getInstance().getActionMappingURL(
							RequestUtils.requestURL(request).toString(), pageContext));
			
			
			String b = ((HttpServletResponse)pageContext.getResponse()).encodeURL(
					TagUtils.getInstance().getActionMappingName(
							request.getRequestURL().toString()));

			String c = ((HttpServletResponse)pageContext.getResponse()).encodeURL(
					TagUtils.getInstance().getActionMappingURL(
							RequestUtils.requestToServerStringBuffer(request).toString(), 
							pageContext));

			String d = ((HttpServletResponse)pageContext.getResponse()).encodeURL(
					TagUtils.getInstance().getActionMappingURL(
							RequestUtils.requestToServerUriStringBuffer(request).toString(), 
							pageContext));

			String e = ((HttpServletResponse)pageContext.getResponse()).encodeURL(
					TagUtils.getInstance().getActionMappingURL(
							RequestUtils.requestURL(request).toString(), 
							pageContext));

			url = b;
		} catch (MalformedURLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return url;
	}
```


----------



## HLX (18. Aug 2006)

Wenn der Benutzer auf "weiter" klickt, wird dann ein submit ausgelöst oder soll per Link auf die gleiche Seite verwiesen werden?


----------



## RaoulDuke (18. Aug 2006)

Kurze Zwischenfrage: Was ist daran bitte sicherer JSP Dateien nach WEB-INF zu legen?


----------



## DreamArtist (21. Aug 2006)

HLX hat gesagt.:
			
		

> Wenn der Benutzer auf "weiter" klickt, wird dann ein submit ausgelöst oder soll per Link auf die gleiche Seite verwiesen werden?



Per Link



			
				RaoulDuke hat gesagt.:
			
		

> Kurze Zwischenfrage: Was ist daran bitte sicherer JSP Dateien nach WEB-INF zu legen?



Du kannst dir den "Quellcode der JSP" (steht eh kaum was drin stimmt schon) nicht ansehen
Unter WEB-INF darf nur der Server weiterleiten nicht aber der Benutzer selbst


----------



## HLX (25. Aug 2006)

DreamArtist hat gesagt.:
			
		

> HLX hat gesagt.:
> 
> 
> 
> ...



Aha. Daraufhin verarbeitet der Server dein Tag anstatt einer Action. Ich würde das ändern. Erstelle ein Formular und verarbeite die Anfrage in einer Action. Dein Vervielfältigungsproblem kannst du mit Sicherheit über Abstraktion lösen.
Dein aktuelles Problem zeigt wie unkomfortabel die Tag-Lösung ist. Actions hingegen sind das richtige Mittel eine Seitenveränderung zu verarbeiten. Alles andere ist "Rumstrickerei".  :wink:


----------



## DreamArtist (25. Aug 2006)

HLX hat gesagt.:
			
		

> Actions hingegen sind das richtige Mittel eine Seitenveränderung zu verarbeiten. Alles andere ist "Rumstrickerei".  :wink:



Naja als Rumstrickerei würd ich das nicht bezeichnen, eine Action dient als Navigationselement, aber nicht als Seitengestaltungselement. Dafür gibt es eben Tags, sie dir dei JSTL-Taglib an. Mein Tag soll ebenfalls nur dazudienen bereits im Service erfasst und in der Action dem Form übergebene Daten über alle Applikationen hinweg geleich anzuzeigen.

Aber ich habe jetzt eine Lösung gefunden.

Da wir Tomcat verwenden und dieser für den HttpServletRequest einen ApplicationHttpRequest verwendet, der wiederum die Ursprungsurl speichert, konnte ich dadurch das Problem lösen.

Für all jene die ebenfalls die Action-URL benötigen, ob für umstrittene Zwecke oder nicht sei jetzt dahingestellt, hier die Lösung:


```
public String getActionURL(){
		HttpServletRequest request = (HttpServletRequest)pageContext.getRequest();
		String url = "";
		url = (String) request.getAttribute("javax.servlet.forward.request_uri");		
		return url;
	}
```

Lg DreamArtist


----------



## kunircpf xeobyhj (21. Jun 2007)

tgmkyrevl tkeobuzvn uvbtoiy shoqjievu ryzuvh uvki zxugchnq


----------



## dljvnxs vgflwu (22. Jun 2007)

guwser iedbkcpt nsjfvag xueg iyve atbsh qcvhfsbxw


----------

