V predchádzajúcej časti seriálu o servletoch sme si jednoducho ukázali, ako spracovať údaje zadané a odoslané pomocou formulára. Príklad bol pomerne jednoduchý, čo sa týka samotnej logiky. Na druhej strane, aj keď bol jednoduchý, bol pomerne dlhý. Bolo to spôsobené tým, že servlet sa musel postarať o vytvorenie formulára, a zároveň o jeho spracovanie. Dnes si ukážeme, že to ide aj inak.

To „inak“ spočíva vo vytvorení formulára v samostatnom súbore. Najjednoduchší spôsob je vytvorenie statickej HTML stránky pomocou nejakého textového alebo špecializovanejšieho editora. Ďalšia možnosť je použiť stránku JSP (JavaServer Pages). Výhodou tohto riešenia je možnosť vloženia dynamických dát. Napríklad aktuálny dátum. No a do tretice môžete znova využiť samostatný servlet, ktorý sa postará o vytvorenie formulára. Máte teda minimálne tri možnosti. Ktorú si vyberiete zrejme závisí od rôznych podmienok. Napríklad aj od požiadaviek zadávateľa aplikácie.

Pre jednoduchosť si zvolím prvú variantu, statický HTML súbor. Opäť to bude niečo ako anketa, tentoraz zameraná na vaše záujmy a obľúbené veci. Chcem vás ubezpečiť, že získané údaje sa nebudú nikam zapisovať ani posielať, preto sa nemusíte báť ich zneužitia. Hneď v úvode si môžete príklad vyskúšať on-line.

Ukážka ankety
Ukážka zdrojového kódu

Kto číta tento seriál a pravidelne navštevuje server Interval.cz, určite vie veľa o tvorbe HTML stránok (aspoň predpokladám). Preto ho určite neprekvapí, že na vytvorenie formulára potrebujeme niekoľko špecializovaných elementov (značiek) spolu s ich atribútmi. Základným je samozrejme form. Táto značka má niekoľko atribútov, pričom mňa najviac zaujímajú atribúty method a action. Prvý určuje relatívnu cestu ku „skriptu“ (v našom prípade je to servlet), ktorý spracuje zadané údaje, a druhý určuje typ požiadavky POST/GET. Podľa typu požiadavky musí programátor implementovať vhodnú metódu (viď predchádzajúce časti seriálu, konkrétne Java Servlets – životný cyklus servletu).

V predchádzajúcej časti som ukázal niekoľko metód používaných pri spracovaní formulára. Dnes vám ukážem niekoľko ďalších, ktoré môžete tiež použiť. I keď nie sú vyslovene špecializované na formulárové dáta. Dúfam, že vám nebude robiť problém pochopiť čo nasledovný servlet vykonáva (pozrite si zvýraznený kód AnketaServlet.java):

package interval;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
public class AnketaServlet extends HttpServlet {
  private static final String CONTENT_TYPE = „text/html;charset=windows-1250“;
  public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
   response.setContentType(CONTENT_TYPE);
   request.setCharacterEncoding(„windows-1250“); //kvôli diakritike
   PrintWriter out = response.getWriter();
   out.println(„<html>“);
   out.println(„<head><title>AnketaServlet</title></head>“);
   out.println(„<body bgcolor=’#CAE4FF‘>“);
   out.println(„<p>Vážený(á) pán(i) “ + request.getParameter(„identita“)+ „.</p>“);
   out.println(„<p>Dozvedeli sme sa že Vám je “ + request.getParameter(„vek“) + “ rokov, <br>“);
   out.println(„páči sa Vám “ + request.getParameter(„auto“) + „,“);
   out.println(„rád(a) si vychutnáte “ + request.getParameter(„jedlo“) + “ a <br>“);
   out.println(„občas si zájdete na “ + request.getParameter(„sport“) + „</p>“);
   String[] zaluby = request.getParameterValues(„zaluby“);
   out.println(„<p>K Vašim ostatným záľubám patrí: <br>“);
   out.println(„<ul>“);
   if (zaluby != null) {
    for (int i = 0; i < zaluby.length; i++) {
     if (zaluby[i].equals(„ine“)) {
      out.println(„<li>“ + request.getParameter(„ine_zaluby“) + „</li>“);
     }
     else{ out.println(„<li>“ + zaluby[i] + „</li>“); }
    }
   }
   else { out.println(„<em>Nezadali ste nič.</em>“);}
   out.println(„</ul></p>“);
   out.println(„<p>Ďakujeme Vám za učasť v našej ankete.</p>“);
   out.println(„</body></html>“);
  }
}

Servlet je pomerne jednoduchý. Implementuje jedinú metódu doPost(), v ktorej zisťujem obsah jednotlivých formulárových polí. Kvôli jednoduchosti, tiež nekontrolujem či boli vyplnené všetky polia alebo len niektoré, či boli vyplnené správne (napríklad vek) a podobne. V praxi by samozrejme bolo nutné takúto kontrolu vykonať. Čo sa týka správneho spracovania znakov s diakritikou, použil som druhú možnú variantu, kedy v objekte request nastavím spôsob kódovania znakov pomocou metódy setCharacterEncoding(String kodovanie). Čo sa týka zaškrtávacích políčok (ostatné záľuby), v prípade, že nie je zaškrtnuté ani jedno z nich, v objekte request sa nebude nachádzať parameter odpovedajúci názvu skupiny políčok. V našom prípade je názov „zaluby“. V tom prípade volanie metódy request.getParameterValues("zaluby") vráti null. Následne akákoľvek práca nad objektom String[]zaluby, napríklad zaluby.length, spôsobí vyhodenie výnimky NullPointerException. Preto je nutné na to myslieť a prípadný stav ošetriť, napríklad if (zaluby != null) { ... }.

To isté platí aj pre prvok radio button. Ak nie je ani jeden vybraný, v objekte request bude pod jeho menom null. V prípade ostatných prvkov typu input s výnimkou typu file, získate prázdny reťazec. Práca s inputom typu file je špecifická. Budem sa jej venovať v samostatnom článku.

V závere článku predstavím niekoľko metód, užitočných pri vytváraní a používaní servletov. Keďže je lepšie raz vidieť ako stokrát počuť (čítať) uvediem príklad (archív so zdrojovým kódom):

public void getRequestInfo(HttpServletRequest req, PrintWriter out)
                                 throws ServletException , IOException {
   out.println(„<h4><B>Doplnkové informácie:</b></h4>“);
   out.println(„<b>Typ požiadavky:</b> “ + req.getMethod() + „<br>“);
   out.println(„<b>URI požiadavky:</b> “ + req.getRequestURI() + „<br>“);
   out.println(„<b>Protokol požiadavky:</b> “ + req.getProtocol() + „<br>“);
   out.println(„<b>Schéma požiadavky:</b> “ + req.getScheme() + „<br>“);
   out.println(„<b>Cesta k servletu:</b> “ + req.getServletPath() + „<br>“);
   out.println(„<b>Znaková sada:</b> „+ req.getCharacterEncoding() + „<br>“);
   out.println(„<b>Reťazec query:</b> “ + req.getQueryString() + „<br>“);
   out.println(„<b>Dlžka tela požiadavky:</b> “ + req.getContentLength() + „<br>“);
   out.println(„<b>MIME typ požiadavky:</b> “ + req.getContentType() + „<br>“);
   out.println(„<b>Vzdialený user:</b> “ + req.getRemoteUser() + „<br>“);
   out.println(„<b>Adresa vzdialeného servera:</b> “ + req.getRemoteAddr() + „<br>“);
   out.println(„<b>Názov vzdialeného servera:</b> “ + req.getRemoteHost() + „<br>“);
   out.println(„<b>Autorizačná schéma:</b> “ + req.getAuthType() + „<br>“);
}

Dúfam, že z uvedeného príkladu je dostatočne jasné použitie jednotlivých metód.

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Žádný příspěvek v diskuzi

Odpovědět