{"id":78,"date":"2015-10-04T19:05:58","date_gmt":"2015-10-04T17:05:58","guid":{"rendered":"http:\/\/itblog.inginea.eu\/?p=78"},"modified":"2016-12-17T22:53:26","modified_gmt":"2016-12-17T21:53:26","slug":"test","status":"publish","type":"post","link":"https:\/\/ondro.inginea.eu\/index.php\/language\/sk\/test\/","title":{"rendered":"\u0160trukt\u00fara modernej Java EE aplik\u00e1cie"},"content":{"rendered":"<p>Java EE framework sa v posledn\u00fdch rokoch vo verzii Java EE 6 a Java EE 7 zjednodu\u0161il nato\u013eko, \u017ee je mo\u017en\u00e9 vytv\u00e1ra\u0165 Java EE aplik\u00e1cie s jednoduchou \u0161trukt\u00farou, ktor\u00e9 obsahuj\u00fa ve\u013ek\u00fd podiel aplika\u010dnej logiky a mal\u00fd podiel spojovacieho k\u00f3du. Na vystavanie aplik\u00e1cie n\u00e1m \u010dasto sta\u010dia oby\u010dajn\u00e9 Java objekty obohaten\u00e9 o anot\u00e1cie, ktor\u00e9 definuj\u00fa \u010dasto sa opakuj\u00face vlastnosti a mechanizmy. Met\u00f3dy objektov tak obsahuj\u00fa hlavne business logiku, teda funkcionalitu na\u0161ej aplik\u00e1cie.<\/p>\n<p>V\u0161eobecn\u00e9 mechanizmy, ako napr\u00edklad logovanie, transakcie, napojenie na datab\u00e1zu \u010di vytv\u00e1ranie vz\u0165ahov medzi objektami, je mo\u017en\u00e9 deklarova\u0165 pomocou dodato\u010dn\u00fdch anot\u00e1ci\u00ed. Tie sl\u00fa\u017eia ako zna\u010dky pre Java EE framework, ktor\u00fd pod\u013ea nich vlo\u017e\u00ed dodato\u010dn\u00fa funkcionalitu do na\u0161ich objektov. V tomto pr\u00edpade ide o funkcie, ktor\u00e9 sa \u010dasto opakuj\u00fa a daj\u00fa sa v\u0161eobecne automatizova\u0165.<\/p>\n<p>Uk\u00e1\u017eeme si ako m\u00f4\u017eeme preh\u013eadne \u0161trukt\u00farova\u0165 na\u0161u aplik\u00e1ciu, a ako n\u00e1m pri ohrani\u010den\u00ed stavebn\u00fdch blokov pom\u00e1haj\u00fa Java EE anot\u00e1cie, ktor\u00e9 d\u00e1vaj\u00fa logick\u00fd v\u00fdznam jednotliv\u00fdm objektom.<!--more--><\/p>\n<h2>Rozdelenie na prezenta\u010dn\u00fa a business logiku<\/h2>\n<p>Typick\u00e1 Java EE webov\u00e1 aplik\u00e1cia sa rozde\u013euje na prezenta\u010dn\u00fa vrstvu (frontend) a vrstvu s business logikou (backend). Toto rozdelenie je logick\u00e9 vzh\u013eadom k tomu, \u017ee prezenta\u010dn\u00e1 vrstva b\u00fdva sama o sebe dos\u0165 obsiahla a s\u00fa na \u0148u obvykle kladen\u00e9 odli\u0161n\u00e9 n\u00e1roky ako na hlavn\u00fa \u010das\u0165 aplik\u00e1cie. Ak oddel\u00edme business logiku od frontendu, m\u00f4\u017eeme na \u0148u prip\u00e1ja\u0165 viac r\u00f4znych prezenta\u010dn\u00fdch komponent alebo ju spr\u00edstupni\u0165 extern\u00fdm aplik\u00e1ci\u00e1m napr. ako webov\u00fa slu\u017ebu. A zaru\u010d\u00edme tak, \u017ee v\u0161etky prezenta\u010dn\u00e9 rozhrania bud\u00fa pou\u017e\u00edva\u0165 tie ist\u00e9 business pravidl\u00e1 a chova\u0165 sa rovnako.<\/p>\n<div id=\"attachment_95\" style=\"width: 761px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/i0.wp.com\/itblog.inginea.eu\/wp-content\/uploads\/2015\/10\/01-Diagramy-FE-BE-e1443906220240.jpg\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-95\" data-attachment-id=\"95\" data-permalink=\"https:\/\/ondro.inginea.eu\/index.php\/language\/sk\/test\/01-diagramy-fe-be\/\" data-orig-file=\"https:\/\/i0.wp.com\/ondro.inginea.eu\/wp-content\/uploads\/2015\/10\/01-Diagramy-FE-BE-e1443906220240.jpg?fit=946%2C426&amp;ssl=1\" data-orig-size=\"946,426\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"Sch\u00e9ma rozdelenia na prezenta\u010dn\u00fa a business logiku\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/i0.wp.com\/ondro.inginea.eu\/wp-content\/uploads\/2015\/10\/01-Diagramy-FE-BE-e1443906220240.jpg?fit=300%2C135&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/ondro.inginea.eu\/wp-content\/uploads\/2015\/10\/01-Diagramy-FE-BE-e1443906220240.jpg?fit=640%2C453&amp;ssl=1\" class=\"wp-image-95\" src=\"https:\/\/i0.wp.com\/itblog.inginea.eu\/wp-content\/uploads\/2015\/10\/01-Diagramy-FE-BE-e1443906220240.jpg?resize=640%2C288\" alt=\"Sch\u00e9ma rozdelenia na prezenta\u010dn\u00fa a business logiku\" width=\"640\" height=\"288\" srcset=\"https:\/\/i0.wp.com\/ondro.inginea.eu\/wp-content\/uploads\/2015\/10\/01-Diagramy-FE-BE-e1443906220240.jpg?w=946&amp;ssl=1 946w, https:\/\/i0.wp.com\/ondro.inginea.eu\/wp-content\/uploads\/2015\/10\/01-Diagramy-FE-BE-e1443906220240.jpg?resize=300%2C135&amp;ssl=1 300w, https:\/\/i0.wp.com\/ondro.inginea.eu\/wp-content\/uploads\/2015\/10\/01-Diagramy-FE-BE-e1443906220240.jpg?resize=700%2C315&amp;ssl=1 700w\" sizes=\"(max-width: 640px) 100vw, 640px\" data-recalc-dims=\"1\" \/><\/a><p id=\"caption-attachment-95\" class=\"wp-caption-text\">Diagram 1: Sch\u00e9ma rozdelenia na prezenta\u010dn\u00fa a business logiku<\/p><\/div>\n<p>V na\u0161ej uk\u00e1\u017ekovej aplik\u00e1cii za\u010dneme t\u00fdm, \u017ee zobraz\u00edme na \u00favodnej str\u00e1nke oslovenie pre prihl\u00e1sen\u00e9ho u\u017e\u00edvate\u013ea.<\/p>\n<div id=\"attachment_99\" style=\"width: 588px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/i0.wp.com\/itblog.inginea.eu\/wp-content\/uploads\/2015\/10\/01-index_screenshot.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-99\" data-attachment-id=\"99\" data-permalink=\"https:\/\/ondro.inginea.eu\/index.php\/language\/sk\/test\/01-index_screenshot\/\" data-orig-file=\"https:\/\/i0.wp.com\/ondro.inginea.eu\/wp-content\/uploads\/2015\/10\/01-index_screenshot.png?fit=578%2C196&amp;ssl=1\" data-orig-size=\"578,196\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"Screenshot prvej str\u00e1nky na\u0161ej aplik\u00e1cie\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/i0.wp.com\/ondro.inginea.eu\/wp-content\/uploads\/2015\/10\/01-index_screenshot.png?fit=300%2C102&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/ondro.inginea.eu\/wp-content\/uploads\/2015\/10\/01-index_screenshot.png?fit=578%2C196&amp;ssl=1\" class=\"wp-image-99 size-full\" src=\"https:\/\/i0.wp.com\/itblog.inginea.eu\/wp-content\/uploads\/2015\/10\/01-index_screenshot.png?resize=578%2C196\" alt=\"Screenshot prvej str\u00e1nky na\u0161ej aplik\u00e1cie\" width=\"578\" height=\"196\" srcset=\"https:\/\/i0.wp.com\/ondro.inginea.eu\/wp-content\/uploads\/2015\/10\/01-index_screenshot.png?w=578&amp;ssl=1 578w, https:\/\/i0.wp.com\/ondro.inginea.eu\/wp-content\/uploads\/2015\/10\/01-index_screenshot.png?resize=300%2C102&amp;ssl=1 300w\" sizes=\"(max-width: 578px) 100vw, 578px\" data-recalc-dims=\"1\" \/><\/a><p id=\"caption-attachment-99\" class=\"wp-caption-text\">Obr. 1: Screenshot prvej str\u00e1nky na\u0161ej aplik\u00e1cie<\/p><\/div>\n<p>Vytvor\u00edme 2 oby\u010dajn\u00e9 Java triedy:<\/p>\n<ul>\n<li><span class=\"lang:java decode:true crayon-inline \">IndexPage<\/span> bude obsahova\u0165 prezenta\u010dn\u00fa logiku \u2013 met\u00f3du na vr\u00e1tenie textu, ktor\u00fd zobraz\u00edme na str\u00e1nke (vr\u00e1tane pozdravu a mena u\u017e\u00edvate\u013ea)<\/li>\n<li><span class=\"lang:java decode:true crayon-inline\">UserContext<\/span> bude obsahova\u0165 business logiku \u2013 sp\u00f4sob, ak\u00fdm sa zist\u00ed aktu\u00e1lne prihl\u00e1sen\u00fd u\u017e\u00edvate\u013e \u2013 a poskytuje navonok jeho meno cez public met\u00f3du<\/li>\n<\/ul>\n<p>[restabs alignment=&#8221;osc-tabs-left&#8221; responsive=&#8221;true&#8221; icon=&#8221;true&#8221; text=&#8221;More&#8221;]<br \/>\n[restab title=&#8221;index.xhtml&#8221; active=&#8221;active&#8221;]<\/p>\n<pre class=\"toolbar-overlay:false lang:xhtml decode:true\">&lt;?xml version='1.0' encoding='UTF-8' ?&gt;\r\n&lt;!DOCTYPE html PUBLIC \"-\/\/W3C\/\/DTD XHTML 1.0 Transitional\/\/EN\" \"http:\/\/www.w3.org\/TR\/xhtml1\/DTD\/xhtml1-transitional.dtd\"&gt;\r\n&lt;html xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\"\r\n      xmlns:h=\"http:\/\/xmlns.jcp.org\/jsf\/html\"&gt;\r\n    &lt;h:head&gt;\r\n        &lt;title&gt;Welcome to the CRM&lt;\/title&gt;\r\n    &lt;\/h:head&gt;\r\n    &lt;h:body&gt;\r\n        &lt;h1&gt;#{indexPage.welcomeMessage}&lt;\/h1&gt;\r\n    &lt;\/h:body&gt;\r\n&lt;\/html&gt;<\/pre>\n<p>[\/restab]<br \/>\n[restab title=&#8221;IndexPage.java&#8221;]<\/p>\n<pre class=\"lang:java decode:true \">package eu.ondrom.crmapp.presentation.boundary;\r\n\r\nimport eu.ondrom.crmapp.business.boundary.UserContext;\r\nimport javax.enterprise.context.RequestScoped;\r\nimport javax.inject.Inject;\r\nimport javax.inject.Named;\r\n\r\n@Named\r\n@RequestScoped\r\npublic class IndexPage {\r\n    \r\n    @Inject\r\n    private UserContext userContext;\r\n    \r\n    public String getWelcomeMessage() {\r\n        return \"Welcome \" + userContext.getCurrentUserName() + \" !\";\r\n    }\r\n}<\/pre>\n<p>[\/restab]<br \/>\n[restab title=&#8221;UserContext.java&#8221;]<\/p>\n<pre class=\"lang:java decode:true\">package eu.ondrom.crmapp.business.boundary;\r\n\r\nimport javax.enterprise.context.Dependent;\r\nimport javax.transaction.Transactional;\r\n\r\n@Transactional\r\n@Dependent\r\npublic class UserContext {\r\n    public String getCurrentUserName() {\r\n        return \"Lisa\";\r\n    }\r\n}<\/pre>\n<p>[\/restab][\/restabs]<\/p>\n<p>Ka\u017ed\u00e1 trieda je definovan\u00e1 v bal\u00ed\u010dku, ktor\u00fd nesie v n\u00e1zve to, do akej vrstvy patr\u00ed (IndexPage v bal\u00edku \u201epresentation\u201c, UserContext v bal\u00edku \u201ebusiness\u201c). Obe vytvoren\u00e9 triedy sa e\u0161te nach\u00e1dzaj\u00fa vo vnoren\u00fdch bal\u00edkoch \u201eboundary\u201c &#8211; obe ohrani\u010duj\u00fa logiku svojej vrstvy a poskytuj\u00fa rozhranie navonok:<\/p>\n<ul>\n<li><span class=\"lang:java decode:true crayon-inline\">IndexPage<\/span> odde\u013euje logiku prezenta\u010dnej vrstvy od defin\u00edcie u\u017e\u00edvate\u013esk\u00e9ho vzh\u013eadu, ktor\u00fd je definovan\u00fd pomocou xhtml s\u00faboru JSF faceletu<\/li>\n<li><span class=\"lang:java decode:true crayon-inline \">UserContext<\/span> odde\u013euje business logiku od logiky prezenta\u010dnej vrstvy<\/li>\n<\/ul>\n<p>V bal\u00edkoch \u201eboundary\u201c budeme umiest\u0148ova\u0165 iba hrani\u010dn\u00e9 triedy. Ostatn\u00e9 triedy budeme d\u00e1va\u0165 do bal\u00edka control, ktor\u00fd nebude zauj\u00edmav\u00fd mimo svojej vrstvy. Ale o tom nesk\u00f4r.<\/p>\n<div id=\"attachment_122\" style=\"width: 735px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/i0.wp.com\/itblog.inginea.eu\/wp-content\/uploads\/2015\/10\/01-Diagramy-boundary.jpg\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-122\" data-attachment-id=\"122\" data-permalink=\"https:\/\/ondro.inginea.eu\/index.php\/language\/sk\/test\/01-diagramy-boundary\/\" data-orig-file=\"https:\/\/i0.wp.com\/ondro.inginea.eu\/wp-content\/uploads\/2015\/10\/01-Diagramy-boundary.jpg?fit=725%2C211&amp;ssl=1\" data-orig-size=\"725,211\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"Hranice medzi vrstvami v zdrojovom k\u00f3de\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/i0.wp.com\/ondro.inginea.eu\/wp-content\/uploads\/2015\/10\/01-Diagramy-boundary.jpg?fit=300%2C87&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/ondro.inginea.eu\/wp-content\/uploads\/2015\/10\/01-Diagramy-boundary.jpg?fit=640%2C186&amp;ssl=1\" class=\"wp-image-122 size-full\" src=\"https:\/\/i0.wp.com\/itblog.inginea.eu\/wp-content\/uploads\/2015\/10\/01-Diagramy-boundary.jpg?resize=640%2C186\" alt=\"Hranice medzi vrstvami v zdrojovom k\u00f3de\" width=\"640\" height=\"186\" srcset=\"https:\/\/i0.wp.com\/ondro.inginea.eu\/wp-content\/uploads\/2015\/10\/01-Diagramy-boundary.jpg?w=725&amp;ssl=1 725w, https:\/\/i0.wp.com\/ondro.inginea.eu\/wp-content\/uploads\/2015\/10\/01-Diagramy-boundary.jpg?resize=300%2C87&amp;ssl=1 300w, https:\/\/i0.wp.com\/ondro.inginea.eu\/wp-content\/uploads\/2015\/10\/01-Diagramy-boundary.jpg?resize=700%2C204&amp;ssl=1 700w\" sizes=\"(max-width: 640px) 100vw, 640px\" data-recalc-dims=\"1\" \/><\/a><p id=\"caption-attachment-122\" class=\"wp-caption-text\">Diagram 2: Hranice medzi vrstvami v zdrojovom k\u00f3de<\/p><\/div>\n<p><span class=\"lang:java decode:true crayon-inline \">IndexPage.java<\/span> a <span class=\"lang:java decode:true crayon-inline\">UserContext.java<\/span> s\u00fa ve\u013emi podobn\u00e9 v tom, \u017ee s\u00fa to oby\u010dajn\u00e9 Java triedy. Odli\u0161uj\u00fa ich pou\u017eit\u00e9 anot\u00e1cie:<\/p>\n<ul>\n<li><span class=\"lang:java decode:true crayon-inline \">@Named<\/span>\u00a0je jedno z najpou\u017e\u00edvanej\u0161\u00edch ozna\u010den\u00ed pre objekty dostupn\u00e9 v JSF str\u00e1nkach, preto prirodzene ozna\u010duje <span class=\"lang:java decode:true crayon-inline \">IndexPage<\/span>\u00a0 ako hrani\u010dn\u00fd objekt medzi JSF str\u00e1nkou a na\u0161ou prezenta\u010dnou logikou.<\/li>\n<li><span class=\"lang:java decode:true crayon-inline\">@Transactional<\/span> zap\u00edna na objektoch transak\u010dn\u00e9 chovanie vo\u010di extern\u00fdm zdrojom, ktor\u00e9 ho podporuj\u00fa (hlavne vo\u010di datab\u00e1zi) a zabezpe\u010duje tak atomicitu vykon\u00e1vanej oper\u00e1cie. Tak\u00e9to chovanie je ve\u013emi \u010dasto o\u010dak\u00e1van\u00e9 pre business oper\u00e1cie a zaru\u010duje, \u017ee bu\u010f oper\u00e1cia prebehne cel\u00e1 \u00faspe\u0161ne, alebo sa v\u0161etko vr\u00e1ti do stavu pred jej za\u010diatkom. <sup>Anot\u00e1cia @Transactional je dostupn\u00e1 iba v Java EE 7. Ak aplika\u010dn\u00fd server podporuje iba star\u0161iu Java EE 6, je potrebn\u00e9 pou\u017ei\u0165 anot\u00e1cie, ktor\u00e9 ozna\u010duj\u00fa nejak\u00fd typ EJB (napr. @Stateless).<\/sup><\/li>\n<\/ul>\n<p>\u010eal\u0161ie anot\u00e1cie definuj\u00fa, ako bud\u00fa jednotliv\u00e9 in\u0161tancie Java tried vytv\u00e1ran\u00e9 a prepojen\u00e9:<\/p>\n<ul>\n<li>Ozna\u010denie prepojen\u00ed na z\u00e1vislosti:\n<ul>\n<li><span class=\"lang:java decode:true crayon-inline \">@Inject<\/span>\u00a0ozna\u010duje z\u00e1vislos\u0165 objektu na inom objekte. V triede <span class=\"lang:java decode:true crayon-inline \">IndexPage<\/span>\u00a0je takto ozna\u010den\u00e1 objektov\u00e1 premenn\u00e1 (field) <span class=\"lang:java decode:true crayon-inline\">userContext<\/span>, do ktorej sa m\u00e1 vlo\u017ei\u0165 objekt typu <span class=\"lang:java decode:true crayon-inline \">UserContext<\/span>.<\/li>\n<li>Pou\u017eitie premennej v JSF ozna\u010duje z\u00e1vislos\u0165 na pomenovanom objekte v prezenta\u010dnej logike. V <span class=\"lang:java decode:true crayon-inline\">index.xhtml<\/span> je to premenn\u00e1 <span class=\"lang:java decode:true crayon-inline\">indexPage<\/span>, ktor\u00e1 o\u010dak\u00e1va objekty tried pomenovan\u00fdch ako <span class=\"lang:java decode:true crayon-inline\">indexPage<\/span>.<\/li>\n<\/ul>\n<\/li>\n<li>Ozna\u010denie samotn\u00fdch z\u00e1vislost\u00ed, aby boli korektne vytv\u00e1ran\u00e9 a nap\u00e1jan\u00e9 na ostatn\u00e9 objekty:\n<ul>\n<li><span class=\"lang:java decode:true crayon-inline\">@Named<\/span> d\u00e1va textov\u00fd n\u00e1zov danej triede \u2013 JSF pod\u013ea neho vyh\u013ead\u00e1 objekt, ktor\u00fd vlo\u017e\u00ed do premennej s rovnak\u00fdm n\u00e1zvom. Takto je pomenovan\u00e1 trieda <span class=\"lang:java decode:true crayon-inline\">IndexPage<\/span> \u2013 jej meno je odvoden\u00e9 z n\u00e1zvu triedy (za\u010d\u00edna v\u0161ak mal\u00fdm p\u00edsmenom). N\u00e1zov m\u00f4\u017eeme explicitne uvies\u0165 priamo v anot\u00e1cii <span class=\"lang:java decode:true crayon-inline\">@Named<\/span>.<\/li>\n<li><span class=\"lang:java decode:true crayon-inline\">@RequestScoped<\/span>, <span class=\"lang:java decode:true crayon-inline\">@Dependent<\/span> a podobn\u00e9 anot\u00e1cie ozna\u010duj\u00fa, \u017ee objekty z danej triedy je mo\u017en\u00e9 pou\u017ei\u0165 ako z\u00e1vislos\u0165 pre in\u00e9 objekty. Tieto anot\u00e1cie z\u00e1rove\u0148 ozna\u010duj\u00fa <strong>scope<\/strong> &#8211; rozsah d\u013a\u017eky \u017eivota jednej in\u0161tancie. Objekt typu <span class=\"lang:java decode:true crayon-inline\">IndexPage<\/span>, ktor\u00fd je ozna\u010den\u00fd ako <span class=\"lang:java decode:true crayon-inline\">@RequestScoped<\/span>, bude vytv\u00e1ran\u00fd v\u017edy jeden pre odbavenie cel\u00e9ho po\u017eiadavku (<strong>request<\/strong>). Objekt typu <span class=\"lang:java decode:true crayon-inline\">UserContext<\/span>, ktor\u00fd je ozna\u010den\u00fd ako <span class=\"lang:java decode:true crayon-inline\">@Dependent<\/span>, bude vyv\u00e1ran\u00fd v\u017edy znova pri ka\u017edom vlo\u017een\u00ed do in\u00e9ho objektu alebo premennej.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>V na\u0161om jednoduchom pr\u00edpade nie je d\u00f4le\u017eit\u00e9, ak\u00e9 rozsahy (scope) s\u00fa zvolen\u00e9, preto\u017ee zatia\u013e sa v\u0161etky objekty chovaj\u00fa kon\u0161tantne \u2013 oba vr\u00e1tia pri volan\u00ed met\u00f3dy t\u00fa ist\u00fa hodnotu. Nie je teda rozdiel, \u010di je volan\u00fd objekt v\u017edy jeden, alebo vol\u00e1me viackr\u00e1t in\u00fd objekt. Odli\u0161nosti medzi r\u00f4znymi scope preberieme nesk\u00f4r, ke\u010f bud\u00fa ma\u0165 vplyv na logiku aplik\u00e1cie a budeme potrebova\u0165 medzi nimi rozli\u0161ova\u0165.<\/p>\n<h2>\u0160trukt\u00farovanie logick\u00fdch blokov<\/h2>\n<p>\u010ci u\u017e ide o prezenta\u010dn\u00fa logiku, alebo business logiku, kv\u00f4li preh\u013eadnosti je vhodn\u00e9 odde\u013eova\u0165 jej k\u00f3d do blokov pod\u013ea dom\u00e9ny, ktorej sa t\u00fdkaj\u00fa. Dom\u00e9na obsahuje logiku a zdrojov\u00e9 s\u00fabory, ktor\u00e9 spolu \u00fazko s\u00favisia \u2013 napr. dom\u00e9na pre prihl\u00e1sen\u00e9ho u\u017e\u00edvate\u013ea obsahuje k\u00f3d prihlasovacieho formul\u00e1ra, prihl\u00e1senia u\u017e\u00edvate\u013ea a zobrazenie prihl\u00e1sen\u00e9ho u\u017e\u00edvate\u013ea na str\u00e1nkach. Na backend logike potom existuje dom\u00e9na pre overenie prihlasovac\u00edch \u00fadajov, na\u010d\u00edtanie d\u00e1t o u\u017e\u00edvate\u013eovi z datab\u00e1ze a zistenie, ktor\u00fd u\u017e\u00edvate\u013e je pr\u00e1ve prihl\u00e1sen\u00fd. Zdrojov\u00e9 s\u00fabory ka\u017edej dom\u00e9ny oby\u010dajne d\u00e1vame do oddelen\u00fdch Java bal\u00ed\u010dkov (adres\u00e1rov).<\/p>\n<p>Samotn\u00e9 dom\u00e9ny obsahuj\u00fa jednu alebo viac logick\u00fdch \u010dast\u00ed:<\/p>\n<ul>\n<li><b>boundary<\/b> \u2013 s\u00fa\u010dasti dom\u00e9ny, ktor\u00e9 s\u00fa pou\u017e\u00edvan\u00e9 z in\u00fdch dom\u00e9n alebo vrstiev aplik\u00e1cie. Obsahuj\u00fa hrani\u010dn\u00e9 objekty, interface, anot\u00e1cie \u2013 v\u0161etky akt\u00edvne prvky a ich pomocn\u00e9 s\u00fa\u010dasti, ktor\u00e9 chceme spr\u00edstupni\u0165 navonok<\/li>\n<li><b>model<\/b> \u2013 d\u00e1tov\u00fd model dom\u00e9ny, ktor\u00fd obsahuje zvy\u010dajne uchov\u00e1van\u00fd (perzistentn\u00fd) stav objektov v dom\u00e9ne. Naj\u010dastej\u0161ie s\u00fa to JPA entity, ktor\u00e9 s\u00fa ukladan\u00e9 a na\u010d\u00edtan\u00e9 z datab\u00e1ze. Ale m\u00f4\u017eu to by\u0165 aj in\u00e9 typy objektov, ktor\u00e9 je mo\u017en\u00e9 nejak externalizova\u0165 a ulo\u017ei\u0165\/na\u010d\u00edta\u0165, v pr\u00edpade prezenta\u010dnej vrstvy je to model pre grafick\u00e9 komponenty.<\/li>\n<li><b>control \u2013 <\/b>ostatn\u00e9 \u010dasti dom\u00e9ny, ktor\u00e9 nezapadaj\u00fa ani do boundary ani do model. Nie s\u00fa s\u00fa\u010das\u0165ou d\u00e1tov\u00e9ho modelu. ani sa \u201enezmestia\u201c do hrani\u010dn\u00fdch objektov v boundary. Sem umiest\u0148ujeme vn\u00fatorn\u00fa logiku dom\u00e9ny, ktor\u00e1 s\u00favis\u00ed s d\u00e1tov\u00fdmi konverziami, znovu\u2011pou\u017eite\u013en\u00fdmi v\u00fdpo\u010dtami, alebo napr\u00edklad aj s reportami, \u010di konektormi na extern\u00e9 syst\u00e9my.<\/li>\n<\/ul>\n<p>Dom\u00e9na by ur\u010dite mala ma\u0165 \u010das\u0165 <b>boundary, <\/b>ktor\u00e1 definuje pou\u017eitie dom\u00e9ny mimo tejto dom\u00e9ny. Vo v\u00e4\u010d\u0161ine pr\u00edpadov budeme potrebova\u0165 aj d\u00e1tov\u00fd model, a teda \u010das\u0165 <b>model. <\/b>Ak sa dom\u00e9na rozrastie, ostatn\u00e1 logika bude v \u010dasti <b>control. <\/b>Toto rozdelenie je v s\u00falade so <a href=\"http:\/\/www.cs.sjsu.edu\/~pearce\/modules\/patterns\/enterprise\/ecb\/ecb.htm\">ECB<\/a> vzorom, v ktorom sa namiesto term\u00ednu <strong>model <\/strong>pou\u017e\u00edva aj term\u00edn <strong>entity<\/strong>, ako to definoval <a href=\"https:\/\/www.amazon.com\/Object-Oriented-Software-Engineering-Approach\/dp\/0201544350\">Ivar Jacobson.<\/a> ECB \u0161trukt\u00faru dom\u00e9n odpor\u00fa\u010da aj Adam Bien <a href=\"http:\/\/www.adam-bien.com\/roller\/abien\/entry\/bureaucratic_design_with_java_ee\">na jeho blogu a knih\u00e1ch o Java EE vzoroch<\/a>. <b><br \/>\n<\/b><\/p>\n<p>Mohlo by sa zda\u0165, \u017ee 3 \u010dasti na postihnutie v\u0161etk\u00fdch pr\u00edpadov nesta\u010dia, a \u017ee sa \u010das\u0165 <strong>control<\/strong> mus\u00ed v\u017edy sk\u00f4r \u010di nesk\u00f4r ne\u00famerne rozr\u00e1s\u0165. V\u00e4\u010d\u0161ina aplika\u010dnej logiky je v\u0161ak \u010dasto tak jednoduch\u00e1, \u017ee dokonca pre \u0148u sta\u010dia iba \u010dasti <b>boundary<\/b> a <b>model. <\/b>A to hlavne vtedy, ke\u010f je treba iba d\u00e1ta z datab\u00e1ze prenies\u0165 do prezenta\u010dnej vrstvy a zobrazi\u0165 v aplik\u00e1cii. V\u0161etka potrebn\u00e1 logika je tak zvy\u010dajne obsiahnut\u00e1 v jednoduch\u00fdch met\u00f3dach objektov v boundary, pr\u00edpadne je pou\u017eit\u00e1 funkcionalita z in\u00fdch dom\u00e9n.<\/p>\n<p>V menej \u010dast\u00fdch pr\u00edpadoch, ke\u010f sa logika rozrast\u00e1, by sme mali zv\u00e1\u017ei\u0165, \u017ee dom\u00e9nu rozdel\u00edme na men\u0161ie dom\u00e9ny, ktor\u00e9 m\u00f4\u017eeme u\u017e bez probl\u00e9mov deli\u0165 na boundary, model a control. Ak to z r\u00f4znych d\u00f4vodov ned\u00e1va zmysel, m\u00f4\u017eeme \u010falej \u0161trukt\u00farova\u0165 \u010das\u0165 <b>control<\/b> tak, \u017ee jej k\u00f3d \u010falej \u010dlen\u00edme do podbal\u00ed\u010dkov, ako napr. control.converters, control.persistence, control.processing, control.reports, control.configuration. Tak\u00fdmto sp\u00f4sobom je st\u00e1le dobre \u010ditate\u013en\u00e9, kde s\u00fa hranice dom\u00e9ny a kde je d\u00e1tov\u00fd model. Samotn\u00e1 vn\u00fatorn\u00e1 logika komponenty, ide\u00e1lne \u201enevidite\u013en\u00e1\u201c mimo dom\u00e9ny, je oddelen\u00e1, ale pod drobnoh\u013eadom st\u00e1le dobre organizovan\u00e1.<\/p>\n<h2>V\u00fdsledn\u00e1 \u0161trukt\u00fara aplik\u00e1cie<\/h2>\n<p>Ak uplatn\u00edme pop\u00edsan\u00e9 postupy, je \u0161trukt\u00fara aplik\u00e1cie \u010ditate\u013en\u00e1 pri letmom poh\u013eade na zdrojov\u00fd k\u00f3d a \u013eahko sa v nej orientuje. Dve odli\u0161n\u00e9 logiky frontendu a backendu s\u00fa oddelen\u00e9, \u010do n\u00e1m umo\u017e\u0148uje izolova\u0165 od seba dva ve\u013ek\u00e9 celky, a pr\u00edpadne napoji\u0165 na backend in\u00e9 prezenta\u010dn\u00e9 rozhranie. Pre niektor\u00e9 typy projektov a t\u00fdmy, ktor\u00e9 na nich pracuj\u00fa, je takto mo\u017en\u00e9 aj rozdeli\u0165 \u00falohy tak, aby sa na frontend a backend logike dalo pracova\u0165 s\u00fa\u010dasne bez ve\u013ek\u00fdch kol\u00edzi\u00ed medzi \u010dlenmi t\u00fdmu.<\/p>\n<p>Hranice jednotliv\u00fdch logick\u00fdch vrstiev m\u00f4\u017eeme jednoducho definova\u0165 pomocou Java EE anot\u00e1ci\u00ed. Hranica medzi JSF komponentami a logikou je napr. definovan\u00e1 anot\u00e1ciou <span class=\"lang:java decode:true crayon-inline\">@Named<\/span>, hranica medzi frontend a backend logikou je definovan\u00e1 hlavne transak\u010dn\u00fdmi anot\u00e1ciami, ako s\u00fa <span class=\"lang:java decode:true crayon-inline\">@Transctional<\/span>, alebo EJB anot\u00e1cie (napr. <span class=\"lang:java decode:true crayon-inline\">@Stateless<\/span>).<\/p>\n<p>Nasleduj\u00faci diagram zachycuje tradi\u010dn\u00fa 2-vrstvov\u00fa architekt\u00faru (respekt\u00edve 3-vrstvov\u00fa, kde tre\u0165ou vrstvou je datab\u00e1za napojen\u00e1 na entity manager \u010di data-access objekty):<\/p>\n<div id=\"attachment_131\" style=\"width: 650px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/i0.wp.com\/itblog.inginea.eu\/wp-content\/uploads\/2015\/10\/\u0160trukt\u00fara-Java-EE-aplik\u00e1cie.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-131\" data-attachment-id=\"131\" data-permalink=\"https:\/\/ondro.inginea.eu\/index.php\/language\/sk\/test\/struktura-java-ee-aplikacie\/\" data-orig-file=\"https:\/\/i0.wp.com\/ondro.inginea.eu\/wp-content\/uploads\/2015\/10\/\u0160trukt\u00fara-Java-EE-aplik\u00e1cie.png?fit=929%2C1119&amp;ssl=1\" data-orig-size=\"929,1119\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"\u0160trukt\u00fara Java EE aplik\u00e1cie\" data-image-description=\"&lt;p&gt;Preh\u013ead z\u00e1kladnej \u0161trukt\u00fary k\u00f3du Java EE aplik\u00e1cie&lt;\/p&gt;\n\" data-image-caption=\"\" data-medium-file=\"https:\/\/i0.wp.com\/ondro.inginea.eu\/wp-content\/uploads\/2015\/10\/\u0160trukt\u00fara-Java-EE-aplik\u00e1cie.png?fit=249%2C300&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/ondro.inginea.eu\/wp-content\/uploads\/2015\/10\/\u0160trukt\u00fara-Java-EE-aplik\u00e1cie.png?fit=640%2C771&amp;ssl=1\" class=\"wp-image-131 size-large\" src=\"https:\/\/i0.wp.com\/itblog.inginea.eu\/wp-content\/uploads\/2015\/10\/\u0160trukt\u00fara-Java-EE-aplik\u00e1cie-850x1024.png?resize=640%2C771\" alt=\"\u0160trukt\u00fara Java EE aplik\u00e1cie\" width=\"640\" height=\"771\" srcset=\"https:\/\/i0.wp.com\/ondro.inginea.eu\/wp-content\/uploads\/2015\/10\/\u0160trukt\u00fara-Java-EE-aplik\u00e1cie.png?resize=850%2C1024&amp;ssl=1 850w, https:\/\/i0.wp.com\/ondro.inginea.eu\/wp-content\/uploads\/2015\/10\/\u0160trukt\u00fara-Java-EE-aplik\u00e1cie.png?resize=249%2C300&amp;ssl=1 249w, https:\/\/i0.wp.com\/ondro.inginea.eu\/wp-content\/uploads\/2015\/10\/\u0160trukt\u00fara-Java-EE-aplik\u00e1cie.png?resize=700%2C843&amp;ssl=1 700w, https:\/\/i0.wp.com\/ondro.inginea.eu\/wp-content\/uploads\/2015\/10\/\u0160trukt\u00fara-Java-EE-aplik\u00e1cie.png?w=929&amp;ssl=1 929w\" sizes=\"(max-width: 640px) 100vw, 640px\" data-recalc-dims=\"1\" \/><\/a><p id=\"caption-attachment-131\" class=\"wp-caption-text\">Diagram 3: Preh\u013ead z\u00e1kladnej \u0161trukt\u00fary k\u00f3du Java EE aplik\u00e1cie<\/p><\/div>\n<p>Ako aplik\u00e1cia narast\u00e1, oba ve\u013ek\u00e9 bloky frontendu a backendu m\u00f4\u017eeme \u010falej \u0161trukt\u00farova\u0165 do men\u0161\u00edch dom\u00e9n, pod\u013ea funkcionality, ktorej sa logika t\u00fdka. Tieto dom\u00e9ny maj\u00fa v\u017edy obsahuj\u00fa \u010das\u0165 <em>boundary<\/em>, ostatn\u00e9 \u010dasti <em>model<\/em> a <em>control<\/em> pod\u013ea potreby a ve\u013ekosti dom\u00e9ny. Takto m\u00f4\u017eeme postupova\u0165 aj pre men\u0161ie komponenty v dom\u00e9nach. Pre typick\u00fa aplik\u00e1ciu na spr\u00e1vu z\u00e1kazn\u00edkov tak m\u00f4\u017eeme backend rozdeli\u0165 napr\u00edklad na dom\u00e9ny Z\u00e1kazn\u00edci, Zmluvy, Projekty, Kontakty, ktor\u00e9 bud\u00fa \u010falej \u010dlenen\u00e9 pod\u013ea vzoru <em>boundary<\/em>, <em>control<\/em>, <em>model<\/em>. M\u00f4\u017eeme tieto dom\u00e9ny e\u0161te \u010falej roz\u010dleni\u0165 na komponenty, napr\u00edklad dom\u00e9nu Z\u00e1kazn\u00edci \u010falej na komponenty Spr\u00e1va z\u00e1kazn\u00edkov a Komunik\u00e1cia, v ktor\u00fdch uplatn\u00edme rovnak\u00fa sch\u00e9mu na \u010dlenenie k\u00f3du.<\/p>\n<h2>Referencie<\/h2>\n<ul>\n<li>kniha od Ivara Jacobsona: <a href=\"https:\/\/www.amazon.com\/Object-Oriented-Software-Engineering-Approach\/dp\/0201544350\">Object Oriented Software Engineering: A Use Case Driven Approach<\/a><\/li>\n<li>video blog Adama Biena: <a href=\"http:\/\/www.adam-bien.com\/roller\/abien\/entry\/bureaucratic_design_with_java_ee\">Bureaucratic Design With Java EE<\/a><\/li>\n<li>projekt <a href=\"http:\/\/www.adam-bien.com\/roller\/abien\/entry\/bureaucratic_design_with_java_ee\">Lightfish<\/a>, ktor\u00fd pou\u017e\u00edva roz\u010dlenenie pod\u013ea vzoru ECB (miesto term\u00ednu <em>model<\/em> je pou\u017eit\u00fd term\u00edn <em>entity<\/em>)<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Java EE framework sa v posledn\u00fdch rokoch vo verzii Java EE 6 a Java EE 7 zjednodu\u0161il nato\u013eko, \u017ee je mo\u017en\u00e9 vytv\u00e1ra\u0165 Java EE aplik\u00e1cie s jednoduchou \u0161trukt\u00farou, ktor\u00e9 obsahuj\u00fa ve\u013ek\u00fd podiel aplika\u010dnej logiky a mal\u00fd podiel spojovacieho k\u00f3du. Na vystavanie aplik\u00e1cie n\u00e1m \u010dasto sta\u010dia oby\u010dajn\u00e9 Java objekty obohaten\u00e9 o anot\u00e1cie, ktor\u00e9 definuj\u00fa \u010dasto sa [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","footnotes":"","jetpack_publicize_message":"","jetpack_is_tweetstorm":false,"jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","enabled":false}}},"categories":[62],"tags":[58,50,56,52,54],"series":[],"class_list":["post-78","post","type-post","status-publish","format-standard","hentry","category-java-ee-navody","tag-java-sk","tag-javaee","tag-navod","tag-struktura","tag-tutorial"],"jetpack_publicize_connections":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v20.9 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>\u0160trukt\u00fara modernej Java EE aplik\u00e1cie - .Lost in Coding<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/ondro.inginea.eu\/index.php\/language\/sk\/test\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u0160trukt\u00fara modernej Java EE aplik\u00e1cie - .Lost in Coding\" \/>\n<meta property=\"og:description\" content=\"Java EE framework sa v posledn\u00fdch rokoch vo verzii Java EE 6 a Java EE 7 zjednodu\u0161il nato\u013eko, \u017ee je mo\u017en\u00e9 vytv\u00e1ra\u0165 Java EE aplik\u00e1cie s jednoduchou \u0161trukt\u00farou, ktor\u00e9 obsahuj\u00fa ve\u013ek\u00fd podiel aplika\u010dnej logiky a mal\u00fd podiel spojovacieho k\u00f3du. Na vystavanie aplik\u00e1cie n\u00e1m \u010dasto sta\u010dia oby\u010dajn\u00e9 Java objekty obohaten\u00e9 o anot\u00e1cie, ktor\u00e9 definuj\u00fa \u010dasto sa [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/ondro.inginea.eu\/index.php\/language\/sk\/test\/\" \/>\n<meta property=\"og:site_name\" content=\".Lost in Coding\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/ondrej.mihalyi\" \/>\n<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/ondrej.mihalyi\" \/>\n<meta property=\"article:published_time\" content=\"2015-10-04T17:05:58+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2016-12-17T21:53:26+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/itblog.inginea.eu\/wp-content\/uploads\/2015\/10\/01-Diagramy-FE-BE-e1443906220240.jpg\" \/>\n<meta name=\"author\" content=\"Ondro Mih\u00e1lyi\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@https:\/\/twitter.com\/OndroMih\" \/>\n<meta name=\"twitter:site\" content=\"@OndroMih\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Ondro Mih\u00e1lyi\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"11 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/ondro.inginea.eu\/index.php\/language\/sk\/test\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/ondro.inginea.eu\/index.php\/language\/sk\/test\/\"},\"author\":{\"name\":\"Ondro Mih\u00e1lyi\",\"@id\":\"https:\/\/ondro.inginea.eu\/#\/schema\/person\/07ac1158ec74720744f7146572215616\"},\"headline\":\"\u0160trukt\u00fara modernej Java EE aplik\u00e1cie\",\"datePublished\":\"2015-10-04T17:05:58+00:00\",\"dateModified\":\"2016-12-17T21:53:26+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/ondro.inginea.eu\/index.php\/language\/sk\/test\/\"},\"wordCount\":2100,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/ondro.inginea.eu\/#\/schema\/person\/07ac1158ec74720744f7146572215616\"},\"keywords\":[\"Java\",\"javaee\",\"n\u00e1vod\",\"\u0161trukt\u00fara\",\"tutorial\"],\"articleSection\":[\"Java EE n\u00e1vody\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/ondro.inginea.eu\/index.php\/language\/sk\/test\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/ondro.inginea.eu\/index.php\/language\/sk\/test\/\",\"url\":\"https:\/\/ondro.inginea.eu\/index.php\/language\/sk\/test\/\",\"name\":\"\u0160trukt\u00fara modernej Java EE aplik\u00e1cie - .Lost in Coding\",\"isPartOf\":{\"@id\":\"https:\/\/ondro.inginea.eu\/#website\"},\"datePublished\":\"2015-10-04T17:05:58+00:00\",\"dateModified\":\"2016-12-17T21:53:26+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/ondro.inginea.eu\/index.php\/language\/sk\/test\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/ondro.inginea.eu\/index.php\/language\/sk\/test\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/ondro.inginea.eu\/index.php\/language\/sk\/test\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/ondro.inginea.eu\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u0160trukt\u00fara modernej Java EE aplik\u00e1cie\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/ondro.inginea.eu\/#website\",\"url\":\"https:\/\/ondro.inginea.eu\/\",\"name\":\".Lost in Coding\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/ondro.inginea.eu\/#\/schema\/person\/07ac1158ec74720744f7146572215616\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/ondro.inginea.eu\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/ondro.inginea.eu\/#\/schema\/person\/07ac1158ec74720744f7146572215616\",\"name\":\"Ondro Mih\u00e1lyi\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/ondro.inginea.eu\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/i2.wp.com\/ondro.inginea.eu\/wp-content\/uploads\/2017\/08\/fotoOMsquare3x300.jpg?fit=300%2C300&ssl=1\",\"contentUrl\":\"https:\/\/i2.wp.com\/ondro.inginea.eu\/wp-content\/uploads\/2017\/08\/fotoOMsquare3x300.jpg?fit=300%2C300&ssl=1\",\"width\":300,\"height\":300,\"caption\":\"Ondro Mih\u00e1lyi\"},\"logo\":{\"@id\":\"https:\/\/ondro.inginea.eu\/#\/schema\/person\/image\/\"},\"description\":\"Ondro is a software developer and consultant specializing in combining standard and proven tools to solve new and challenging problems. He's been developing in Java for over 10 years. He\u2019s worked for clients like Payara, LottoLand, Uniqa and others. He has co-founded OmniFish, where he works as a director and Jakarta EE expert. He\u2019s passionate about helping his clients and the wider Java community with their projects based on Jakarta EE and similar technologies. As an experienced Java developer and instructor, he's helped companies build and educate their development teams and improve their development processes. He's a core member of several opensource projects and Jakarta EE specification projects. He\u2019s a frequent conference speaker, leader of the Czech JUG and a Java Champion. Ondro is a regular conference speaker at international conferences. Since 2016, he's presented at the following conferences: \u2022 FOSDEM, Brussels, Belgium 2023) \u2022 JChampionsConf, Online (year 2023) \u2022 EclipseCon, Germany (year 2022) \u2022 GeeCon, Prague, Czechia (years 2016, 2019, 2022) \u2022 JavaLand, Bruehl, Germany (years 2018, 2021) \u2022 JFokus, Stockholm, Sweden (year 2019) \u2022 Devops Con, Munich, Germany (year 2019) \u2022 Oracle CodeOne, San Francisco, USA (years 2018, 2019) \u2022 Devoxx, Antwerp, Belgium (year 2018) \u2022 JPrime, Sofia, Bulgaria (years 2017, 2018) \u2022 Java2Days, Sofia, Bulgaria (years 2016, 2018) \u2022 EclipseCon, France (year 2018) \u2022 JavaOne, San Francisco, USA (years 2016, 2017) \u2022 Oracle Code, Prague, Czechia (year 2017) \u2022 Devoxx, London, UK (year 2017) \u2022 GeeCon, Krakow, Poland (year 2017) \u2022 W-JAX, Munich, Germany (years 2016, 2017) \u2022 Bed-Con, Berlin, Germany (year 2017) \u2022 Oredev, Malmo, Sweden (year 2017) \u2022 Devoxx, Casablanca, Morocco (year 2017) \u2022 Java Developer Days, Krakow, Poland (year 2016)\",\"sameAs\":[\"https:\/\/www.facebook.com\/ondrej.mihalyi\",\"https:\/\/cz.linkedin.com\/in\/mihalyiondrej\",\"https:\/\/twitter.com\/https:\/\/twitter.com\/OndroMih\"],\"url\":\"https:\/\/ondro.inginea.eu\/index.php\/author\/ondrejm\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"\u0160trukt\u00fara modernej Java EE aplik\u00e1cie - .Lost in Coding","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/ondro.inginea.eu\/index.php\/language\/sk\/test\/","og_locale":"en_US","og_type":"article","og_title":"\u0160trukt\u00fara modernej Java EE aplik\u00e1cie - .Lost in Coding","og_description":"Java EE framework sa v posledn\u00fdch rokoch vo verzii Java EE 6 a Java EE 7 zjednodu\u0161il nato\u013eko, \u017ee je mo\u017en\u00e9 vytv\u00e1ra\u0165 Java EE aplik\u00e1cie s jednoduchou \u0161trukt\u00farou, ktor\u00e9 obsahuj\u00fa ve\u013ek\u00fd podiel aplika\u010dnej logiky a mal\u00fd podiel spojovacieho k\u00f3du. Na vystavanie aplik\u00e1cie n\u00e1m \u010dasto sta\u010dia oby\u010dajn\u00e9 Java objekty obohaten\u00e9 o anot\u00e1cie, ktor\u00e9 definuj\u00fa \u010dasto sa [&hellip;]","og_url":"https:\/\/ondro.inginea.eu\/index.php\/language\/sk\/test\/","og_site_name":".Lost in Coding","article_publisher":"https:\/\/www.facebook.com\/ondrej.mihalyi","article_author":"https:\/\/www.facebook.com\/ondrej.mihalyi","article_published_time":"2015-10-04T17:05:58+00:00","article_modified_time":"2016-12-17T21:53:26+00:00","og_image":[{"url":"http:\/\/itblog.inginea.eu\/wp-content\/uploads\/2015\/10\/01-Diagramy-FE-BE-e1443906220240.jpg"}],"author":"Ondro Mih\u00e1lyi","twitter_card":"summary_large_image","twitter_creator":"@https:\/\/twitter.com\/OndroMih","twitter_site":"@OndroMih","twitter_misc":{"Written by":"Ondro Mih\u00e1lyi","Est. reading time":"11 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/ondro.inginea.eu\/index.php\/language\/sk\/test\/#article","isPartOf":{"@id":"https:\/\/ondro.inginea.eu\/index.php\/language\/sk\/test\/"},"author":{"name":"Ondro Mih\u00e1lyi","@id":"https:\/\/ondro.inginea.eu\/#\/schema\/person\/07ac1158ec74720744f7146572215616"},"headline":"\u0160trukt\u00fara modernej Java EE aplik\u00e1cie","datePublished":"2015-10-04T17:05:58+00:00","dateModified":"2016-12-17T21:53:26+00:00","mainEntityOfPage":{"@id":"https:\/\/ondro.inginea.eu\/index.php\/language\/sk\/test\/"},"wordCount":2100,"commentCount":0,"publisher":{"@id":"https:\/\/ondro.inginea.eu\/#\/schema\/person\/07ac1158ec74720744f7146572215616"},"keywords":["Java","javaee","n\u00e1vod","\u0161trukt\u00fara","tutorial"],"articleSection":["Java EE n\u00e1vody"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/ondro.inginea.eu\/index.php\/language\/sk\/test\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/ondro.inginea.eu\/index.php\/language\/sk\/test\/","url":"https:\/\/ondro.inginea.eu\/index.php\/language\/sk\/test\/","name":"\u0160trukt\u00fara modernej Java EE aplik\u00e1cie - .Lost in Coding","isPartOf":{"@id":"https:\/\/ondro.inginea.eu\/#website"},"datePublished":"2015-10-04T17:05:58+00:00","dateModified":"2016-12-17T21:53:26+00:00","breadcrumb":{"@id":"https:\/\/ondro.inginea.eu\/index.php\/language\/sk\/test\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/ondro.inginea.eu\/index.php\/language\/sk\/test\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/ondro.inginea.eu\/index.php\/language\/sk\/test\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/ondro.inginea.eu\/"},{"@type":"ListItem","position":2,"name":"\u0160trukt\u00fara modernej Java EE aplik\u00e1cie"}]},{"@type":"WebSite","@id":"https:\/\/ondro.inginea.eu\/#website","url":"https:\/\/ondro.inginea.eu\/","name":".Lost in Coding","description":"","publisher":{"@id":"https:\/\/ondro.inginea.eu\/#\/schema\/person\/07ac1158ec74720744f7146572215616"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/ondro.inginea.eu\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/ondro.inginea.eu\/#\/schema\/person\/07ac1158ec74720744f7146572215616","name":"Ondro Mih\u00e1lyi","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/ondro.inginea.eu\/#\/schema\/person\/image\/","url":"https:\/\/i2.wp.com\/ondro.inginea.eu\/wp-content\/uploads\/2017\/08\/fotoOMsquare3x300.jpg?fit=300%2C300&ssl=1","contentUrl":"https:\/\/i2.wp.com\/ondro.inginea.eu\/wp-content\/uploads\/2017\/08\/fotoOMsquare3x300.jpg?fit=300%2C300&ssl=1","width":300,"height":300,"caption":"Ondro Mih\u00e1lyi"},"logo":{"@id":"https:\/\/ondro.inginea.eu\/#\/schema\/person\/image\/"},"description":"Ondro is a software developer and consultant specializing in combining standard and proven tools to solve new and challenging problems. He's been developing in Java for over 10 years. He\u2019s worked for clients like Payara, LottoLand, Uniqa and others. He has co-founded OmniFish, where he works as a director and Jakarta EE expert. He\u2019s passionate about helping his clients and the wider Java community with their projects based on Jakarta EE and similar technologies. As an experienced Java developer and instructor, he's helped companies build and educate their development teams and improve their development processes. He's a core member of several opensource projects and Jakarta EE specification projects. He\u2019s a frequent conference speaker, leader of the Czech JUG and a Java Champion. Ondro is a regular conference speaker at international conferences. Since 2016, he's presented at the following conferences: \u2022 FOSDEM, Brussels, Belgium 2023) \u2022 JChampionsConf, Online (year 2023) \u2022 EclipseCon, Germany (year 2022) \u2022 GeeCon, Prague, Czechia (years 2016, 2019, 2022) \u2022 JavaLand, Bruehl, Germany (years 2018, 2021) \u2022 JFokus, Stockholm, Sweden (year 2019) \u2022 Devops Con, Munich, Germany (year 2019) \u2022 Oracle CodeOne, San Francisco, USA (years 2018, 2019) \u2022 Devoxx, Antwerp, Belgium (year 2018) \u2022 JPrime, Sofia, Bulgaria (years 2017, 2018) \u2022 Java2Days, Sofia, Bulgaria (years 2016, 2018) \u2022 EclipseCon, France (year 2018) \u2022 JavaOne, San Francisco, USA (years 2016, 2017) \u2022 Oracle Code, Prague, Czechia (year 2017) \u2022 Devoxx, London, UK (year 2017) \u2022 GeeCon, Krakow, Poland (year 2017) \u2022 W-JAX, Munich, Germany (years 2016, 2017) \u2022 Bed-Con, Berlin, Germany (year 2017) \u2022 Oredev, Malmo, Sweden (year 2017) \u2022 Devoxx, Casablanca, Morocco (year 2017) \u2022 Java Developer Days, Krakow, Poland (year 2016)","sameAs":["https:\/\/www.facebook.com\/ondrej.mihalyi","https:\/\/cz.linkedin.com\/in\/mihalyiondrej","https:\/\/twitter.com\/https:\/\/twitter.com\/OndroMih"],"url":"https:\/\/ondro.inginea.eu\/index.php\/author\/ondrejm\/"}]}},"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/s6wlb6-test","jetpack-related-posts":[{"id":386,"url":"https:\/\/ondro.inginea.eu\/index.php\/language\/sk\/moje-nedavne-prednasky-na-jug-v-prahe\/","url_meta":{"origin":78,"position":0},"title":"Moje ned\u00e1vne predn\u00e1\u0161ky na JUG v Prahe","author":"Ondro Mih\u00e1lyi","date":"1 July, 2016","format":false,"excerpt":"V j\u00fani som urobil predn\u00e1\u0161ku na stretnut\u00ed pou\u017e\u00edvate\u013eov Javy (Java User Group) v Prahe. Bolo to prv\u00fdkr\u00e1t, \u010do som verejne prezentoval svoju predn\u00e1\u0161ku o vytv\u00e1ran\u00ed reakt\u00edvnych aplik\u00e1ci\u00ed pomocou Java EE. A k tomu ako bonus som e\u0161te predstavil\u00a0projekt Payara a ako s\u00favis\u00ed so n\u00e1mej\u0161\u00edm projektom GlassFish. Na to, \u017ee som\u2026","rel":"","context":"In &quot;Udalosti&quot;","block_context":{"text":"Udalosti","link":"https:\/\/ondro.inginea.eu\/index.php\/language\/sk\/category\/udalosti\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/img.youtube.com\/vi\/ZdhGuoTYOIE\/0.jpg?resize=350%2C200","width":350,"height":200},"classes":[]}],"_links":{"self":[{"href":"https:\/\/ondro.inginea.eu\/index.php\/wp-json\/wp\/v2\/posts\/78"}],"collection":[{"href":"https:\/\/ondro.inginea.eu\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/ondro.inginea.eu\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/ondro.inginea.eu\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/ondro.inginea.eu\/index.php\/wp-json\/wp\/v2\/comments?post=78"}],"version-history":[{"count":33,"href":"https:\/\/ondro.inginea.eu\/index.php\/wp-json\/wp\/v2\/posts\/78\/revisions"}],"predecessor-version":[{"id":458,"href":"https:\/\/ondro.inginea.eu\/index.php\/wp-json\/wp\/v2\/posts\/78\/revisions\/458"}],"wp:attachment":[{"href":"https:\/\/ondro.inginea.eu\/index.php\/wp-json\/wp\/v2\/media?parent=78"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ondro.inginea.eu\/index.php\/wp-json\/wp\/v2\/categories?post=78"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ondro.inginea.eu\/index.php\/wp-json\/wp\/v2\/tags?post=78"},{"taxonomy":"series","embeddable":true,"href":"https:\/\/ondro.inginea.eu\/index.php\/wp-json\/wp\/v2\/series?post=78"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}