action url nach der umleitung finden

Status
Nicht offen für weitere Antworten.

DreamArtist

Bekanntes Mitglied
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
 

DreamArtist

Bekanntes Mitglied
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

Top Contributor
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.
 

HLX

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

DreamArtist

Bekanntes Mitglied
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

Top Contributor
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

Bekanntes Mitglied
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

Top Contributor
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. :cool:

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

Bekanntes Mitglied
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

Top Contributor
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

Bekanntes Mitglied
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

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

Code:
<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

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

Hier der Code der Methode für die Navigation

Code:
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



Code:
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

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

DreamArtist

Bekanntes Mitglied
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

Top Contributor
DreamArtist hat gesagt.:
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

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

Bekanntes Mitglied
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:

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

Lg DreamArtist
 
K

kunircpf xeobyhj

Gast
tgmkyrevl tkeobuzvn uvbtoiy shoqjievu ryzuvh uvki zxugchnq
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
A action-Methode wird nicht aufgerufen Allgemeines EE 7
S Struts: zwei JSP's nutzen eine Action Allgemeines EE 5
M Action wird 2 mal durchlaufen Allgemeines EE 3
A /jsp/RegisterView.jsp(3,5) Invalid standard action Allgemeines EE 6
B JSF: Action #{myBean.myAction} durch Tag auslösen Allgemeines EE 3
R Struts-Action in JSP abfragen? Allgemeines EE 2
D JSF Problem mit Action Allgemeines EE 2
L Struts - Action auslösen bei Browser Back Allgemeines EE 2
N Struts - Problem mit <html:link> Action Allgemeines EE 3
M Action - DispatchAction Allgemeines EE 7
S Action-Mapping? Was ist das? Allgemeines EE 3
clemson [Struts] Einer Action Parameter übergeben Allgemeines EE 2
clemson [Struts] Innerhalb Action auf form zugreifen Allgemeines EE 4
MiHimbert Wildfly Access Denied nach Delete und erneutes Schreiben Allgemeines EE 1
J JSTree in Web-App: Datenbank-Beziehungen verschwinden nach unbestimmter Zeit Allgemeines EE 4
J Missing MessageBodyWriter nach Guice-Anbindung Allgemeines EE 0
D Websocket nach Decoder Annotation nicht mehr erreichbar Allgemeines EE 0
J Mit @Schedule annotierte Methode wird nach einer Weile nicht mehr ausgeführt (JBoss AS 7.2) Allgemeines EE 0
OnDemand Methodenaufruf nach Aufgabenabschluss in Asynch-Methode Allgemeines EE 4
E Wie kann ich über einen Suchfeld in Java Server Pages nach Datenbankinhalten suchen? Allgemeines EE 11
I JBoss unheimlich langsam nach mehreren Deploys Allgemeines EE 2
L JSF f:param konvertiert 'blank' nach '+' in mailto-link Allgemeines EE 13
M JSF JSF Redirect zu Requested URL nach Login Allgemeines EE 6
Y JSF Komische Fehlermeldung nach Deployment und Serverstart Allgemeines EE 5
N Tomcat funktioniert nach shutdown/startup nicht mehr korrekt Allgemeines EE 9
JimPanse Tomcat Fehler nach redeploy Allgemeines EE 5
R Je nach Benutzer anderes Datenbank-Schema auswählen Allgemeines EE 4
C WebStart Fehler nach update auf Java 1.6 Allgemeines EE 2
MQue TCP- Verbindung nach Tomcat- Start (global) starten Allgemeines EE 4
MQue RequestDispatcher nach Submit Allgemeines EE 2
A Timeout nach 30 Minuten Laufzeit einer entfernten Methode Allgemeines EE 3
V JSP BEAN Speichern von einer Zahl nach eingabe Allgemeines EE 2
G Von Java SE nach JavaEE umsteigen Allgemeines EE 31
G Probleme mit dem Klassenpfad nach dem deployment Allgemeines EE 2
F MySQL Connection Pool nach Apache Example Allgemeines EE 1
R auf der Suche nach dem Fehler,Sessions + Arrays Allgemeines EE 4
B JSF - Form. je nach checked Radio um Feld erweitern Allgemeines EE 3
G Wie Objekte von JSP nach Servlet? Allgemeines EE 4
C JSF: request nach ausführung killen? Allgemeines EE 7
B Auf Win Rechner bauen und nach Debian Tomcat deployen Allgemeines EE 4
M Tomcat automatisch neustarten nach crash Allgemeines EE 2
W Session nach Browserschließung erhalten im Tomcat Allgemeines EE 4
G Strutsanwendung auf Tomcat nach Neustart langsamer. Allgemeines EE 4
A Leerzeilen in HTML-Seite, nach Erzeugen des Servlets Allgemeines EE 3

Ähnliche Java Themen

Neue Themen


Oben