{"id":611,"date":"2012-04-07T16:43:01","date_gmt":"2012-04-07T14:43:01","guid":{"rendered":"http:\/\/hasselba.ch\/blog\/?p=611"},"modified":"2012-04-09T01:01:14","modified_gmt":"2012-04-08T23:01:14","slug":"lotusscript-in-xpages-1-basics","status":"publish","type":"post","link":"https:\/\/hasselba.ch\/blog\/?p=611","title":{"rendered":"LotusScript in XPages (1): Basics"},"content":{"rendered":"<h2>LotusScript in XPages<\/h2>\n<address>Dies ist der erste Teil des Artikels &#8222;LotusScript in XPages&#8220;. Der zweite Teil befindet sich <a title=\"LotusScript in XPages (2): LotusScript-Wrapper\" href=\"https:\/\/hasselba.ch\/blog\/?p=618\">hier<\/a>.<\/address>\n<p>&nbsp;<\/p>\n<p>W\u00e4re es nicht sch\u00f6n, wenn man in XPages direkt mit Lotus Script arbeiten k\u00f6nnte? Wenn es einen Weg g\u00e4be, mit der sich Lotus Script-Code direkt in der XPage einbetten liesse, und wie folgt zu verwenden w\u00e4re?<\/p>\n<p><img decoding=\"async\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAg0AAAAkCAIAAACFRp4UAAAD1ElEQVR4nO2aXZKsIAxGXc9sYpZm79z70LcsKiQfAfFnus+pecAAARHzEXuWDQAAIGa5ewIAAPBo0AkAAFCgEwAAoEAnAABAgU4AAIACnQAAAAU6AQAACnQCAAAU6AQAACjQCQAAUKATAACgQCcAAECBTgAAgAKdAAAABTrxOfwstvANfNXNwmUsr9fdU3gQT3zJftf1d11nNZvYMcm6rOtyov+f5X9w3Au73RTqjrWfrjj714Nyfv7lygwsVHICrk\/x+NznLhD7ML9LxX7Lz2RgAYV\/t2pgfQTn6cRfjG+HlvPUpZzYbGLHJDfqRFIkmvbjjR9I783OTdHyqiCC4zYpDm7pXarH7ZLeAfSItW6VhWSAqpudnUxcHN+O387gdlter3LsUsHcsitxQveixqZL6dx0cdsL\/zXvA9f+LkWX7stmjHXHepTSuFSU3urgtR+vyj9Dl06I85p7qKzLUXthbw6ROc+KoNYcVxh1KhbNOYpoxlWvMRNwo81Z2vfa3v2WmWq0Avq5J\/27te48TaQyRLXG+AHxTa9DkxGdcMcr187YM1WRN33pLmuzu2txqcO9ticteT8u7vvQDCJ5u4huzTdZzy3vXER\/MbpprIeIupjG9bj6fgeG7jVmdOKN2GBd350ys9J9t\/i5aDXtOsdEXTJioO2fEd+GpaJPJ7QoRaLqljVab5vrZRoP68QmY7pIKfI64frR5zsX8ZJEJzW3fT526zbNjEFPI1nl1uZjUMatTgsieUiKRFTVNVWBPogc2W874hHXKVfdyzSeuDEMZexqJhmu\/TPi21hiMS2f2M5cR7FeGXvTv8DViZPyiTHqNy3\/sjVbNuNspkHGPhYOuqY0phPaSS0Ps3RiilQkdWKYYZFO5kZHakvy+cQt5+DL4ttF+UQ5Xv0JzxTqyyl5WfStUMyh6V9TZwzN\/F1YzG8V+WkImm\/dmE5k3m33wJgMCpmx3EnqqoFpjMU7UzZS0ZxnZJ+VTGyTvjsJutZN75\/jly69v0+IQ7Ap1JdPjm83\/D5Rjv0u6HsTyVEy\/yrttU\/Xf9OPeIqGzO+B0ack10+yfZ5endD5R5SUbF4QLBubQu2nmfSYqmieYv7Cvzv\/5k1t8eoZo9tYGHsbdxHtq2jfdpHcP9HGEN6a\/vXzNfT+v1PmS8lfjG+3\/b9Tnq6TO4zRqxMfzDPv9Lh4wAUMxNMviW\/nbsmuYzucyjdEn67D5sUkv5k8cOYQ8T3xjV0JAAAKdAIAABToBAAAKNAJAABQoBMAAKBAJwAAQIFOAACAAp0AAAAFOgEAAAp0AgAAFP8AVoPjc78ERRcAAAAASUVORK5CYII=\" alt=\"\" \/><\/p>\n<p>Prinzipiell ist das m\u00f6glich, aber der hier dargestellte Weg ist eher als Workaround anzusehen und wird das Alpha-Stadium wohl eher nicht verlassen. Aber es l\u00e4sst sich anhand dieser Anleitung zeigen, wie man XPages flexibel erweitern und weitere Interpreter-Sprachen der XPages-Engine hinzuf\u00fcgen kann.<\/p>\n<p>Was mit der hier vorgestellten L\u00f6sung jedoch m\u00f6glich ist, kann man in dieser kleinen Beispiel-XPage sehen:<\/p>\n<pre>&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;\r\n&lt;xp:view xmlns:xp=\"http:\/\/www.ibm.com\/xsp\/core\"&gt;\r\n\r\n   &lt;xp:label id=\"label1\"&gt;\r\n      &lt;xp:this.value&gt;\r\n         &lt;![CDATA[#{<strong>lotusscript<\/strong>:returnValue=-1 }]]&gt;\r\n      &lt;\/xp:this.value&gt;\r\n   &lt;\/xp:label&gt;\r\n\u00a0\u00a0 &lt;xp:br\/&gt;\r\n   &lt;xp:br\/&gt;\r\n   &lt;xp:label id=\"label2\"&gt;\r\n      &lt;xp:this.value&gt;&lt;![CDATA[${<strong>lotusscript<\/strong>:\r\n         Dim session as New NotesSession\r\n         Dim db as NotesDatabase\r\n         Set db = session.CurrentDatabase\r\n\r\n         returnValue = db.AllDocuments.getFirstDocument.UniversalID\r\n      }]]&gt;&lt;\/xp:this.value&gt;\r\n   &lt;\/xp:label&gt;\r\n&lt;\/xp:view&gt;<\/pre>\n<p>In der XPage kann der neue Tag &#8222;<em>lotusscript:<\/em>&#8220; verwendet und beliebiger LotusScript-Code direkt in die XPage eingebettet werden. Das Ergebnis im Browser sieht dann wie folgt aus:<\/p>\n<p><img decoding=\"async\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAV8AAAB+CAIAAAAMUIXxAAAa2ElEQVR4nO2d2W8bWXr2a27zD+Qit\/mABJPORRBkcpH0DJAJkgAJ0o3MdJAJkgmSD5kksyX5MtPd7rZNq73KsmxJttWSvLW1UtwkUqIWW\/tKUqK4k7VzqWKRLJKS3O3x57Y1ygWl6nLVqVJRlCyN\/P7wwDg8dc573nPqnIfazMJC\/sXg6oLfO7eyPAMCnUj5vXPB1YWQfxF2e1XC\/N4510B\/R9vNG9evgkAnUh1tN10D\/X7vHOz2qoTZ+rvGRkc4Lv306RMQ6ESK49JjoyO2\/i5bf9dn9zp8nnkiHgTtKexmc2OpWHiyWd7cKIFAJ1JPNsulYuFmc+PN5sbgmtfvW\/AuTYP2FHa9sf7Jk\/WN9SIIdIL15Mn69cb66431If+yZ2ESZETY9cb6J5vljbIIAp1gPdksV9whsLq0PD8BMiLs+rUrmxul9VJBLTFNMlP9gXtnfc0\/9dz4kef2z6OuO1k8iGwMAh1nbW6Url+7cv3alYB\/aXlhAqGpoRXrrZW2Dyu7fbHlvxc66xfHrOjGb4awxobLmxvFcimvUGrBFep4P+u582XZ\/ctnE798NvFl2Z313Vm4+eOw+4G6PQh0dCqUS4X1cmG9XKiU1W02N4qNDZcbGy77VxYX5x4r5HN0aO326Yf16vZviLBrVy9trBdLxbxc9KMecuj6c9H5It320ve7Lzxff+H5+kvf735Jt7zYGIu6Glatt8RcVtELBHrtkuxAqVKxIG+5sV68dvXStauX\/L6FxdlHcq2am\/V3+0RH3cLUmKLXmyCs4erFjbJYEnOSmCkr7W7e2rQ9j555vvztymK98Hz9pfc3ni9\/+0vfn77k2+Mj173WW\/JeINBrV75clFSQaaeyJOalxhtlseHqxYarFxXusGK9bWS3j7WfO\/KzegTucLX+4npJLBaEivIZNnz3wy\/L7mfL39v+yde2f\/K1F56vKwpPH\/35y8\/HHzf9WzK2InXEMEwq1y55tEp53\/Fr7K6V1a+oMAxTr+2vqFAeofQFqfF6Sbxaf\/Fq\/cVV7\/z8zPiOJoaN7\/apoV6pI4ZhXwWpWfJolfK+49fYXREKq79yoVwsiPlsRczsIL94Z4s8\/WziW88mvqVer2cz3\/7F4z\/8MvIzeq51rrtB6ohhmFRW16iv6kvdt9oItXfXmhGyXkL+cn8JH55qn5GReenvhIPS7rHP1V+5\/NZbb11rqK\/4wrWG+rfeeqv+yuVi4StrEPPZcrFQf+VC\/ZULK565uemxijzWNuO73XnzQ6kjhmFSWV2jvqovdd9qI9TeHTkjrP7y+XIxL+b5iqL91zfZoZe+b73w\/J8t32+\/9P3OL9d+\/eXK771c\/f2twB9+ufBbW77ffr7wB88X\/uCpOGWv+77UEcMwqayuUV\/Vl7pvtRFq7641I0U9MvK+sz1U1TIj45NSRzuM1SgWssVCtigK62Xx5s3mt7\/5dtONxqYbjW9\/8+2bN5vXy2JRFHbaFLJini8X8\/WXz9dfPu\/zzM1OjVbkvX\/e+G43n\/47qSOGYVJZXaO+qi9132oj1N4dOSPsyqXzJTFXyHEVBe6bnopTxdZvFFu\/UTHRl4G3K4XnvvcqhWLrN55Yfn\/7xWr3z\/5S6ih\/b1HUaJWllpVK\/TIyLLJG\/VJnUJ0aZBxFeuqXOpXIZloJGJ+vTt8DnJHxW4C8qh9QKzhyRhXJPEJYL4uffnr73Xfeefeddz799PZ6ufKdclaykkKOK4m5K5fOX7l03rc8Nzs5WpG37VRVu13qKE9MUaNVllpWKvXLyLDIGvVLnUF1atBxLl36RO4Oq3fOvCgtfjH+7obl3crqbIW+tbNea9+vFD53f+cXM+9tv4x0\/fyvdO601v7Q2hNGGuiPgtx8RjoiQ2m9VI+o3sE6We2Zao3zPaQZ7XvdjN8j\/VCKS3J3KIm5jo72\/\/jhj37wb\/\/e1ta6++MGpTtcuvTJpUufeJdnZyZHKlpu\/aCq3S51xDBMUVbX6JQNNtAfRSF5AyPpKUIhX2IXL5yTu0Ow79qT9MQW+eGz5R\/srtefVApfhv55d+F++gL\/0fPSYt+Z7xncmkbK+g2Mnxa5cVZ78HRy0zlLVbXZM1V1Soo2WsEPdUbGU6rKHdRDGNwqOye\/kC0WhKYbN7773vd6+\/p6enr+6q\/faWxsKBYEUeUOFy+cu3jhnGdxeurxcEULHSbju73zg7+ROmIYpiira\/TL+g20YqojyO+FwY5SjU5uO20unDfJ3YGYG6Qed2zx96T1ki3T96X1epm\/E52+O911VX8b7XmbkfsG2cDIIddpUFV6+pEPyh2MpKRjBPqH8MBnZDylWtxBJxTaHfLZ640Nf\/pnf\/Gws3O9LK6Xxbv37v7RH3\/zWsMVMa90hwvnTRfOm5YXpiYfDVU03XfL+G633viZ1BHDMEVZXaNf1m+gFVMRQatBVenpRMbO152Vu0M+m5pv+vEXheCWYC73\/O32T772kjPtfEvGmbZ\/8rUn4z96ybe\/eEpa6v6Bia1Wtdd1ygYbvAZ32DPyUbnDnvkc6oz2vW7G75F+KFWbnZNfLuY314vlUqHy64lyqbC5XpR+0F7IVcSVxNz5urPn684uz09Njg\/taMxpfLePOrqkjhiGKcrqGp2ywQb6o+g0MJ6efmSs7txpuTsUclx80hK2X9t6lnjmP7NheXcrZ306c+rpzKktwfx08f3noU+2niV81qvT3df0b3nh1bc4+RuChP5O1YmpuKQeSD6cwVBakdXdFfH14+gX9JM3mKTOqUNmUu2M9r1utSeMzGRHX\/0KIytKv54oZKWvGgp5XmpcEnN1507XnTu9ND85Me6SNNndZGS3W268L++FYZi6XMlTUZZPAdnFSEzFJfVA8uEMhtKK\/EoX09mPFe6QFzJrg3eCtmufF8mXny9tCeYt\/t5Wum2Lv7dVmth6Lnj7r0x+dikvZBA3zIDQd1rXEY5crz+Twx7x+KxtTUlq\/8pTbg2FHFcSc6azH5vOfrw4N\/F4zCnXo7uX9He7pfH\/KboYF4ZhBq\/qt3ydkjLBzp75SOEOhRyXFzKh8Z6Ry\/837L6TI5c\/F4nPRaKU8s33XLHW\/eOsuXnf1rDnLX\/D3UHvrfJXc0aHnyRfQPgCr2hWEnNnz3x09sxH87MT4yODCo3ev6q1263Np9TtjQvDMINX9Vu+TkmZYGdOn1K7QyHH5YVMnk+GJqwTHWfcTf\/pbPihu\/l\/PK57fIqoxRpAoCNRScydOX3qzOlTc9OPxoYdao0P2YbvNzgafmq79K\/95\/+l\/+IP7K11o4Pm0SE7sv2bIOz0xx8i3QEEOkkqibnTH394+uMPZyZG3U4ryIiwj059AO4AOvEqibmPTn3w0akPJsaHnfY+kBFhp069D+4AOvEqiblTp94\/der9R6NOh6UbZETYd9\/7DrgD6MSrJOa++953vvvedy6eP\/dfP\/0hyIiwvJABgUAgtcAdQCAQWlgumzYogU9lUjRLEzQZJ\/GYJJqMszSRSdECnzIeDQQCHXNhOT61p7IZlqVwMhFJs1Qhx5eL+fWSWPlPL+slsVzMF3J8mqXIRISl8GyGNRITBAIdc2ECn9RRlmNZOkHiESGbLpcKFUdQf\/6vVC9k00QiwtK4flgQCHT8hWU5VktcmiYS4XSKLhXz5dLOR\/1qfXb4zgd+lgqlYj6doolEhEszOsFBINAxF5bNsEhxKRqPhfMCVy4WSmK+JOaLBlRpWS4WUiy9tuLFY2EyEa1RDBmniViapbRSXZyfaWlprqurMwEAcHBgfIZRK5OiErFQPseVivmimBOrVFHMPdlcL5eLSZYWC7lSsVCbcjmBIxKRJIOrU12Yn25vb88JgnigsCy7DQBvNhifphXiUhQeC2a5ZOXz+USk5B8fjmpQLAib6+vFQi7JkLLPF9\/\/kwsEPp2IBtTZ3mxpzuVyT58+\/f8HCrgDAGBcilKIwiMsjRcLWTGf3f1oHYTyAp8XNK8WcryYz25slPhMMpNitJ5KUDD+\/AJRiEcD6mzr6uq++OKLZwcNwzBHfWsA4IjBMilKrhRLRMNrhTxfyGfzOV4lLp\/jcgInCNzc7NTS4pwgcLkcl89xiMZ5Xixky2WRJOOCkMnneYRyvCDwgsDncjsvkc0K+axYyIYCK4psMynKZDL9QpfNQjY9NxC8b6o8W9nb+n7c\/aCYIvV70TR91LcGAI4YLJMk5SLioRRLFipGICiUyQuZXDYjZDPDrsGmW7dutNyafDwuZDOqlrvKcaViPsulkwyFapDJCdzSwtzU5KOcwOUqlahohRwnFrKhNZ8i20ySNJlMT7XhveNaz1aOjXXrdKQo6qhvDQAcMViaJSSlGDwc8OWFTF7gcnxaLmFXWT495By81db+oLvnfmfXjZaWLJ8WXm0sVz7HFcV8PBrKcilBFkfIZrJ8emlhrvn27Ru3btms\/VlZvfCq8kKmkOeDfq8824p03CE1ZdF\/tnJgoP3zzU0j7vBrv\/kfIJCOjuoAHypYisUlUUQEj4fyQkbIpgU+JSm7K55PuZwDt9rbP+vu6ewz3\/3s4fTMJM+nsrLGSmXToihQZDzJklk+KVOK51L91v62u3fvd3Xd7uiw26wcl+T5FM8lX22ZFLLpvMAF\/B55thWZTKYvUKTnnUaerbw60I7sTpKkfJmOfPOBjrmO6gAfKliKSUiKR9ZYKpHLpgU+meVeEc8leS7pcjput7d\/1tPT3Wd+0Nk5MzPF716SpOgo8Ml8LpNO0kQ8svMXChzLcyzPJblMMp1mrHbbw+6ezp6+1o4Oh8PGZZJ8JpnlXvmLBoFP5oVMYHVZnm1FJpPpcxUbxYLxZytn6Zg6AkEQipXa96aR\/q19\/x35GTjs0\/WrO9nXempfF1iSTkgKrfkyKTrLJflMks+wO0qzXJrl0qxzwHG7reNhT2+vxdpj7p+fn+MySW73qlxf9c2wfCYp8Kkslw4H\/Vya4dJsJs1m0klJqRTjHBrqsVg7+8ytHXcHHLZMOplJs1yakcRnkgKfWVtdlmdbEdIdMstjxp+tvGhuOobuoO6iFUqRpH7C26oTWPscD+Ro1ThZI\/lrjXJQUzh5YEk6LimwulT5C0rpb424NMNlGC7NOAfst9vaO3v7+qzWfpu9z2p90N3d2t7RdOvW9ZaWxubmhus3mlpaurse7J7nr5Tl2FyW868sZ1J0JkUzNN7b87Cto\/3Ovbv3Htzv7u2xOhxmm63fYe8ym1s7Ouw2SyZNZ1IUl6J3lGYEPrm2uiTPtiKTyfRERdzWYvzZyo5P\/kkdAcdxxUrVsu\/30V3dBRkKGVlnuG2UOxzGaXltkzWetjraAc73sA\/qkYCxVEzSqnchyyW5NJNJ05LSKXri8VjL7dbOnh6z1WqxO6wDA9aBAYvDYbbZey3Wnn5LV5\/5YU\/P3c8etn7amk7RmRQtj8Cl6LzA+TwLmSSVSpIUGWu62XK\/s7Ozp7fb3N9rsVjsDtvAoG1w0GK3d\/f13fq0dWpiLJ2k0iyVSVKZJJVJ0VmO9a8syrOtyGQybaoIPqir6tnK6giJREKxUopNoN4WWi9\/TeP9Wb8GGcfggVEns61tCupL+rkZXwqdvgc4WYNpa13d00eQwXVW4ySBMWRU0opnLpOiUwyRpPGKWBpnacI97Gq\/d7fXYum3260DA3an0+FyOVxDDpfLPui0Dgz22+19FktXb9+n7W0sTbC73StKMQSXZpYWZhgqztI4noh82t7eY+7vt9mtjgHboNPhGnK4hhxOl3VgsM9q67h3b2zUzdI4QyVYOsHSiSSDc2l61bcgz7YipDv4756t6tnKBt1hW\/eNF7nDjHREhtJ6qR5RnqFO42rLxrM1uBSHNNl9L6nx26cfSmp58njVHbzzKZZMsQRL45VjydIJlsZZBh8YdHT19locDrvTNTA0PDA0ZHU4zBZLr9nc3dfb2dP9sKvz7oP75v5elpH3TbA0nmKJVJJaWpxl6ARDJUg8ardbLVaLzWF3DAw4Xa7h0dHBYffgsNs+6Ozu7XO7hypBGCrO0AmGTiQZgktpusOGinB\/k\/FnK5vP\/r06wr7dAdlFv+O2bHvt48DotNEKqCjLE9aZhc5hUOdv5CwdyGSNp4S8WVrxkav0xrkDTUQkrXoXSDySYgiWSkhiqARDJViacLkGe\/vNDqfT6XYPuFw+33KSpRRiGWKnvUxpliDx2PLSLE3GKDJGkXGWJlhmRzSVGB0fc7pHBoeHzRbLyMgwQxM0maDJmCSWSmRS1Kp3Xp5tRSaTaV0FvTRq\/NnKs7031BHi8bhipYy4g1YD\/Y7bqF2oFXnbwIFBNlZU6gQ0kq1WGlL++gEPcLLGU9JPTH8InVBSzckDo4mwpKB\/KbjmS7EES8cZKiZTnKHiLIMPDTv7bVaX2+10u3v7++dmpyqXZIopxNLxFEsEAysr3kWajFFklCajFBmlyRhFxUkiarNbbIODrpERq8MxMjLEMjhDxqU2u+4QTyeJVe+cPNuKkO5QKorGn62cpmLHxx32jLxt4MAgGxucwj567ZnqoU5230tq\/Pbph5JqTh4YhYckRYK++dnHKZZgqBhNRlWKMXRieNhpddhdI6ODbvdn3V3T0xO7Z1jdPkqTUYaKpVhqfnYquOaliKgkkoiQZKzf0tvV2zs4NGx12N3uIYZKUESUJKIkEZE3ZshYOkmseGbl2VZkMpnKKPCZQSPPVp7pbUJ2j8ViipWStoL8pbpG0WVbe+MajKzuroivE0c9rn6N1ih7DqSVv86pU\/TVOqL6k933ktaesE7NiQEjE0FJeGxtenKk8lUATUQpIqJSlKbiw8Mu24DDNTJiGxhs62ijyBiFbhyhiShDxRkqMT05Fo8EyERYEoGHSTwyNzfV1d3dY+4bGnLSZJzCowQeljeriCaiKZbwLc\/Is63IZDKVUBSLxYDrgf6zlac6rxaLRWT3aDQqXyb1+XmdOvIEXmcyx2qyxpM8isN76GCKw7bqnV9enEkyOE2qDjz+lUEMDTvNlv5ec9\/I6PDuOzzKHchokiWWF2ZXvQtEPKQ89niYIqMLCzPz89MUGSfxMJmIqK2BTIQpIppi8arcoWIQ4ccWrWcrz1tbtawB3AGZw+tZiuMw2X0k+XqP7WsCI+IBuaIh35h7gMDDFXcg8fCrCpF4mMQjFBmbmno0NfWYImMkrm4WJvEwRURoMkbi0fERZzziJxMhhYh4kEiEKTxKETFCdVUuCo8kmYR3aUaRLREPmEymojaiKIr5XGR6cPLOOXfTf7mu\/djd8nPvcKfApURR1OkYiUSO+tYAwBGDEbE1ufCof2V5dmZyNEnHaSKCONKJIJkIEYnwzo8PZJXqI80y+PTE6IpnDo+uEbEAWvEgGQ9qXo0FiHiQwsMsHfd75xXZErG1urq6g\/3MuArhcPiobw0AHDEYHvMrFAv7JsaHlhamWCpG4iEyESTUigeUBZnIRJDEQ0kGX16cnZocjUfXiESoBgUpPJKIBVY8s+psm5uu8zwP7gAABw6GR\/0KJSKrkYDH7bIF\/R6WjFF4iIwH1V\/Sa4mMByk8lE5SkdDa+OgwHgsxZLwWsVQsEvTNT49Hg151thPjw623b\/E8VzhQQqHQUd8aADhisERkVa14eCWwsjBg7Z2ffcQQ0crPCPBYAI+t6SpAxINkIsQQ0f6+rlstjYP2vpEhe42annBPPRpe880jU01EVh+PDTfdaIRPrAeAgwWLR1aQioV9Qf+ie8j2aNSJxwI0ESESFYPY8YhE1J+I+iVfwOMBMhGkiQgeC4yPDrqHbEH\/Yizs04oPAoGOubB42KelWMgbXluafOTq730wNzVOxIM0ESZ3v9Go+ELlWwkSD9FEmIgH56bGzT0PJh+5wmtLsZBXJzgIBDrmwmIhn46iQW94zbPqmR1x2Xo677kGLEvzk6E1TyIaoPAwhYcT0UBozbM0P+kasPR03htx2VY9s+E1TzTo1Y8MAoGOubBYyLunokFPeG1pzTc\/M+l2DZgtfQ97Ht7pfNDe+aC95+EdS9\/DoQHzzKR7zTcfXluKBj1GYoJAoGMuLBr0GFQksBzyL\/p9c76lae\/ipGdhwrMw4V2c9C1N+31zIf9iJLBsPBoIBDrmwiKBZRAIBFILO+pfmgAAcEzBjvoPLgAAOKaAOwAAgAbcAQAANGh3wDBN18B2ObSUAAA4FiAOuc7hl9eDQQDAyUZ5witnHtwBAIDqvrMAdwCANwdwBwAA0GDInzKCOwAAAF87AACABtwBAAA0htxBYQrw9w4A8CYAhxwAADTgDgAAoAF3AAAADbgDAABowB0AAEAD7gAAABpwBwAA0IA7AACABtwBAAA04A4AAKABdwAAAA24AwAAaMAdAABAA+4AAAAacAcAANCAOwAAgAbcAQAANOAOAACgAXcAAAANuAMAAGjAHQAAQLPz1Ew5r1zWvrSt\/fnU6nr9OFqhkL32TEkrgsGxahzdSGT9evUs9oy8Z3oGZ1dtkEOq3McKbAOHAOKZuooNYeTSnmWdOAZD6VdKl\/QHMpKeVs77y7zaFdtzFnuuzz4S0wq1v9nVWLlteAUMLgWwbxDusG1gDxnsUm37PS9pVUqXqjKX2t2hqiSNT9nIsdc\/D9W6w541B7huRhbH+DuWTiVQIwfmDuo2+u2rDaVfuY3aVZgM4+kdiTsY6a4Oop4dsvv+3GHf797Sjdhz2WscXac9cCDs7Q4KFA0QEQ\/UHZDHG3kqkO6gM5zWdPSPn5FDtef23bc7GDxvWi\/17+ABugNytdVXtWoMjq5TAxwIJ+Rrhz2jqf1Fq5d+KINbU7\/ZgbiDTj1ydJ0pGwlSlTto9VI7eC2j69QAB8KBuUO1J23fxqFViXyr37NXVTnrZ6tTaeT0VhtT65L+UTHoDgavVuUOVVUadwewhsMD4Q4G70RV5f3d+2oPSbWZ1O4O1S6IwQbV1tR4sPd8aSTIQVXu+dK4FQI1suMOWm+8+u\/Jxuv142iFqtEddMIaqdTPs\/aJ66+GkUGrWrSq7khV9+jAK5EJVDsFoHZgTQEAQAPuAAAAGnAHAADQgDsAAIAG3AEAADTgDgAAoAF3AAAADbgDAABowB0AAEAD7gAAABpwBwAA0IA7AACABtwBAAA04A4AAKABdwAAAA24AwAAaMAdAABAA+4AAAAacAcAANCAOwAAgAbcAQAANP8LE4QsbVC05k8AAAAASUVORK5CYII=\" alt=\"\" \/><\/p>\n<p>Soviel vorab, nun zu erst einmal zu den Basics&#8230;<\/p>\n<h2>Grundlagen: Method-Bindings &amp; Value-Bindings<\/h2>\n<p>Um einen neuen Tag f\u00fcr XPages bereitzustellen, m\u00fcssen zu aller erst Bindings f\u00fcr Methoden- und f\u00fcr Werte-Zuweisungen erstellt werden. Die beiden Binding-Arten unterscheiden sich &#8211; grob formuliert* &#8211; wie folgt: Value-Bindings werden \u00fcberall dort verwendet, wo ein Wert einer Komponente zugewiesen wird und (wie der Name erahnen l\u00e4sst) eine <em>value<\/em>-Eigenschaft exitsiert. Dies ist bei praktisch allen UIKomponenten der Fall. Method-Bindings hingegen kommen bei der Zuweisung bei samtlichen Events ins Spiel: Der SSJS-Code eines <em>BeforePageLoad<\/em>-Events wird mit einem Method-Binding gesetzt, oder der Code bei Button-Events usw.<\/p>\n<p>Die Value-Binding-Klasse, die f\u00fcr die hier geschilderten Zwecke ben\u00f6tigt wird, sieht wie folgt aus:<\/p>\n<pre>package ch.hasselba.xpages.jsf.el;\r\n\r\nimport com.ibm.xsp.binding.ValueBindingEx;\r\nimport javax.faces.context.FacesContext;\r\nimport javax.faces.el.EvaluationException;\r\nimport javax.faces.el.PropertyNotFoundException;\r\n\r\npublic class LSValueBinding extends ValueBindingEx {\r\n\u00a0\u00a0 \u00a0private String data;\r\n\r\n\u00a0\u00a0 \u00a0public LSValueBinding(String data) {\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0this.data = data;\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0@Override\r\n\u00a0\u00a0 \u00a0public Object getValue(FacesContext context)\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0throws EvaluationException, PropertyNotFoundException {\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return LSExecutor.execLotusScriptCode( this.data );\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0@Override\r\n\u00a0\u00a0 \u00a0public void setValue(FacesContext context, Object obj)\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 throws EvaluationException, PropertyNotFoundException {}\r\n\r\n\u00a0\u00a0 \u00a0@Override\r\n\u00a0\u00a0 \u00a0public boolean isReadOnly(FacesContext context)\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0throws EvaluationException, PropertyNotFoundException {\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return true;\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0@SuppressWarnings(\"unchecked\")\r\n\u00a0\u00a0 \u00a0@Override\r\n\u00a0\u00a0 \u00a0public Class getType(FacesContext context)\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0throws EvaluationException, PropertyNotFoundException {\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return Object.class;\r\n\u00a0\u00a0 \u00a0}\r\n}<\/pre>\n<p>Das Value-Binding erweitert die Klasse <em>com.ibm.xsp.binding.ValueBindingEx<\/em> und \u00fcberschreibt deren Eigenschaften, wo es n\u00f6tig ist. Im Konstruktor der Klasse findet die Wertezuweisung statt; es wird hier der Teil, der in der XPage nach dem &#8222;<em>lotusscript:<\/em>&#8220; folgt, \u00fcbergeben. Auch mehrzeiliger Code in der XPage wird als einfacher String durchgereicht, getrennt durch Zeilenumbr\u00fcche.<\/p>\n<p>Um an den Wert des Bindings zu gelangen, wird w\u00e4hrend der Verarbeitung durch das JSF Framework die Methode <em>getValue()<\/em> aufgerufen; dies ist die Stelle, an der die Daten des Value-Bindings verarbeitet werden, und wie man hier sehen kann, findet der Aufruf des LotusScript-Codes genau an dieser Stelle statt.<\/p>\n<p>Das notwendige Method-Binding ist so \u00e4hnlich aufgebaut:<\/p>\n<pre>package ch.hasselba.xpages.jsf.el;\r\n\r\nimport com.ibm.xsp.binding.MethodBindingEx;\r\nimport javax.faces.context.FacesContext;\r\nimport javax.faces.el.EvaluationException;\r\nimport javax.faces.el.MethodNotFoundException;\r\n\r\npublic class LSMethodBinding extends MethodBindingEx {\r\n\u00a0\u00a0 \u00a0private String data;\r\n\r\n\u00a0\u00a0 \u00a0public LSMethodBinding () {\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0super();\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0public LSMethodBinding (String expr) {\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0super();\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0this.data = expr;\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0@Override\r\n\u00a0\u00a0 \u00a0public Object invoke(FacesContext context, Object[] obj)\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0throws EvaluationException, MethodNotFoundException {\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return LSExecutor.execLotusScriptCode( this.data );\r\n\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0@SuppressWarnings(\"unchecked\")\r\n\u00a0\u00a0 \u00a0@Override\r\n\u00a0\u00a0 \u00a0public Class getType(FacesContext context)\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0throws MethodNotFoundException {\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return null;\r\n\u00a0\u00a0 \u00a0}\r\n}<\/pre>\n<p>Hier wird wie Klasse <em>com.ibm.xsp.binding.MethodBindingEx<\/em> erweitert und &#8211; wenn n\u00f6tig &#8211; \u00fcberschrieben. Anders als beim Value-Binding erfolgt der &#8222;Abruf&#8220; der Daten eines Method-Bindings durch das JSF Framework nicht durch<em> getValue()<\/em>, sondern durch die Methode <em>invoke()<\/em>. Hierbei k\u00f6nnen theoretisch noch Parameter \u00fcbergeben werden, die f\u00fcr die Verarbeitung relevant sein k\u00f6nnten. In diesem Fall kann dies aber getrost ignoriert werden.<\/p>\n<p>Zu guter Letzt m\u00fcssen die beiden Bindings in eine <em>BindingFactory<\/em>-Klasse zusammen gef\u00fchrt und mit dem &#8222;<em>lotusscript<\/em>&#8222;-Tag verbunden werden:<\/p>\n<pre>package ch.hasselba.xpages.jsf.el;\r\n\r\nimport com.ibm.xsp.util.ValueBindingUtil;\r\nimport com.ibm.xsp.binding.BindingFactory;\r\nimport javax.faces.application.Application;\r\nimport javax.faces.el.MethodBinding;\r\nimport javax.faces.el.ValueBinding;\r\n\r\npublic class LSBindingFactory implements BindingFactory {\r\n\r\n\u00a0\u00a0 \u00a0public String getPrefix() {\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return \"lotusscript\";\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0@SuppressWarnings(\"unchecked\")\r\n\u00a0\u00a0 \u00a0public MethodBinding createMethodBinding(\r\n         Application app, String expr, Class[] obj) {\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0String script = ValueBindingUtil.parseSimpleExpression(expr);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return new LSMethodBinding(script);\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0public ValueBinding createValueBinding(Application app, String expr) {\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0String script = ValueBindingUtil.parseSimpleExpression( expr );\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return new LSValueBinding(script);\r\n\u00a0\u00a0 \u00a0}\r\n}<\/pre>\n<p>Die Klasse erweitert <em>com.ibm.xsp.binding.BindingFactory<\/em> und ist die &#8222;Weiterleitung&#8220; innerhalb des JSF-Frameworks: Die Methode <em>getPrefix()<\/em> liefert den String zur\u00fcck, f\u00fcr den diese BindingFactory zust\u00e4ndig ist; es ist praktisch jeder Bezeichner verwendbar, nur <em>id<\/em> und <em>javascript<\/em> sind bereits belegt.<\/p>\n<p>W\u00e4hrend der Verarbeitung der Bindings sucht das JSF-Framework zur Laufzeit nach der passenden Factory. Dabei werden alle bekannten Factories nach dem passenden Prefix durchsucht, weshalb die BindingFactory dem Framework noch bekannt gemacht werden muss, um verwendet werden zu k\u00f6nnen.<\/p>\n<p>Im <a title=\"LotusScript in XPages (2): LotusScript-Wrapper\" href=\"https:\/\/hasselba.ch\/blog\/?p=618\">zweiten Teil<\/a> wird eine Quick-n-Dirty-Variante gezeigt, die <em>BindingFactory<\/em> bekannt zu machen und der LotusScript-Wrapper wird vorgestellt.<\/p>\n<p><strong>*: Anmerkung:<\/strong><\/p>\n<p>Aus Sicht der JSF-Spezifikation ist der Unterschied zwischen Value-Binding und Method-Binding etwas komplexer, als hier dargestellt.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>LotusScript in XPages Dies ist der erste Teil des Artikels &#8222;LotusScript in XPages&#8220;. Der zweite Teil befindet sich hier. &nbsp; W\u00e4re es nicht sch\u00f6n, wenn man in XPages direkt mit Lotus Script arbeiten k\u00f6nnte? Wenn es einen Weg g\u00e4be, mit &hellip; <a href=\"https:\/\/hasselba.ch\/blog\/?p=611\">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,29,38,89,26,20,74,24],"tags":[33,7,30,88,39,31,86,80,3,85],"class_list":["post-611","post","type-post","status-publish","format-standard","hentry","category-allgemein","category-expression-language","category-extensibility-api","category-java","category-jsf","category-lotus-script","category-xpages","category-xsp","tag-8-5-3","tag-domino","tag-el","tag-expression-language","tag-extenisbility-api","tag-java","tag-jsf","tag-lotus-script","tag-xpages","tag-xsp"],"_links":{"self":[{"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=\/wp\/v2\/posts\/611","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=611"}],"version-history":[{"count":18,"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=\/wp\/v2\/posts\/611\/revisions"}],"predecessor-version":[{"id":630,"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=\/wp\/v2\/posts\/611\/revisions\/630"}],"wp:attachment":[{"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=611"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=611"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=611"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}