Navigace

Hlavnφ menu

 

Java Servlets - interakcia a zdie╛anie objektov a zdrojov

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.

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 ServletContext object.

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:

  1. Servlet collaboration - 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 Java Servlets - servlet filtering.
  2. Response redirection - alebo presmerovanie odpovede na in² aplikaΦn² zdroj, Φo m⌠₧e by¥ tie₧ servlet, HTML alebo JSP strßnka.
  3. Request dispatching - 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.
  4. Vyu₧itie extern²ch zdrojov - s ktor²mi m⌠₧eme pracova¥ cez u₧ spomφnan² objekt ServletContext a pristupova¥ k nim cez met≤du getResource().
  5. Zdie╛anie objektov - resp. atrib·tov, ktorΘ m⌠₧e by¥ na troch ·rovniach. Na ·rovni aplikßcie s· dostupnΘ cez ServletContext. ╧alÜia ·rove≥ predstavuje aktußlne sedenie (session) prφstupnΘ cez HttpSession objekt a nakoniec s· to objekty spojenΘ s aktußlnou po₧iadavkou dostupnΘ cez HttpServletRequest.

Servlet collaboration - filtering a chaining

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 javax.servlet.Filter, 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:

Servlet MIME filtering

Servlet MIME filtering

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.

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):

response.setContentType("text/xml");
PrintWriter out = response.getWriter();
out.println("<name>First_Servlet</name>");

Pre tento MIME typ je na servery zaregistrovan² konkrΘtny servlet, ktorΘmu je predanΘ ∩alÜie riadenie (Servlet2.java):

response.setContentType("text/html");
PrintWriter out = response.getWriter();
BufferedReader in = request.getReader();
String line;
while((line = in.readLine()) != null)
  out.println(line);
out.println("Second_Servlet");

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.

Servlet chaining (re¥azenie)

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 com.ibm.websphere.servlet.filter.ChainerServlet, Φ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.

Servlet chaining

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φ.

Response redirection - presmerovanie odpovede

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:

  1. ètandardnΘ presmerovanie - s vyu₧itφm response.sendRedirect("login.jsp") 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 request 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.
  2. Presmerovanie na error strßnku - v tomto prφpade je klientovi poslan² konkrΘtny status k≤d ako parameter met≤dy response.sendError(response.CODE). KonkrΘtne k≤dy s· preddefinovanΘ konÜtanty objektu response. Ni₧Üie uvßdzam preh╛ad niektor²ch znßmych chybov²ch k≤dov.
konÜtantapopis
SC_CONTINUE100 - indikuje, ₧e servlet obdr₧al ·vodn· Φas¥ po₧iadavky a klient m⌠₧e pokraΦova¥ a posla¥ aj zvyÜn· Φas¥.
SC_MOVED_
PERMANENTLY
301 - 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.
SC_BAD_REQUEST400 - indikuje, ₧e po₧iadavka poslanß klientom bola syntakticky nesprßvna.
SC_UNAUTHORIZED401 - indikuje, ₧e poslanß po₧iadavka vy₧aduje HTTP autentifikßciu.
SC_FORBIDDEN403 - indikuje, ₧e servlet pochopil po₧iadavku, ale odmietol ju vykona¥ (naprφklad z d⌠vodu nedostatoΦn²ch prßv).
SC_NOT_FOUND404 - indikuje, ₧e po₧adovan² zdroj je nedostupn².
SC_HTTP_VERSION_
NOT_SUPPORTED
505 - indikuje, ₧e servlet nepodporuje alebo odmietol verziu HTTP protokolu, ktorß bola pou₧itß v danej po₧iadavke.

VÜetky stavovΘ HTTP k≤dy m⌠₧eme rozdeli¥ do piatich skupφn pod╛a nasleduj·cej tabu╛ky:

rozsah k≤dovkateg≤rie
100-199InformaΦnß kateg≤ria.
200-299Po₧iadavka od klienta bola ·speÜne spracovanß.
300-399Po₧iadavka bola presmerovanß.
400-499Po₧iadavka od klienta je nekompletnß.
500-599Server error.

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.

Branick², Marek (12.11. 2003)