{"id":1891,"date":"2015-01-24T15:42:36","date_gmt":"2015-01-24T13:42:36","guid":{"rendered":"http:\/\/hasselba.ch\/blog\/?p=1891"},"modified":"2015-01-24T15:56:19","modified_gmt":"2015-01-24T13:56:19","slug":"howto-vaadin-on-domino","status":"publish","type":"post","link":"https:\/\/hasselba.ch\/blog\/?p=1891","title":{"rendered":"HowTo: Vaadin on Domino"},"content":{"rendered":"<h5 style=\"text-align: center;\">This example requires a valid XPages Plugin Development Environment. The execution environment used is the XPages Domino JRE.<\/h5>\n<p>1. Create a new plug-in project and select &#8222;<em>Equinox<\/em>&#8220; as OSGi framework<\/p>\n<p><a href=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/01-New-Plugin-Project.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-1900\" src=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/01-New-Plugin-Project-241x300.png\" alt=\"01 - New Plugin Project\" width=\"241\" height=\"300\" srcset=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/01-New-Plugin-Project-241x300.png 241w, https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/01-New-Plugin-Project.png 534w\" sizes=\"auto, (max-width: 241px) 100vw, 241px\" \/><\/a><\/p>\n<p>2. Set the name of the activator class to &#8222;<em>ch.hasselba.vaadin.Activator<\/em>&#8220;<\/p>\n<p><a href=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/02-Activator-Class.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-1901\" src=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/02-Activator-Class-242x300.png\" alt=\"02 - Activator Class\" width=\"242\" height=\"300\" srcset=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/02-Activator-Class-242x300.png 242w, https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/02-Activator-Class.png 537w\" sizes=\"auto, (max-width: 242px) 100vw, 242px\" \/><\/a><\/p>\n<p>3. Open the <em>MANIFEST.MF<\/em> file<\/p>\n<p><a href=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/03-Manifest.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1902\" src=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/03-Manifest.png\" alt=\"03 - Manifest\" width=\"279\" height=\"184\" \/><\/a><\/p>\n<p>4. On Tab &#8222;<em>Overview<\/em>&#8222;, activate the option for lazy loading and the singleton property<\/p>\n<p><a href=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/04-Singleton.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-1903\" src=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/04-Singleton-300x148.png\" alt=\"04 - Singleton\" width=\"300\" height=\"148\" srcset=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/04-Singleton-300x148.png 300w, https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/04-Singleton.png 627w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>5. Go to &#8222;<em>Dependencies<\/em>&#8220; tab and add the required plugin &#8222;<em>com.ibm.pvc.webcontainer<\/em>&#8220;<\/p>\n<p><a href=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/05-Dependencies-Required-Plugins-01.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-1904\" src=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/05-Dependencies-Required-Plugins-01-300x99.png\" alt=\"05 - Dependencies - Required Plugins 01\" width=\"300\" height=\"99\" srcset=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/05-Dependencies-Required-Plugins-01-300x99.png 300w, https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/05-Dependencies-Required-Plugins-01.png 630w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>When entering &#8222;<em>pvc<\/em>&#8222;, you can easily find the plugin from the list:<\/p>\n<p><a href=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/05-Dependencies-Required-Plugins-02.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-1905\" src=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/05-Dependencies-Required-Plugins-02-300x251.png\" alt=\"05 - Dependencies - Required Plugins 02\" width=\"300\" height=\"251\" srcset=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/05-Dependencies-Required-Plugins-02-300x251.png 300w, https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/05-Dependencies-Required-Plugins-02.png 603w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>6. Then, add\u00a0 &#8222;<em>javax.servlet<\/em>&#8220; and &#8222;<em>javax.servlet.http<\/em>&#8220; to the list of imported packages<\/p>\n<p><a href=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/06-Dependencies-ImportedPackages.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-1906\" src=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/06-Dependencies-ImportedPackages-300x87.png\" alt=\"06 - Dependencies -ImportedPackages\" width=\"300\" height=\"87\" srcset=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/06-Dependencies-ImportedPackages-300x87.png 300w, https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/06-Dependencies-ImportedPackages.png 616w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>7. Now, download the Jar files for Vaadin. The files can be <a title=\"vaadin.com: Download\" href=\"https:\/\/vaadin.com\/download#direct-download\" target=\"_blank\">found here<\/a> (the <em>All-in-One<\/em> archive is the right one).<\/p>\n<p>8. Import the Jars to the project<\/p>\n<p><a href=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/08-Import-Vaadin-Jars-01.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-1907\" src=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/08-Import-Vaadin-Jars-01-300x281.png\" alt=\"08 - Import - Vaadin Jars 01\" width=\"300\" height=\"281\" srcset=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/08-Import-Vaadin-Jars-01-300x281.png 300w, https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/08-Import-Vaadin-Jars-01.png 432w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p><a href=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/08-Import-Vaadin-Jars-02.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-1908\" src=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/08-Import-Vaadin-Jars-02-287x300.png\" alt=\"08 - Import - Vaadin Jars 02\" width=\"287\" height=\"300\" srcset=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/08-Import-Vaadin-Jars-02-287x300.png 287w, https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/08-Import-Vaadin-Jars-02.png 530w\" sizes=\"auto, (max-width: 287px) 100vw, 287px\" \/><\/a><\/p>\n<p>The required Jars are:<\/p>\n<ul>\n<li><em>vaadin-client-7.3.8.jar<\/em><\/li>\n<li><em>vaadin-client-compiled-7.3.8.jar<\/em><\/li>\n<li><em>vaadin-client-compiler-7.3.8.jar<\/em><\/li>\n<li><em>vaadin-push-7.3.8.jar<\/em><\/li>\n<li><em>vaadin-server-7.3.8.jar<\/em><\/li>\n<li><em>vaadin-shared-7.3.8.jar<\/em><\/li>\n<li><em>vaadin-themes-7.3.8.jar<\/em><\/li>\n<\/ul>\n<p><a href=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/08-Import-Vaadin-Jars-03.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-1909\" src=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/08-Import-Vaadin-Jars-03-287x300.png\" alt=\"08 - Import - Vaadin Jars 03\" width=\"287\" height=\"300\" srcset=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/08-Import-Vaadin-Jars-03-287x300.png 287w, https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/08-Import-Vaadin-Jars-03.png 625w\" sizes=\"auto, (max-width: 287px) 100vw, 287px\" \/><\/a><\/p>\n<p>9. Do this with \u201e<a title=\"jsoup.org: Download\" href=\"http:\/\/jsoup.org\/download\" target=\"_blank\">jsoup<\/a>\u201c and \u201e<a title=\"google.com:  org-json-java \" href=\"https:\/\/code.google.com\/p\/org-json-java\/downloads\/list\" target=\"_blank\">org.json<\/a>\u201c libaries too:<\/p>\n<p><a href=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/09-Import-Other-Jar.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-1910\" src=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/09-Import-Other-Jar-287x300.png\" alt=\"09 - Import - Other Jar\" width=\"287\" height=\"300\" srcset=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/09-Import-Other-Jar-287x300.png 287w, https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/09-Import-Other-Jar.png 626w\" sizes=\"auto, (max-width: 287px) 100vw, 287px\" \/><\/a><\/p>\n<p>10. Now, go to the &#8222;<em>Runtime<\/em>&#8220; tab and add the classpathes (don&#8217;t forget to move the &#8222;.&#8220; to the top of the list)<\/p>\n<p><a href=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/10-Runtime-Classpath-02.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-1930\" src=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/10-Runtime-Classpath-02-234x300.png\" alt=\"10 - Runtime - Classpath 02\" width=\"234\" height=\"300\" srcset=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/10-Runtime-Classpath-02-234x300.png 234w, https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/10-Runtime-Classpath-02.png 419w\" sizes=\"auto, (max-width: 234px) 100vw, 234px\" \/><\/a><\/p>\n<p><a href=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/10-Runtime-Classpath.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-1911\" src=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/10-Runtime-Classpath-300x165.png\" alt=\"10 - Runtime - Classpath\" width=\"300\" height=\"165\" srcset=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/10-Runtime-Classpath-300x165.png 300w, https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/10-Runtime-Classpath.png 602w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>The symbol of the filetypes have now changed:<\/p>\n<p><a href=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/10-Runtime-Classpath-03.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-1931\" src=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/10-Runtime-Classpath-03-257x300.png\" alt=\"10 - Runtime - Classpath 03\" width=\"257\" height=\"300\" srcset=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/10-Runtime-Classpath-03-257x300.png 257w, https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/10-Runtime-Classpath-03.png 307w\" sizes=\"auto, (max-width: 257px) 100vw, 257px\" \/><\/a><\/p>\n<p>11. On tab &#8222;<em>Overview<\/em>&#8222;, click on &#8222;<em>Extensions<\/em>&#8220; to open the Extension tab<\/p>\n<p><a href=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/11-Overview-Extensions.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-1912\" src=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/11-Overview-Extensions-300x75.png\" alt=\"11 - Overview - Extensions\" width=\"300\" height=\"75\" srcset=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/11-Overview-Extensions-300x75.png 300w, https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/11-Overview-Extensions-1024x257.png 1024w, https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/11-Overview-Extensions.png 1241w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>Click on &#8222;<em>Yes<\/em>&#8220; to open the &#8222;<em>Extension<\/em>&#8220; tab:<\/p>\n<p><a href=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/11-Overview-Extensions-02.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-1932\" src=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/11-Overview-Extensions-02-300x90.png\" alt=\"11 - Overview - Extensions 02\" width=\"300\" height=\"90\" srcset=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/11-Overview-Extensions-02-300x90.png 300w, https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/11-Overview-Extensions-02.png 519w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>12. Here, you have to add the extension point &#8222;<em>com.ibm.pvc.webcontainer.application<\/em>&#8220;<\/p>\n<p><a href=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/12-Extension-Add-01.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-1913\" src=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/12-Extension-Add-01-300x150.png\" alt=\"12 - Extension - Add 01\" width=\"300\" height=\"150\" srcset=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/12-Extension-Add-01-300x150.png 300w, https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/12-Extension-Add-01.png 632w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p><a href=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/12-Extension-Add-02.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-1914\" src=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/12-Extension-Add-02-206x300.png\" alt=\"12 - Extension - Add 02\" width=\"206\" height=\"300\" srcset=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/12-Extension-Add-02-206x300.png 206w, https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/12-Extension-Add-02.png 528w\" sizes=\"auto, (max-width: 206px) 100vw, 206px\" \/><\/a><\/p>\n<p>13. Open &#8222;<em>plugin.xml&#8220;<\/em>&#8230;<\/p>\n<p><a href=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/13-Plugin_XML.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-1915\" src=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/13-Plugin_XML-300x285.png\" alt=\"13 - Plugin_XML\" width=\"300\" height=\"285\" srcset=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/13-Plugin_XML-300x285.png 300w, https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/13-Plugin_XML.png 324w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>14. &#8230; and configure the extension point:<\/p>\n<pre><code>&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;\r\n&lt;?eclipse version=\"3.4\"?&gt;\r\n&lt;plugin&gt;\r\n\r\n\u00a0\u00a0\u00a0\u00a0 &lt;extension\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 point=\"com.ibm.pvc.webcontainer.application\"&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;contextRoot&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/helloVaadin \u00a0\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;\/contextRoot&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;contentLocation&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 WebContent\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;\/contentLocation&gt;\r\n\u00a0\u00a0 &lt;\/extension&gt;\r\n\r\n&lt;\/plugin&gt;<\/code><\/pre>\n<p><em>contextRoot<\/em> defines the URL pattern where the Vaadin servlet is reachable.\u00a0 <em>contentLocation<\/em> is a folder where the required <em>web.xml<\/em> configuration file can be found.<\/p>\n<p>Save the &#8222;<em>plugin.xml&#8220; <\/em>file.<\/p>\n<p>15. Create the folder &#8222;<em>WebContent<\/em>&#8222;&#8230;<\/p>\n<p><a href=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/15-Folder-01.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-1916\" src=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/15-Folder-01-300x143.png\" alt=\"15 - Folder 01\" width=\"300\" height=\"143\" srcset=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/15-Folder-01-300x143.png 300w, https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/15-Folder-01.png 615w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p><a href=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/15-Folder-02.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-1917\" src=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/15-Folder-02-253x300.png\" alt=\"15 - Folder 02\" width=\"253\" height=\"300\" srcset=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/15-Folder-02-253x300.png 253w, https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/15-Folder-02.png 529w\" sizes=\"auto, (max-width: 253px) 100vw, 253px\" \/><\/a><\/p>\n<p>16. &#8230; and then a second folder &#8222;<em>WEB-INF<\/em>&#8220; inside of &#8222;<em>WebContent<\/em>&#8220;<\/p>\n<p>17. Create the &#8222;<em>web.xml<\/em>&#8220; file in this folder, the tree should look like this:<\/p>\n<p><a href=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/17-WebFolder-Structure.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1918\" src=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/17-WebFolder-Structure.png\" alt=\"17 - WebFolder Structure\" width=\"297\" height=\"228\" \/><\/a><\/p>\n<p>18. The &#8222;<em>web.xml<\/em>&#8220; contains the configuration of the servlet:<\/p>\n<pre><code>&lt;?xml version=\"1.0\" encoding=\"ISO-8859-1\"?&gt;\r\n&lt;web-app version=\"2.5\" xmlns=\"http:\/\/java.sun.com\/xml\/ns\/javaee\" \r\nxmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\" \r\nxsi:schemaLocation=\"http:\/\/java.sun.com\/xml\/ns\/javaee \r\nhttp:\/\/java.sun.com\/xml\/ns\/javaee\/web-app_2_5.xsd\"&gt;\r\n\r\n\u00a0 &lt;display-name&gt;HelloVaadin&lt;\/display-name&gt;\r\n\u00a0\u00a0\u00a0 &lt;context-param&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;description&gt;Vaadin production mode&lt;\/description&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;param-name&gt;productionMode&lt;\/param-name&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;param-value&gt;false&lt;\/param-value&gt;\r\n\u00a0\u00a0\u00a0 &lt;\/context-param&gt;\r\n\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0\u00a0 &lt;servlet&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;servlet-name&gt;HelloVaadinServlet&lt;\/servlet-name&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;servlet-class&gt;com.vaadin.server.VaadinServlet&lt;\/servlet-class&gt;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0 &lt;init-param&gt;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0&lt;param-name&gt;UI&lt;\/param-name&gt;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0&lt;param-value&gt;ch.hasselba.vaadin.HelloVaadinUI&lt;\/param-value&gt;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0&lt;\/init-param&gt;\r\n\u00a0\u00a0 \u00a0&lt;\/servlet&gt; \r\n\r\n\u00a0\u00a0\u00a0 &lt;servlet-mapping&gt;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0&lt;servlet-name&gt;HelloVaadinServlet&lt;\/servlet-name&gt;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0&lt;url-pattern&gt;\/*&lt;\/url-pattern&gt;\r\n\u00a0\u00a0\u00a0 &lt;\/servlet-mapping&gt;\r\n\u00a0\u00a0 \u00a0\r\n&lt;\/web-app&gt;<\/code><\/pre>\n<p>The <em>&lt;init-param&gt;<\/em> tag inside <em>&lt;servlet&gt;<\/em> defines our UI class of our application. We will create this class later. The <em>&lt;servlet-mapping&gt;<\/em> defines a mapping <em>inside<\/em> the webapplication path.<\/p>\n<p>This means, if you would add a url-pattern like &#8222;<em>\/helloVaadinServlet\/*<\/em>&#8220; to the Vaadin servlet, the URL to reach the application is<\/p>\n<pre><code>http:\/\/example.com\/helloVaadin\/helloVaadinServlet\/<\/code><\/pre>\n<p>The &#8222;<em>\/helloVaadin\/<\/em>&#8220; part is the defined in the <em>contextPath<\/em> parameter in the web application. When using another pattern as &#8222;<em>\/*<\/em>&#8222;, an additional mapping for the Vaadin resources is required:<\/p>\n<pre><code>&lt;servlet-mapping&gt;\r\n        &lt;servlet-name&gt;HelloVaadinServlet&lt;\/servlet-name&gt;\r\n        &lt;url-pattern&gt;\/VAADIN\/*&lt;\/url-pattern&gt;\r\n&lt;\/servlet-mapping&gt;<\/code><\/pre>\n<p>19. Go to &#8222;<em>Build<\/em>&#8220; tab, and include the &#8222;<em>Web-Content<\/em>&#8220; folder:<\/p>\n<p><a href=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/19-Build-Add-WebContent-01.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-1919\" src=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/19-Build-Add-WebContent-01-300x286.png\" alt=\"19 - Build - Add WebContent 01\" width=\"300\" height=\"286\" srcset=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/19-Build-Add-WebContent-01-300x286.png 300w, https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/19-Build-Add-WebContent-01.png 710w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>The following line should now appear in the <em>build.properties<\/em> file which includes the folder in the final Jar.<\/p>\n<p><a href=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/19-Build-Add-WebContent-02.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-1920\" src=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/19-Build-Add-WebContent-02-300x210.png\" alt=\"19 - Build - Add WebContent 02\" width=\"300\" height=\"210\" srcset=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/19-Build-Add-WebContent-02-300x210.png 300w, https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/19-Build-Add-WebContent-02.png 522w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>20. Create the Vaadin servlet class &#8222;<em>ch.hasselba.vaadin.HelloVaadinUI&#8220;<\/em><\/p>\n<p><a href=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/20.-Servlet-Class-01.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-1922\" src=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/20.-Servlet-Class-01-300x140.png\" alt=\"20. Servlet Class 01\" width=\"300\" height=\"140\" srcset=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/20.-Servlet-Class-01-300x140.png 300w, https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/20.-Servlet-Class-01.png 724w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p><a href=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/20.-Servlet-Class-02.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-1933 size-medium\" src=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/20.-Servlet-Class-02-262x300.png\" alt=\"\" width=\"262\" height=\"300\" srcset=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/20.-Servlet-Class-02-262x300.png 262w, https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/20.-Servlet-Class-02.png 602w\" sizes=\"auto, (max-width: 262px) 100vw, 262px\" \/><\/a><\/p>\n<p><a href=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/20.-Servlet-Class-03.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1924\" src=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/20.-Servlet-Class-03.png\" alt=\"20. Servlet Class 03\" width=\"290\" height=\"181\" \/><\/a><\/p>\n<p>21. Add the following code to the class<\/p>\n<pre><code>package ch.hasselba.vaadin;\r\n\r\nimport com.vaadin.server.VaadinRequest;\r\nimport com.vaadin.server.VaadinServlet;\r\nimport com.vaadin.shared.ui.label.ContentMode;\r\nimport com.vaadin.ui.Alignment;\r\nimport com.vaadin.ui.HorizontalLayout;\r\nimport com.vaadin.ui.Label;\r\nimport com.vaadin.ui.UI; \r\n\r\n@SuppressWarnings(\"serial\")\r\npublic class HelloVaadinUI extends UI {\r\n\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0public static class Servlet extends VaadinServlet {\r\n\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0@Override\r\n\u00a0\u00a0 \u00a0protected void init(VaadinRequest request) {\r\n\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0HorizontalLayout layout = new HorizontalLayout();\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0setContent(layout);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0layout.setSizeFull();\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0Label label = new Label();\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0label.setValue(\"&lt;h1&gt;Hello Vaadin!&lt;\/h1&gt;\");\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0label.setContentMode(ContentMode.HTML);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0layout.addComponent(label);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0layout.setComponentAlignment(label, Alignment.TOP_CENTER);\r\n\u00a0\u00a0 \u00a0}\r\n\r\n}<\/code><\/pre>\n<p>22. At the end, organize the manifest. Open tab &#8222;<em>Overview<\/em>&#8220; and start the &#8222;<em>Organize Manifest Wizard<\/em>&#8220;<\/p>\n<p><a href=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/22-Overview-Organize-Manifest-01.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-1925\" src=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/22-Overview-Organize-Manifest-01-300x166.png\" alt=\"22 - Overview - Organize Manifest 01\" width=\"300\" height=\"166\" srcset=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/22-Overview-Organize-Manifest-01-300x166.png 300w, https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/22-Overview-Organize-Manifest-01-1024x568.png 1024w, https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/22-Overview-Organize-Manifest-01.png 1257w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p><a href=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/22-Overview-Organize-Manifest-02.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-1926\" src=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/22-Overview-Organize-Manifest-02-277x300.png\" alt=\"22 - Overview - Organize Manifest 02\" width=\"277\" height=\"300\" srcset=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/22-Overview-Organize-Manifest-02-277x300.png 277w, https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/22-Overview-Organize-Manifest-02.png 610w\" sizes=\"auto, (max-width: 277px) 100vw, 277px\" \/><\/a><\/p>\n<p>This updates the manifest and adds all resources for the Vaadin application.<\/p>\n<p><a href=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/22-Overview-Organize-Manifest-03.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-1927\" src=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/22-Overview-Organize-Manifest-03-274x300.png\" alt=\"22 - Overview - Organize Manifest 03\" width=\"274\" height=\"300\" srcset=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/22-Overview-Organize-Manifest-03-274x300.png 274w, https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/22-Overview-Organize-Manifest-03.png 632w\" sizes=\"auto, (max-width: 274px) 100vw, 274px\" \/><\/a><\/p>\n<p>Last but not least, save all project files.<\/p>\n<p>25. Create a Feature Project named &#8222;<em>HelloVaadinFeature<\/em>&#8220; and click on &#8222;<em>Next<\/em>&#8220;<\/p>\n<p><a href=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/Feature-00.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-1934\" src=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/Feature-00-300x50.png\" alt=\"Feature 00\" width=\"300\" height=\"50\" srcset=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/Feature-00-300x50.png 300w, https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/Feature-00.png 646w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p><a href=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/Feature-01.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-1937 size-medium\" src=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/Feature-01-262x300.png\" alt=\"\" width=\"262\" height=\"300\" srcset=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/Feature-01-262x300.png 262w, https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/Feature-01.png 529w\" sizes=\"auto, (max-width: 262px) 100vw, 262px\" \/><\/a><\/p>\n<p>27. Select the &#8222;<em>HelloVaadin<\/em>&#8220; Plug-In<\/p>\n<p><a href=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/Feature-02.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-1936\" src=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/Feature-02-262x300.png\" alt=\"Feature 02\" width=\"262\" height=\"300\" srcset=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/Feature-02-262x300.png 262w, https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/Feature-02.png 530w\" sizes=\"auto, (max-width: 262px) 100vw, 262px\" \/><\/a><\/p>\n<p>28. On the &#8222;<em>Plugins<\/em>&#8220; tab, check the option &#8222;<em>Unpack the plug-in archive after the installation<\/em>&#8222;:<\/p>\n<p><a href=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/Feature-03.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-1938\" src=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/Feature-03-300x77.png\" alt=\"Feature 03\" width=\"300\" height=\"77\" srcset=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/Feature-03-300x77.png 300w, https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/Feature-03.png 1007w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>Save the file and&#8230;<\/p>\n<p>29. &#8230; create the Update Site &#8222;<em>HelloVaadinUpdateSite<\/em>&#8220;<\/p>\n<p><a href=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/UpdateSite-01.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-1939\" src=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/UpdateSite-01-300x287.png\" alt=\"UpdateSite 01\" width=\"300\" height=\"287\" srcset=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/UpdateSite-01-300x287.png 300w, https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/UpdateSite-01.png 531w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p><a href=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/UpdateSite-02.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-1940\" src=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/UpdateSite-02-300x286.png\" alt=\"UpdateSite 02\" width=\"300\" height=\"286\" srcset=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/UpdateSite-02-300x286.png 300w, https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/UpdateSite-02.png 529w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>Add the feature&#8230;<\/p>\n<p><a href=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/UpdateSite-03.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-1941\" src=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/UpdateSite-03-300x157.png\" alt=\"UpdateSite 03\" width=\"300\" height=\"157\" srcset=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/UpdateSite-03-300x157.png 300w, https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/UpdateSite-03.png 630w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p><a href=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/UpdateSite-04.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-1942\" src=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/UpdateSite-04-300x250.png\" alt=\"UpdateSite 04\" width=\"300\" height=\"250\" srcset=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/UpdateSite-04-300x250.png 300w, https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/UpdateSite-04.png 605w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>&#8230; and build the site:<\/p>\n<p><a href=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/UpdateSite-05.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-1943\" src=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/UpdateSite-05-300x161.png\" alt=\"UpdateSite 05\" width=\"300\" height=\"161\" srcset=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/UpdateSite-05-300x161.png 300w, https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/UpdateSite-05.png 631w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>30. Import it to the Update Site on the Domino server and restart the HTTP task<\/p>\n<p>31. That&#8217;s it! Open the URL in the browser and enjoy.<\/p>\n<p><a href=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/99-Hello-Vaadin.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-1928\" src=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/99-Hello-Vaadin-300x119.png\" alt=\"99 - Hello Vaadin\" width=\"300\" height=\"119\" srcset=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/99-Hello-Vaadin-300x119.png 300w, https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/99-Hello-Vaadin.png 370w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>This example requires a valid XPages Plugin Development Environment. The execution environment used is the XPages Domino JRE. 1. Create a new plug-in project and select &#8222;Equinox&#8220; as OSGi framework 2. Set the name of the activator class to &#8222;ch.hasselba.vaadin.Activator&#8220; &hellip; <a href=\"https:\/\/hasselba.ch\/blog\/?p=1891\">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":[64,63],"tags":[7,65,66],"class_list":["post-1891","post","type-post","status-publish","format-standard","hentry","category-osgi","category-vaadin","tag-domino","tag-osgi","tag-vaadin"],"_links":{"self":[{"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=\/wp\/v2\/posts\/1891","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=1891"}],"version-history":[{"count":15,"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=\/wp\/v2\/posts\/1891\/revisions"}],"predecessor-version":[{"id":1957,"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=\/wp\/v2\/posts\/1891\/revisions\/1957"}],"wp:attachment":[{"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1891"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1891"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1891"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}