<h2>Java Servlets - interakcia a zdie╛anie objektov a zdrojov</h2>
<p id='prepend'>Vo vΣΦÜine prφkladov, ktorΘ nßjdete na webe, sa pou₧φvaj· samostatnΘ servlety, respektφve JSP. Aj v naÜom serißly o servletoch sme Φasto vyu₧φvali stand-alone servlety. V skutoΦnom svete vÜak servlety nem⌠₧u by¥ iba samostatnΘ programy, mali by vytvßra¥ prepojenΘ skupiny, ktorΘ s· iba Φas¥ou webovskej aplikßcie. Komponenty takejto aplikßcie potom m⌠₧u tvori¥ skupiny servletov, zdie╛anΘ objekty, HTML, JSP strßnky a podobne.</p>
<p>Z toho samozrejme vypl²va, ₧e prvky aplikßcie (konkrΘtne servlety) potrebuj· nejak² systΘm a prostriedky na vzßjomn· komunikßciu a interakciu bu∩ navzßjom medzi sebou alebo s ostatn²mi zdrojmi web aplikßcie. T²mto prostriedkom je Φasto <em>ServletContext</em> object.</p>
<p>V nasleduj·cich riadkoch sa budeme zaobera¥ viacer²mi technikami vzßjomnej komunikßcie a interakcie medzi servletmi, respektφve medzi servletmi a in²mi zdrojmi. Budeme si hovori¥ o t²chto typoch technφk:</p>
<div class='list'>
<ol>
<li><strong>Servlet collaboration</strong> - s· dve zßkladnΘ techniky vzßjomnej spoluprßce, a to servlet filtering a servlet chaining. V tomto prφpade viacero servletov spolupracuje na vytvßranφ vlastnej odpovede klientovi. V skutoΦnosti vÜak servlety nespolupracuj· priamo, ale za ich prepojenie je zodpovedn² servlet kontajner. O jednej z technφk sme u₧ hovorili v Φlßnku <a href='http://interval.cz/clanek.asp?article=2571' title='Branick², Marek: Java Servlets - servlet filtering'>Java Servlets - servlet filtering</a>.</li>
<li><strong>Response redirection</strong> - alebo presmerovanie odpovede na in² aplikaΦn² zdroj, Φo m⌠₧e by¥ tie₧ servlet, HTML alebo JSP strßnka.</li>
<li><strong>Request dispatching</strong> - prostrednφctvom tejto techniky m⌠₧eme preda¥ po₧iadavku na ∩alÜφ servlet, ktor² sa postarß o vytvorenie odpovede. A zßrove≥ m⌠₧eme priamo zφska¥ odpove∩ inΘho servletu a zahrn·¥ ju do naÜej.</li>
<li><strong>Vyu₧itie extern²ch zdrojov</strong> - s ktor²mi m⌠₧eme pracova¥ cez u₧ spomφnan² objekt <em>ServletContext</em> a pristupova¥ k nim cez met≤du <kbd>getResource()</kbd>.</li>
<li><strong>Zdie╛anie objektov</strong> - resp. atrib·tov, ktorΘ m⌠₧e by¥ na troch ·rovniach. Na ·rovni aplikßcie s· dostupnΘ cez <em>ServletContext</em>. ╧alÜia ·rove≥ predstavuje aktußlne sedenie (session) prφstupnΘ cez <em>HttpSession</em> objekt a nakoniec s· to objekty spojenΘ s aktußlnou po₧iadavkou dostupnΘ cez <em>HttpServletRequest</em>.</li>
</ol>
</div>
<h3>Servlet collaboration - filtering a chaining</h3>
<p>Ako som u₧ spomenul o nieΦo vyÜÜie, o technike filtrovania request a response objektov sme u₧ hovorili, preto sa tomu u₧ nemusφm podrobnejÜie venova¥. V Φlßnku iÜlo o vyu₧itie Üpecißlnej komponenty odvodenenej z triedy <em>javax.servlet.Filter</em>, ktorß bola asociovanß s jedn²m alebo s viacer²mi servletmi. Na niektor²ch aplikaΦn²ch serveroch, naprφklad na IBM WebSphere Application Server, je mo₧nΘ vytvori¥ trochu in² sp⌠sob filtrovania ako u₧ poznßme. KonkrΘtne m⌠₧eme vyu₧i¥ tzv. MIME filtrovanie. Ako vypl²va z nßzvu, ide o filtrovanie, ktorΘ sa t²ka pou₧φvania MIME typov. Pre lepÜiu predstavu si dobre prezrite tento obrßzok:</p>
<p>V tomto type filtrovania prv² servlet v poradφ spracuje po₧iadavku a vytvorφ odpove∩ v u₧φvate╛sky definovanom MIME type. Tento typ je asociovan² s druh²m servletom v poradφ. V tom prφpade je v²stup prvΘho pou₧it² ako vstup druhΘho. Takto je mo₧nΘ priradi¥ r⌠zne MIME typy na spracovanie r⌠znym servletom. V prφpade, ₧e definovan² typ nie je podporovan² browserom, m⌠₧e sa odpove∩ presmerova¥ na servlet, ktor² vrßti odpove∩ v text/html tvare. Tento sp⌠sob filtrovania sa m⌠₧e vyu₧i¥ naprφklad pri konverzii z XML do HTML, i ke∩ na tento ·Φel dnes existuj· ove╛a sofistikovanejÜie nßstroje.</p>
<p>Bolo by dobrΘ ukßza¥, ako sa druh² servlet v poradφ vlastne dostane k v²stupu prvΘho servletu. Celkom jednoducho cez objekt request. Uvediem ukß₧ku (Servlet1.java):</p>
<div class='sample'>
response.setContentType("text/xml");
<br />PrintWriter out = response.getWriter();
<br />out.println("<name>First_Servlet</name>");
</div>
<p>Pre tento MIME typ je na servery zaregistrovan² konkrΘtny servlet, ktorΘmu je predanΘ ∩alÜie riadenie (Servlet2.java):</p>
<div class='sample'>
response.setContentType("text/html");
<br />PrintWriter out = response.getWriter();
<br />BufferedReader in = request.getReader();
<br />String line;
<br />while((line = in.readLine()) != null)
<br /> out.println(line);
<br />out.println("Second_Servlet");
</div>
<p>Toto je len nahrubo naΦrtnut² sp⌠sob, ako zφskate v²stup z prvΘho servletu. ╚o s nφm konkrΘtne vykonßte, u₧ zßle₧φ na vßs.</p>
<h4>Servlet chaining (re¥azenie)</h4>
<p>V systΘme re¥azenia je pre jeden HTTP request zavolan²ch postupne viacero servletov, priΦom ka₧d² z nich vytvorφ svoju Φas¥ odpovede nezßvisle od ostatn²ch, ale v definovanom poradφ. Server WebSphere poskytuje vlastn· triedu <em>com.ibm.websphere.servlet.filter.ChainerServlet</em>, Φo je vlastne Üpecißlny servlet, ktor² si m⌠₧ete zaregistrova¥ pod vlastn²m aliasom. Originßlny request je smerovan² na tento servlet a ten sa potom postarß o postupnΘ volanie jednotliv²ch servletov (Servlet1, Servlet 2...). V²slednß odpove∩, zlo₧enß z jednotliv²ch Φiastkov²ch odpovedφ, je poslanß klientovi.</p>
<p>Servlet filtering a chaining umo₧≥uje webdeveloperom vytvßra¥ modulßrne systΘmy. Jednou z mo₧nostφ vyu₧itia v s·vislosti s XML je, ₧e jeden servlet m⌠₧e vytvori¥ alebo zφska¥ po₧adovanΘ XML dßta a druh² mo₧e na tieto dßta aplikova¥ konkrΘtne XSL a v²sledok posla¥ klientovi. Znova vÜak opakujem, ₧e opφsan² sp⌠sob je vlastnos¥ou WebSphere Servera, Φo na druhej strane v⌠bec nevyluΦuje, aby ste boli s touto mo₧nos¥ou oboznßmenφ.</p>
<p>Ako som spomenul vyÜÜie, odpove∩ m⌠₧eme presmerova¥ na in² aplikaΦn² zdroj, Φo m⌠₧e by¥ servlet, HTML alebo JSP strßnka. Tento zdroj, respektφve jeho URL, musφ by¥ pre servlet dostupn². Existuj· dve formy presmerovania:</p>
<div class='list'>
<ol>
<li><strong>ètandardnΘ presmerovanie</strong> - s vyu₧itφm <kbd>response.sendRedirect("login.jsp")</kbd> sp⌠sobφ, ₧e servlet "vrßti" ako odpove∩ JSP strßnku. Ak by to bol in² servlet, tento by nemal prφstup k originßlnemu <em>request</em> objektu, ale ako odpove∩ klientovi by bola vrßtenß odpove∩ druhΘho servletu. Ak potrebujete ma¥ prφstup k p⌠vodnΘmu requestu, musφte pou₧i¥ techniku servlet dispatchingu, o ktorej budeme hovori¥ v bud·cej Φasti.</li>
<li><strong>Presmerovanie na error strßnku</strong> - v tomto prφpade je klientovi poslan² konkrΘtny status k≤d ako parameter met≤dy <kbd>response.sendError(response.CODE)</kbd>. KonkrΘtne k≤dy s· preddefinovanΘ konÜtanty objektu <em>response</em>. Ni₧Üie uvßdzam preh╛ad niektor²ch znßmych chybov²ch k≤dov.</li>
</ol>
</div>
<div class='table'>
<table cellspacing='0'>
<tr><th>konÜtanta</th><th>popis</th></tr>
<tr><td><em>SC_CONTINUE</em></td><td><strong>100</strong> - indikuje, ₧e servlet obdr₧al ·vodn· Φas¥ po₧iadavky a klient m⌠₧e pokraΦova¥ a posla¥ aj zvyÜn· Φas¥.</td></tr>
<tr><td><em>SC_MOVED_<br>PERMANENTLY</em></td><td><strong>301</strong> - indikuje, ₧e po₧adovan² zdroj bol permanentne pres¥ahovan² na inΘ miesto a vÜetky ostatnΘ po₧iadavky by mali by¥ smerovanΘ na novΘ URL.</td></tr>
<tr><td><em>SC_BAD_REQUEST</em></td><td><strong>400</strong> - indikuje, ₧e po₧iadavka poslanß klientom bola syntakticky nesprßvna.</td></tr>
<tr><td><em>SC_FORBIDDEN</em></td><td><strong>403</strong> - indikuje, ₧e servlet pochopil po₧iadavku, ale odmietol ju vykona¥ (naprφklad z d⌠vodu nedostatoΦn²ch prßv).</td></tr>
<tr><td><em>SC_NOT_FOUND</em></td><td><strong>404</strong> - indikuje, ₧e po₧adovan² zdroj je nedostupn².</td></tr>
<tr><td><em>SC_HTTP_VERSION_<br>NOT_SUPPORTED</em></td><td><strong>505</strong> - indikuje, ₧e servlet nepodporuje alebo odmietol verziu HTTP protokolu, ktorß bola pou₧itß v danej po₧iadavke.</td></tr>
</table>
</div>
<p>VÜetky stavovΘ HTTP k≤dy m⌠₧eme rozdeli¥ do piatich skupφn pod╛a nasleduj·cej tabu╛ky:</p>
<tr><td>200-299</td><td>Po₧iadavka od klienta bola ·speÜne spracovanß.</td></tr>
<tr><td>300-399</td><td>Po₧iadavka bola presmerovanß.</td></tr>
<tr><td>400-499</td><td>Po₧iadavka od klienta je nekompletnß.</td></tr>
<tr><td>500-599</td><td>Server error.</td></tr>
</table>
</div>
<p>V tomto viacmenej teoretickom Φlßnku budeme pokraΦova¥ aj nabud·ce, kedy sa pozrieme na ∩alÜie mo₧nosti spoluprßce medzi servletmi a in²mi zdrojmi web aplikßcie.</p>
<li><a href='http://interval.cz/redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=2856'>ZnakovΘ sady v praxi</a></li>
<li><a href='http://interval.cz/redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=2849'>Vytvß°enφ dokument∙ PDF v PHP</a></li>
<li><a href='http://interval.cz/redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=2852'>Interval v zajetφ Φφsel</a></li>
<li><a href='http://interval.cz/redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=2850'>CSS2 - podpora kaskßdov²ch styl∙ v sedmiΦkovΘ °ad∞ Opery</a></li>
<li><a href='http://interval.cz/redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=2844'>P.E.T. - jednoduch² Üablonovacφ systΘm v PHP</a></li>