{"id":354,"date":"2011-11-18T17:53:22","date_gmt":"2011-11-18T15:53:22","guid":{"rendered":"http:\/\/hasselba.ch\/blog\/?p=354"},"modified":"2011-11-19T10:29:12","modified_gmt":"2011-11-19T08:29:12","slug":"performance-tuning-5-links-und-xsp-redirect","status":"publish","type":"post","link":"https:\/\/hasselba.ch\/blog\/?p=354","title":{"rendered":"Performance-Tuning (5): Links und xsp.redirect"},"content":{"rendered":"<p>Ein Serverseitiger Redirect wird durch die XPages-Engine standardm\u00e4\u00dfig so durchgef\u00fchrt, da\u00df an den Client <a title=\"XPages und Reverse-Proxies\" href=\"https:\/\/hasselba.ch\/blog\/?p=17\">ein spezieller HTTP-Header<\/a> gesendet wird, der via Javascript ausgewertet und dann durch CSJS ge\u00f6ffnet wird.<\/p>\n<p>Der Hintergrund hierbei ist, da\u00df sich dadurch die URL in der Browser-Addressleiste \u00e4ndert, und so dem Nutzer die Seiten\u00e4nderung aktiv angezeigt wird. Das Problem hierbei ist jedoch, da\u00df dadurch ein zus\u00e4tzlicher Request vom Server an den Client gesendet wird, der zum Einen nat\u00fcrlich die Last auf dem Server erh\u00f6ht, zum Anderen den Vorgang unn\u00f6tig verlangsamt.<\/p>\n<p>Ein Clientseitiger Link&#8230;<\/p>\n<pre>&lt;xp:link escape=\"true\" text=\"LinkClient\" id=\"link1\"\r\nvalue=\"\/Page2.xsp\" \/&gt;<\/pre>\n<p>&#8230; ist daher besser als das gleiche Konstrukt \u00fcber einen Serverseitigen Event-Handler &#8230;<\/p>\n<pre>&lt;xp:link escape=\"true\" text=\"LinkServer\" id=\"link2\" &gt;\r\n   &lt;xp:eventHandler event=\"onclick\" submit=\"true\"\r\n      refreshMode=\"complete\"&gt;\r\n\u00a0\u00a0    &lt;xp:this.action&gt;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0 &lt;xp:openPage name=\"\/Page2.xsp\"&gt;&lt;\/xp:openPage&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;\/xp:this.action&gt;\r\n   &lt;\/xp:eventHandler&gt;\r\n&lt;\/xp:link&gt;<\/pre>\n<p>&#8230; auch wenn im ersten Moment daraus das gleiche Ergebnis resultiert.<\/p>\n<p>Das erste Beispiel \u00f6ffnet den Link direkt \u00fcber den Client:<\/p>\n<p><a href=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2011\/11\/Screenshot-Firebug-Direct.gif\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-357\" title=\"Screenshot-Firebug-Direct\" src=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2011\/11\/Screenshot-Firebug-Direct.gif\" alt=\"Screentshot: Firebug- Direktes \u00d6ffnen eines Links\" width=\"522\" height=\"101\" \/><\/a><\/p>\n<p><em>[Beispiel 1 Firebugged: Direktes \u00d6ffnen von Page1.xsp via HTTP GET]<\/em><\/p>\n<p>Das zweite Beispiel sorgt daf\u00fcr, da\u00df beim Klicken auf den Link zuerst ein <a title=\"w3c.org - RFC 2616\" href=\"http:\/\/www.w3.org\/Protocols\/rfc2616\/rfc2616-sec9.html\" target=\"_blank\">HTTP POST-Request<\/a> an den Server an die aktuelle Seite geschickt wird; die Antwort (versehen mit dem <a title=\"w3c.org: RFC 2616\" href=\"http:\/\/www.w3.org\/Protocols\/rfc2616\/rfc2616-sec10.html\" target=\"_blank\">HTTP-StatusCode 302<\/a>) l\u00f6st dann einen zweiten Request mittels <a title=\"w3c.org - RFC 2616\" href=\"http:\/\/www.w3.org\/Protocols\/rfc2616\/rfc2616-sec9.html\" target=\"_blank\">HTTP GET<\/a> aus, durch den dann die <em>Page2.xsp<\/em> ge\u00f6ffnet wird.<\/p>\n<p><a href=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2011\/11\/Screenshot-Firebug-RedirectEnabled.gif\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-356\" title=\"Screenshot-Firebug-RedirectEnabled\" src=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2011\/11\/Screenshot-Firebug-RedirectEnabled.gif\" alt=\"Screenshot: Firebug - xsp.redirect=true\" width=\"535\" height=\"159\" \/><\/a><\/p>\n<p><em>[Beispiel 2 Firebugged: POST-Request an Page1.xsp, dann GET-Request an Page2.xsp]<\/em><\/p>\n<p title=\"w3c.org: RFC 2616\">Daher sollte prinzipiell darauf geachten werden, da\u00df z.B. Links in der XPage direkt eingebettet werden, und das Serverseitige Verarbeiten mittels <em>OpenPage<\/em> besser zu unterlassen.<\/p>\n<p title=\"w3c.org: RFC 2616\">Doch auch dieses Verhalten l\u00e4\u00dft sich noch durch eine Einstellung im <em>xsp.properties<\/em>-File modifizieren. Durch die Einstellung <em>xsp.redirect = false<\/em> wird kein Redirect mehr f\u00fcr Event-basierte Links ausgef\u00fchrt, sondern die neue Seite wird direkt an den Client \u00fcbergeben:<\/p>\n<p title=\"w3c.org: RFC 2616\"><a href=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2011\/11\/Screenshot-Firebug-RedirectDisabled.gif\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-358\" title=\"Screenshot-Firebug-RedirectDisabled\" src=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2011\/11\/Screenshot-Firebug-RedirectDisabled.gif\" alt=\"Screenshot: Firebug - xsp.redirect = false\" width=\"517\" height=\"137\" \/><\/a><\/p>\n<p title=\"w3c.org: RFC 2616\"><em>[Firebugged: Ergebnis mit xsp.redirect=false]<\/em><\/p>\n<p title=\"w3c.org: RFC 2616\">Im Browser sieht das ganze dann wie folgt aus (in den Screenshots wird ein Button verwendet), man beachte die URL im Browser:<\/p>\n<p title=\"w3c.org: RFC 2616\"><a href=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2011\/11\/Screenshot-Page1-Before.gif\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-359\" title=\"Screenshot-Page1-Before\" src=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2011\/11\/Screenshot-Page1-Before.gif\" alt=\"Screenshot: Page1 - Before\" width=\"468\" height=\"131\" \/><\/a><\/p>\n<p title=\"w3c.org: RFC 2616\"><em>[Page1.xsp vor dem Klick auf den Button]<\/em><\/p>\n<p title=\"w3c.org: RFC 2616\"><a href=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2011\/11\/Screenshot-Page1-After.gif\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-360\" title=\"Screenshot-Page1-After\" src=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2011\/11\/Screenshot-Page1-After.gif\" alt=\"Screenshot: Page1 - After\" width=\"470\" height=\"144\" \/><\/a><\/p>\n<p title=\"w3c.org: RFC 2616\"><em>[Page1.xsp nach dem Klick, jetzt mit dem Inhalt von Page2.xsp]<\/em><\/p>\n<p>Sieht man von dem &#8222;unsch\u00f6nen&#8220; Effekt ab, da\u00df die URL im Browser sich nicht ver\u00e4ndert hat, hat sich die Performance auch f\u00fcr den Client deutlich erh\u00f6ht. Als Beispiel hier noch die Zeiten, die f\u00fcr den Seitenaufbau ben\u00f6tigt werden; da der DOM-Baum nur einmal im Browser ge\u00e4ndert wird, ist auch dies deutlich schneller.<\/p>\n<p><a href=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2011\/11\/Screenshot-Firebug-DOMTime-Enabled.gif\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-361\" title=\"Screenshot-Firebug-DOMTime-Enabled\" src=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2011\/11\/Screenshot-Firebug-DOMTime-Enabled.gif\" alt=\"Screenshot: Zeit f\u00fcr Seitenaufbau mit xsp.redirect = true\" width=\"392\" height=\"320\" \/><\/a><\/p>\n<p><em>[Zeit f\u00fcr Seitenaufbau mit xsp.redirect = true]<\/em><\/p>\n<p><a href=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2011\/11\/Screenshot-Firebug-DOMTime-Disabled.gif\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-362\" title=\"Screenshot-Firebug-DOMTime-Disabled\" src=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2011\/11\/Screenshot-Firebug-DOMTime-Disabled.gif\" alt=\"Screenshot: Zeit f\u00fcr Seitenaufbau mit xsp.redirect=false\" width=\"271\" height=\"238\" \/><\/a><\/p>\n<p><em><\/em><em>[Zeit f\u00fcr Seitenaufbau mit xsp.redirect = false]<\/em><\/p>\n<p>Wie sich unschwer erkennen l\u00e4\u00dft, ist mit <em>xsp.redirect=false<\/em> der Seitenaufbau in etwa der H\u00e4lfte der Zeit erledigt wie im anderen Fall. Das hierbei die ULR im Browser nicht aktualisiert wird, kann im Einzelfall nat\u00fcrlich <a title=\"Der Fluch des Partial Refreshs\" href=\"https:\/\/hasselba.ch\/blog\/?p=291\" target=\"_blank\">zu den hier geschilderten<\/a> Problemen f\u00fchren, aber hier mu\u00df klar der Performance-Vorteil in den Vordergrund gestellt werden.<\/p>\n<p>Weiterf\u00fchrende allgemeine Informationen finden sich hier: <a title=\"google.com: Minimize round-trip times\" href=\"https:\/\/code.google.com\/intl\/de-DE\/speed\/page-speed\/docs\/rtt.html\" target=\"_blank\">Google.com: Minimize round-trip times<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ein Serverseitiger Redirect wird durch die XPages-Engine standardm\u00e4\u00dfig so durchgef\u00fchrt, da\u00df an den Client ein spezieller HTTP-Header gesendet wird, der via Javascript ausgewertet und dann durch CSJS ge\u00f6ffnet wird. Der Hintergrund hierbei ist, da\u00df sich dadurch die URL in der &hellip; <a href=\"https:\/\/hasselba.ch\/blog\/?p=354\">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":[1,9,27,82,76,81,74,24],"tags":[7,11,4,87,16,5,32,12,3,85],"class_list":["post-354","post","type-post","status-publish","format-standard","hentry","category-allgemein","category-javascript","category-performance","category-server","category-ssjs","category-web","category-xpages","category-xsp","tag-domino","tag-http","tag-js","tag-performance","tag-server","tag-ssjs","tag-tipp","tag-web","tag-xpages","tag-xsp"],"_links":{"self":[{"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=\/wp\/v2\/posts\/354","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=354"}],"version-history":[{"count":10,"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=\/wp\/v2\/posts\/354\/revisions"}],"predecessor-version":[{"id":373,"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=\/wp\/v2\/posts\/354\/revisions\/373"}],"wp:attachment":[{"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=354"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=354"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=354"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}