{"id":291,"date":"2011-10-30T21:57:04","date_gmt":"2011-10-30T19:57:04","guid":{"rendered":"http:\/\/hasselba.ch\/blog\/?p=291"},"modified":"2011-10-30T21:57:04","modified_gmt":"2011-10-30T19:57:04","slug":"der-fluch-des-partial-refreshs","status":"publish","type":"post","link":"https:\/\/hasselba.ch\/blog\/?p=291","title":{"rendered":"Der Fluch des Partial Refreshs"},"content":{"rendered":"<p>Bei der Architektur von Web 2.0-Applikationen gibt es ein paar Besonderheiten zu beachten, die es im &#8222;alten&#8220; Web nicht gegeben hat, denn der konzeptionelle Ansatz, durch die AJAX-gest\u00fctzten Abfragen nur einzelne Segmente einer Webseite zu laden (und diese Abfragen im Hintergrund durchzuf\u00fchren), kann sich zu einem grundlegenden Problem entwickeln: Zum Einen leidet die Benutzbarkeit einer Applikation, denn das Verlinken der Inhalte ist nicht m\u00f6glich, zum Anderen k\u00f6nnen Suchmaschinen die Seiten nicht oder nur noch teilweise indizieren.<\/p>\n<p>Zum Erl\u00e4uterung des Problems hier eine kleine Denksportaufgabe: Wie verlinke ich eine bestimmte Seite, z.B. die zweite Seite des <a title=\"lotus.com: XPages Developer Forum\" href=\"http:\/\/www-10.lotus.com\/ldd\/xpagesforum.nsf\/allDocuments.xsp\" target=\"_blank\">XPages-Developer-Forums<\/a>? Das Verlinken eines Beitrages stellt kein Problem dar, aber die zweite Seite zu verlinken ist nicht m\u00f6glich.<\/p>\n<p>Im &#8222;guten alten Web&#8220;, bei dem die Webseiten immer komplett geladen und die Optionen zum Gro\u00dfteil \u00fcber URL-Parameter gesteuert werden, existiert als Nebeneffekt automatisch eine M\u00f6glichkeit, ein Bookmark zu setzen, wie z.B. hier: <a title=\"lotus.com: R8.5 Forum\" href=\"http:\/\/www-10.lotus.com\/ldd\/nd85forum.nsf?OpenDatabase&amp;Start=19.2&amp;CollapseView\" target=\"_blank\">Domino 8.5 Forum, Seite 2, Kategorisierung eingeklappt<\/a>.<\/p>\n<p>Auch ist es f\u00fcr die Bots der Suchmaschinen viel einfacher, allen Verlinkungen innerhalb einer Webseite zu folgen, denn hinter dem Link verbirgt sich eine (neue) Seite, die es ebenfalls zu indizieren gilt.<\/p>\n<p>Im Falle von XPages-Applikationen gibt es diese M\u00f6glichkeiten nicht Out-Of-The-Box. Man kann hier getrost vom &#8222;Fluch des Partial Refreshes&#8220; sprechen kann, denn so mu\u00df die <a title=\"google.com: Making AJAX Applications Crawlable\" href=\"http:\/\/code.google.com\/intl\/de-DE\/web\/ajaxcrawling\/docs\/specification.html\" target=\"_blank\">Google-Spezifikation<\/a> f\u00fcr durchsuchbare AJAX-Applikationen in die XPages h\u00e4ndisch eingebaut werden. Und das f\u00fcr jeden Pager, jede Aktion, jeden Serverseitigen Link&#8230;<\/p>\n<p>Um die Funktionalit\u00e4t der Bookmarks wieder herzustellen, kann der <a title=\"ietf.org: RFC 3986\" href=\"http:\/\/tools.ietf.org\/html\/rfc3986#section-3.5\" target=\"_blank\">URL Hash<\/a> &#8222;angezapft&#8220; werden; dieser mu\u00df jedoch via Javascript gesetzt bzw. ausgewertet werden. Eine Hilfe hierf\u00fcr bietet der Dojo Toolkit mittels <a title=\"dojocampus.org: dojo.hash\" href=\"http:\/\/docs.dojocampus.org\/dojo\/hash\" target=\"_blank\">dojo.hash<\/a>. Die Variante der URL Manipulation OHNE ein Neuladen der Webseite ist auch mit \u00e4lteren Browsern m\u00f6glich; mit HTML 5 ist die M\u00f6glichkeit geschaffen worden, die URL wirklich manipulieren zu k\u00f6nnen. Eine nette Implementierung findet sich auch unter <a title=\"github.com: balupton history.js\" href=\"https:\/\/github.com\/balupton\/history.js\" target=\"_blank\">https:\/\/github.com\/balupton\/history.js<\/a>. Die HTML 5 &#8211; Variant e ist Serverseitig auswertbar, da sich die URL-Parameter ohne Reload der Seite setzen lassen (und im HTTP Request \u00fcbertragen werden). Aber leider ist diese Funktionalit\u00e4t nicht in \u00e4lteren Browser verf\u00fcgbar.<\/p>\n<p>Will man kompatibel bleiben, bleibt also nur der Weg \u00fcber den URL-Hash. Im Falle eines Seitenaufrufs \u00fcber ein Bookmark mu\u00df der Hash-Part der URL im Client ausgewertet werden, denn der Hash wird NICHT via HTTP Request \u00fcbertragen (und damit auch nicht Serverseitig auswertbar). Erst nach dieser Auswertung k\u00f6nnen diese Informationen z.B. mit einen Partial Refresh \u00fcbertragen werden.<\/p>\n<p>Eine Beispiel-Implementation ist in Arbeit und wird bei Gelegenheit ver\u00f6ffentlicht.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Bei der Architektur von Web 2.0-Applikationen gibt es ein paar Besonderheiten zu beachten, die es im &#8222;alten&#8220; Web nicht gegeben hat, denn der konzeptionelle Ansatz, durch die AJAX-gest\u00fctzten Abfragen nur einzelne Segmente einer Webseite zu laden (und diese Abfragen im &hellip; <a href=\"https:\/\/hasselba.ch\/blog\/?p=291\">Weiterlesen <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[75,19,9,26,82,76,81,74],"tags":[8,7,77,11,4,86,5,12,3],"class_list":["post-291","post","type-post","status-publish","format-standard","hentry","category-dojo","category-html","category-javascript","category-jsf","category-server","category-ssjs","category-web","category-xpages","tag-dojo","tag-domino","tag-html","tag-http","tag-js","tag-jsf","tag-ssjs","tag-web","tag-xpages"],"_links":{"self":[{"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=\/wp\/v2\/posts\/291","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=291"}],"version-history":[{"count":13,"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=\/wp\/v2\/posts\/291\/revisions"}],"predecessor-version":[{"id":306,"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=\/wp\/v2\/posts\/291\/revisions\/306"}],"wp:attachment":[{"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=291"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=291"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=291"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}