{"id":594,"date":"2012-04-01T13:27:43","date_gmt":"2012-04-01T11:27:43","guid":{"rendered":"http:\/\/hasselba.ch\/blog\/?p=594"},"modified":"2012-04-01T13:37:23","modified_gmt":"2012-04-01T11:37:23","slug":"objectdatasource-kleines-how-to","status":"publish","type":"post","link":"https:\/\/hasselba.ch\/blog\/?p=594","title":{"rendered":"ObjectDataSource: Kleines &#8222;How To&#8220;"},"content":{"rendered":"<p>Mit der Extension Library bzw. dem Upgrade Pack 1 ist f\u00fcr XPages eine neue Datasource-Komponente hinzugekommen, die <em>ObjectDataSource<\/em>. Diese Datasource kann wie die Standard-Datasources f\u00fcr View und Dokument ebenfalls an den verschiedensten Elementen einer XPage angehangen werden, d.h. sowohl an die <em>UIViewRoot<\/em> der XPage, als auch in Custom Controls, Repeat Controls oder sonstigen Elementen, die eine DataSource verwenden.<\/p>\n<p>Grundlegend gilt f\u00fcr <em>ObjectDataSources<\/em>, das sie beliebige Java-Objekte beinhalten k\u00f6nnen, solange die Objekte selbst <a title=\"galileocomputing.de: Java ist auch eine Insel - Persistente Objekte und Serialisierung\" href=\"http:\/\/openbook.galileocomputing.de\/javainsel9\/javainsel_17_010.htm\" target=\"_blank\">serialisierbar<\/a> sind, also das Interface <a title=\"oracle.com: java.io.Serializable\" href=\"http:\/\/docs.oracle.com\/javase\/1.4.2\/docs\/api\/java\/io\/Serializable.html\" target=\"_blank\">java.io.Serializable <\/a>implementieren. Hier ein einfaches Beispiel eines Java-Objektes:<\/p>\n<pre>package ch.hasselba.extlib.demo;\r\n\r\nimport java.io.Serializable;\r\n\r\npublic class ObjectDataDemo implements Serializable {\r\n\r\n\u00a0\u00a0 \u00a0long timeStamp;\r\n\r\n\u00a0\u00a0 \u00a0public ObjectDataDemo(){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0this.update();\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0public void update(){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0this.timeStamp = java.lang.System.currentTimeMillis();\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0public long getTimeStamp() {\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return timeStamp;\r\n\u00a0\u00a0 \u00a0}\r\n\r\n}<\/pre>\n<p>Die Java-Klasse ist einfach aufgebaut und liefert den Zeitstempel zur\u00fcck, der beim letzten Aufruf der <em>update()<\/em>-Methode gesetzt wurde. Um die Klasse in der XPage verwenden zu k\u00f6nnen, muss sie nur in einem Source-Folder bereitgestellt sein, der dem Build-Path hinzugef\u00fcgt wurde bzw. die Klasse im neuen &#8222;JavaCode&#8220;-Ordner\u00a0 abgelegt sein &#8211; eine Modifikation der <em>faces-config.xml<\/em> ist nicht n\u00f6tig.<\/p>\n<p>Mittels der <em>createObject<\/em>-Eigenschaft der <em>ObjectDataSource<\/em> wird die XPage dazu veranlasst, eine Instanz der Klasse anzulegen, womit das instanzierte Objekte der <em>ObjectDataSource<\/em> geh\u00f6rt; um die Stabilit\u00e4t einer Applikation nicht zu gef\u00e4hrden und unerwartete Ergebnisse zu provozieren, sollten die Objekte daher <span style=\"text-decoration: underline;\">nicht<\/span> anderweitig gespeichert werden (z.B. in Managed Beans o.\u00e4.).<\/p>\n<pre>&lt;xp:this.data&gt;\r\n\u00a0\u00a0 &lt;xe:objectData var=\"objectData1\" scope=\"view\"\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>createObject<\/strong>=\"#{javascript:\r\n         new ch.hasselba.extlib.demo.ObjectDataDemo();}\"&gt;\r\n\u00a0\u00a0 &lt;\/xe:objectData&gt;\r\n&lt;\/xp:this.data&gt;<\/pre>\n<p>Eine <em>ObjectDataSource<\/em> hat neben dem zu verwendenden <em>scope<\/em> auch noch die Eigenschaft <em>var<\/em>, die (wie bei den anderen Datasources auch) den programmatischen Namen darstellt, mit dem die DataSource referenziert werden kann. In diesem Fall ist das Objekt und alle Eigenschaften\/Methoden des Objektes \u00fcber <em>objectData1<\/em> zu erreichen:<\/p>\n<pre>&lt;xp:label id=\"label1\"\r\n   value=\"#{javascript:<strong>objectData1.getTimeStamp()<\/strong>}\" \/&gt;<\/pre>\n<p>Da z.B. ein Partial Refresh die Datasources nicht jedesmal neuberechnet, muss ein eventuell ben\u00f6tigter Update-Mechanismus selbst implementiert werden. In diesem Beispiel dient daf\u00fcr die Methode <em>update()<\/em>, die im Backend aufgerufen werden kann:<\/p>\n<pre>&lt;xp:button value=\"Label\" id=\"button1\"&gt;\r\n\u00a0\u00a0 &lt;xp:eventHandler event=\"onclick\" submit=\"true\"\r\n      refreshMode=\"partial\" refreshId=\"label1\"&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;xp:this.action&gt;\r\n         &lt;![CDATA[#{javascript:<strong>objectData1.update()<\/strong>}]]&gt;\r\n      &lt;\/xp:this.action&gt;\r\n\u00a0\u00a0 &lt;\/xp:eventHandler&gt;\r\n&lt;\/xp:button&gt;<\/pre>\n<p><em>[Button ruft die Update-Funktion auf, label1 wird refresht und neuer Zeitstempel angezeigt]<\/em><\/p>\n<p>Die <em>ObjectDataSources<\/em> besitzen eine weitere Eigenschaft namens<em> saveObject<\/em>. Diese Eigenschaft ist optional und nur erforderlich, wenn man beabsichtigt, auf ein Speichern der DataSources reagieren zu wollen (um z.B. Daten ins Backend zu speichern, o.\u00e4.).<\/p>\n<p><strong>Achtung:<\/strong><\/p>\n<p>Einige Methodennamen d\u00fcrfen in der Java-Klasse nicht verwendet werden, da dies sonst zu Problemen mit der bestehenden Architektur kommen kann. Namen wie <em>save<\/em>() oder <em>load<\/em>() sind zu vermeiden!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Mit der Extension Library bzw. dem Upgrade Pack 1 ist f\u00fcr XPages eine neue Datasource-Komponente hinzugekommen, die ObjectDataSource. Diese Datasource kann wie die Standard-Datasources f\u00fcr View und Dokument ebenfalls an den verschiedensten Elementen einer XPage angehangen werden, d.h. sowohl an &hellip; <a href=\"https:\/\/hasselba.ch\/blog\/?p=594\">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":[36,89,26,76,74],"tags":[33,7,37,91,31,86,5,3],"class_list":["post-594","post","type-post","status-publish","format-standard","hentry","category-extlib","category-java","category-jsf","category-ssjs","category-xpages","tag-8-5-3","tag-domino","tag-extension-library","tag-extlib","tag-java","tag-jsf","tag-ssjs","tag-xpages"],"_links":{"self":[{"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=\/wp\/v2\/posts\/594","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=594"}],"version-history":[{"count":7,"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=\/wp\/v2\/posts\/594\/revisions"}],"predecessor-version":[{"id":600,"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=\/wp\/v2\/posts\/594\/revisions\/600"}],"wp:attachment":[{"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=594"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=594"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=594"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}