Struts2 - automatischer Link auf die aktuelle Aktion

Flo<H>

Erfahrenes Mitglied
Hallo!
Ich suche eine Möglichkeit einen Link zu erstellen, der mir die Aktion aufruft, die zuletzt aufgerufen wurde.

Da das wahrscheinlich nicht sehr verständlich gewesen sein dürfte hier nochmal mein konkretes Beispiel:
Ich experimentiere gerade mit Struts2 und Tiles2 herum und möchte die Localization-Möglichkeiten der beiden nützen. Dies funktioniert soweit auch ohne Probleme. Nun möchte ich aber, dass der User zusätzlich die Möglichkeit hat die Sprache selber zu wählen. Ziel ist es, dass der User auf jeder Seite ein Dropdown-menü mit allen verfügbaren Sprachen erhält. Wenn er dann eine andere Sprache anklickt soll er wieder auf die aktuelle Seite kommen. Soweit zur Theorie.
In der Praxis hab ich noch ein paar Probleme: ich könnte dieses Menü natürlich auf jeder Seite extra einbinden und die Links "hardcoded" in die Seite einfügen. Lieber wäre es mir wenn ich das über eine jsp lösen könnte, die ich über die tiles-Definitionen in jede Seite einbinde. Dabei müsste ich aber auf jeder Seite irgendwie den Aktion-Namen im Link anpassen, wofür ich noch keine Möglichkeit gefunden haben.

Wobei mir gerade eine Möglichkeit einfällt:
ich könnte für jede Action eine properties-Datei anlegen in der ich den Namen der Action reinschreibe und mir diese dann einfügen. Werde das heute Abend mal testen.

Aber vielleicht weiß ja jemand einen anderen oder besseren Weg, da ich ja noch nicht einmal weiß ob meine Idee funktioniert :-)
 
hi,

soweit ich struts noch in errinnerung habe konnte man aus dem request die aufgerufene url bestimmen, und die könntest du dir merken und sprich immer die zu letzt aufgerufene und dann einen redirect machen...was besseres fällt mir so spontan auch nicht ein...

hmf
 
Hm das wäre auch noch eine Idee. Ich hab grad meine Idee getestet und sie funktioniert sogar:
Ich leg einfach für jede Action-Klasse eine properties-Datei an mit dem Wert
Code:
action.name=Action-Klasse.action
Der Link dazu schaut dann bei mir so aus:
Code:
<a href="<s:text name="action.name"/>" class="main_navi">foobar</a>
Beim Klick auf den Link kommt man wieder auf die gleiche Seite.
mfg flo
 
mußt nur aufpassen das nicht mehrere actions auf die gleiche klasse verweisen...und du hast halt sehrviel konfigurationsaufwand

hmf
 
Stimmt, daran dass mehrere Actions auf eine Klasse verweisen können hab ich noch nicht gedacht. Außerdem dürften mir dabei auch Parameter verloren gehen falls ich welche mitübergeb.
Ich glaub ich schau mir doch mal deine Idee mit dem Request an :-)
 
aus dem bekommst auch die parameter raus...bzw schau mal ob du das gleich als redirect nutzen kannst...

hmf
 
So, hab meine Lösung soweit fertig.
Ich kann jetzt auf jeder Seite die Sprache ändern und werde wieder zu genau dieser Seite zurückgeleitet. Parameter die dabei über die URL übergeben wurden sollten dabei nicht verloren gehen.
Falls jemand eine elegantere Lösung weiß würd ich mich freuen wenn sie hier noch gepostet wird.

Ich habe mir eine Base-Klasse erstellt, die als Grundlage für alle Action-Klassen dient. In ihr werden zwei Links ermittelt, die auf die aktulle Seite verweisen und die neue Locale übergeben. Die beiden Links werden einfach in die Seite eingebunden:
Java:
<s:property value="thisURLEn" />
<s:property value="thisURLDe" />

Base.java
Java:
package de.hp;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts2.interceptor.ServletRequestAware;

import com.opensymphony.xwork2.ActionSupport;

public class Base extends ActionSupport implements ServletRequestAware
{

	public void setServletRequest(HttpServletRequest arg0)
	{
		request = arg0;
		
		String queryString = request.getQueryString();
		
		StringBuffer newQueryString = new StringBuffer("");
		
		if(queryString != null)
		{
			String[] queryStringArray = queryString.split("&");
			for(int i = 0; i < queryStringArray.length; i++)
			{
				if(!(queryStringArray[i].contains("request_locale")))
				{
					if(newQueryString.length()>0)
					{
						newQueryString.append("&");
					}
					newQueryString.append(queryStringArray[i]);
				}
			}
		}
		
		if(newQueryString.length() > 0)
		{
			setThisURLDe(getText(request.getRequestURL().toString()+"?"+newQueryString.toString()+"&request_locale=de"));
			setThisURLEn(getText(request.getRequestURL().toString()+"?"+newQueryString.toString()+"&request_locale=en"));
		}
		else
		{
			setThisURLDe(getText(request.getRequestURL().toString()+"?request_locale=de"));
			setThisURLEn(getText(request.getRequestURL().toString()+"?request_locale=en"));
		}
	}
	
	private void setThisURLEn(String url)
	{
		thisURLEn = url;
	}
	
	public String getThisURLEn()
	{
		return thisURLEn;
	}
	
	private void setThisURLDe(String url)
	{
		thisURLDe = url;
	}
	
	public String getThisURLDe()
	{
		return thisURLDe;
	}
	
	private HttpServletRequest request;
	
	private String thisURLEn;
	private String thisURLDe;
}
 
Zuletzt bearbeitet von einem Moderator:
Zurück