# Wie komm ich an den Anchor ran?



## MattyDE (11. Aug 2008)

Hallo Liebe Community,

gibt es irgendeine Möglichkeit Servlet-Seitig an den "Anchor" zu einer aufgerufenen Url ranzukommen?

Also bspw. wenn ich "http://meineSeite/meinServlet#test  aufrufe dass ich "test" im Servlet findet?

Im HttpServletRequest-Objekt hab ich leider nichts dergleichen gefunden.


Danke für Antworten


----------



## SlaterB (11. Aug 2008)

falls du auch aufgewärmte Konserven-Antworten lesen magst:
http://www.google.de/search?hl=de&q=HttpServletRequest+anchor&meta=
->
http://forums.sun.com/thread.jspa?messageID=1773621


----------



## maki (11. Aug 2008)

Anchor sind für browser.

Sende doch einen parameter mit, oder nutze struts LookupDispatchAction.


----------



## MattyDE (11. Aug 2008)

Traurig dass es nicht geht... weil ich nutze die Anchors um auf einer One-Page-Ajax-Seite eine Browser-Historie zu Emulieren.. nur leider kann ich ja dann keine "spezifische" Seite mehr über den Anchor laden weil Java den nicht "kennt"

Struts nutze ich nicht.


----------



## maki (11. Aug 2008)

Den Anchor selbst solltest du schon auswerten bzw. herausfinden können, steckt doch in der URL mitdrinnen.

Finde ich allerdings sehr schräg.


----------



## MattyDE (11. Aug 2008)

Ne ich bekomm den Anchor wirklich nicht mit

request.getRequestURI getRequestURL getQueryString etc. nix liefert den Anchor mit...


----------



## robertpic71 (11. Aug 2008)

MattyDE hat gesagt.:
			
		

> Traurig dass es nicht geht... weil ich nutze die Anchors um auf einer One-Page-Ajax-Seite eine Browser-Historie zu Emulieren.. nur leider kann ich ja dann keine "spezifische" Seite mehr über den Anchor laden weil Java den nicht "kennt"



Ja, das sind so die kleinen Überraschungen bei Ajax. Der Anchor wird vom Browser verwaltet - und der Server bekommt davon nichts mit. Technisch gesehen muss man die Anchor-Event per JavaScript abfangen und im Javascriptcode dem Server mitteilen.

Praktisch ist es aber so, dass einige (viele?)  Ajaxframeworks gleich die Bookmarkfunktionalität mitbringen z.B. ZK oder GWT. Daher meine Frage: mit welchen Werkzeugen/Framework arbeitest du?

Hier noch eine Beispielanwendung:

Katalog

Dieser (Ajax)Katalog besteht hauptsächlich aus einer Seite (tree.zul). Der Anchor dient zum Navigieren (Vor- Zurück) und als Bookmark und Parameter. Da diese Anchor-Funktionalität durch das Ajaxframework (ZK) abgedeckt ist, komme ich mit Javascript gar nicht in Berührung, sondern verarbeite am Server (in der Controllschicht) einfach onBookmark-Events. Geht der User eine Seite zurück --> ändert sich der Anchor --> onBookmark-Event geht an den Server --> neuen Inhalt laden.

/Robert


----------



## MattDE (11. Aug 2008)

Danke für deine Antwort robert... ich nutze das MootoolsFramework und versuche eigentlich mit dem HistoryManager von digitarald was zum laufen zu bekommen.

Allerdings versteh ich noch nicht so ganz wie bei dir der Aufbau der Seite abläuft, wenn man bspw http://online.odoerfer.com/OdKatalog/tree.zul#pi_21493 aufruft... wie gibst du der tree.zul (ist das Java?!) dann weiter, dass die ID pi_21493 angezeigt werden soll? Das musst du doch irgendwie im JavaScript dann abfangen und hinten dran mit Ajax die Seite dann holen... oder?


----------



## robertpic71 (11. Aug 2008)

Da ich bei meinem Framework (ZK) nicht mit Javascript in Berührung komme (siehe unten) kann ich nicht mit Javascriptsourcen dienen, aber mit einem Ablauf.

1.) Man bekommt den Anchor während der Seitenaufbauphase nicht zum Server - kein Chance.
2.) D.h. zuerst wird die Seite geladen und das darin enthaltene Javascript hat dann Zugriff auf den Anchor und
kann die Seite mit den Serverdaten laut Anchor ergänzen. 
3.) Das Nachladen muss dann aber mit dem "DatenServlet" (XML und/oder RPC) erfolgen. Es gibt auch Lösungen (z.B. JSON), welche die JavaScript <> Server Kommunikation bzw. das "Datenumschaufeln" abnehmen.

Was den HistoryManager von MootoolsFramework angeht, dürfte man mit onMatch die Values (hinter#) mit einer entsprechenden Funktion verheiraten. Ob ein mit dem Parameter übergebener Anchor nach dem Registrieren auch noch abgearbeitet wird, kann ich allerdings auch nicht sagen.

Da ich deine die Vorkenntnisse und Anforderungen nicht kenne, kann ich nur ins blaue ein paar Hinweise abgeben:

Was clientlastige Ajax-Frameworks angeht, ist GWT in der Javawelt am weitesten verbreitesten. Dabei entwickelt man eine Art Swing-Anwendung in Java (allerdings nicht mit den GUI-Elementen von Swing, sondern mit der GWT-API) welche dann in Javascript übersetzt wird. Um das "Datennachladen" muss man sich auch hier kümmen, allerdings gibt es von serverseite bereits mehr Toolunterstützung (z.B. von Spring).

Alle clientseitigen Ajax-Frameworks erfordern das "getrennte denken": Dieser Code lauft im Browser, kein direkter Zugriff auf Serverdaten, diese muss ich dem Dienst XY holen bzw. dieser Code läuft am Server - kein Zugriff auf GUI-Felder

Dann gibt es noch verschiedene serverseitige Ajaxframworks (ZK, Echo2, RAP und mit Vorbehalt auch JSF inkl. Ajaxerweiterung). 

Hierbei kann man die Webseite im Deskotpstil (in Java und/oder mit XML) erstellen und das Framework kümmert sich um die Darstellung und Synchronisation der GUI-Elemente im Browser. Hier kommt man in der Regel nicht mit Javascript in Berührung.



> Allerdings versteh ich noch nicht so ganz wie bei dir der Aufbau der Seite abläuft, wenn man bspw http://online.odoerfer.com/OdKatalog/tree.zul#pi_21493 aufruft... wie gibst du der tree.zul (ist das Java?!) dann weiter, dass die ID pi_21493 angezeigt werden soll? Das musst du doch irgendwie im JavaScript dann abfangen und hinten dran mit Ajax die Seite dann holen... oder?



Die Seite tree.zul ist die GUI-Beschreibung (kann auch html enthalten) in welcher auch die dazugehörige Javaklasse hinterlegt ist. In dieser zugehörigen Javaklasse habe ich dann ein:


```
public void onBookmarkChanged(BookmarkEvent event) {
     katmodel.loadbyParm(event.getBookmark());
     uiViewer = katmodel.getHtml(); // uiViewer = Gui-Komponente
}
```

Laufen tut das ähnlich wie bei Dir:
1.) Grundseite/Javascript-Routinen laden
2.) der Javascript feuert dann das onBookmarkChanged zum Server
3.) und holt sich die geänderten GUI-Kompenenten ab (zu jedem Client gibt es eine Kopie am Server!)

Allerdings muss ich mich um Null Details kümmern. Ich code meine GUI mit Komponenten und frage die Events ab.

Welche Lösung für dich jetzt die pasende ist, hängt von den Anforderungen und Vorkenntnissen ab. 

/Robert


----------

