V predchádzajúcej časti seriálu o servletoch (java komponentoch bežiacich na strane servera) sme si ukázali niektoré z ďalších možností konfiguračného súboru web.xml. Dnes sa s ním nebudeme príliš zaoberať, ale s týmto súborom sme tak celkom neskončili, pretože sa ešte stretneme pri filtroch v niektorej z ďalších častí. V tejto časti si vytvoríme jednoduchý servlet, ktorý spracuje vstupné dáta z formulára, skontroluje vyplnenie niektorých povinných polí a vráti nám spracovaný výsledok.

Spracovanie formulára

Jednou z oblastí nasadenia servletov je spracovanie formulárových dát. Úlohou servletov v tomto prípade, je získať hodnoty parametrov jednotlivých polí formulára, vyhodnotenie týchto parametrov (niektoré môžu byť nezadané, môžu byť NULL, môžu byť zadané chybným spôsobom …) a následné spracovanie získaných dát. Po spracovaní môže servlet dáta napríklad zapísať do súboru alebo do databázy, môže vygenerovať a poslať email, alebo čokoľvek čo je potrebné. Každopádne by mal po spracovaní poslať klientovi odpoveď, alebo odovzdať riadenie inému servletu či stránke JSP.

Java Servlet API 2.3 nám dáva k dispozícii niekoľko užitočných metód na získanie formulárových parametrov, uložených v objekte HttpServletRequest. Konkrétne metódy rozhrania ServletRequest:

  1. getParameter(String param)
    – základná metóda na zistenie hodnoty parametra, ktorého názov je parametrom metódy. Metóda vracia objekt typu String alebo NULL, ak parameter neexistuje (nie ak nebola zadaná jeho hodnota, vtedy vráti prázdny reťazec). V prípade, že potrebujete získať niektorý z primitívnych dátových typov, musíte vykonať konverziu.
    Napr. int i = Integer.valueOf(String cislo).intValue();
    Túto metódu môžete použiť, len ak parameter má jednu hodnotu. Ak má viac použite nasledovnú metódu.
  2. getParameterValues(String param)
    – použitie tejto metódy je identické s predchádzajúcou s tým rozdielom, že metóda vracia pole reťazcov String[]. Jednotlivé prvky pola sú jednotlivé hodnoty parametra. Prvky pola sú indexované od 0.
  3. getParameterNames()
    – metóda vracia objekt java.util.Enumeration, obsahujúci názvy jednotlivých parametrov ako objekty String. Ak požiadavka neobsahuje žiadne parametre, metóda vráti prázdny objekt Enumeration.
  4. getParameterMap()
    – vracia objekt java.util.Map obsahujúci názvy parametrov (typu String) ako kľúče mapy a hodnoty parametrov (typu String[]) ako hodnoty mapy. Bližšie detaily nájdete v dokumentácii k triede Map.

Vytvorme si príklad, na ktorom si vysvetlíme, ako môže servlet spracovať formulár. Pôjde o jednoduchú anketu, v ktorej sú niektoré položky povinné (ich vyplnenie kontrolujem na strane servera). Servlet zistí obsah jednotlivých parametrov a vráti užívateľovi prehľad o zistených údajoch aj s poďakovaním za vyplnenie. Všimnite si, že servlet implementuje obe metódy: doGet() aj doPost(). Prvá metóda sa vykoná pri priamom volaní servletu a postará sa o vytvorenie formulára ankety. Druhá metóda doPost() sa vykoná vtedy, keď užívateľ odošle formulár a postará sa o jeho spracovanie. Aby ste mali motiváciu preštudovať si kód, vyskúšajte si najprv príklad naživo.

FormManager.java

package interval;
 
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
 
public class FormManager extends HttpServlet {
 
  public void doGet(HttpServletRequest req, HttpServletResponse res)
      throws ServletException, IOException {
 
  res.setContentType(„text/html;charset=windows-1250“);
  PrintWriter out = res.getWriter();
  // vytvorenie formulára
  out.println(„<html><head><title>Prieskum …</title></head><body>“ +
    „<table border=\“0\“><tr><td>“ +
    „<p align=\“center\“><u>Jednoduchá anketa</u></p>“ +
    „<form method=\“post\“>“ +
    „<fieldset><legend><strong>Osobné údaje</strong></legend>“ +
    „<table cellpadding=\“2\“ border=\“0\“ cellspacing=\“1\“>“ +
    „<tr valign=\“middle\“>“ +
    „<td align=\“right\“>meno*:</td>“ +
    „<td><input type=\“text\“ name=\“name\“ class=\“form\“ size=\“8\“></td>“ +
    „</tr><tr valign=\“middle\“>“ +
    „<td align=\“right\“>priezvisko:</td>“ +
    „<td><input type=\“text\“ name=\“surname\“ class=\“form\“ size=\“15\“></td>“ +
    „</tr><tr valign=\“middle\“>“ +
    „<td align=\“right\“>e-mail*:</td>“ +
    „<td><input type=\“text\“ name=\“email\“ class=\“form\“ size=\“20\“></td>“ +
    „</tr></table></fieldset><fieldset>“ +
    „<legend><strong>Pracovné údaje</strong></legend>“ +
    „<table cellpadding=\“2\“ border=\“0\“ cellspacing=\“1\“>“ +
    „<tr valign=\“middle\“>“ +
    „<td align=\“right\“>pracovné* <br> zaradenie:</td>“ +
    „<td valign=\“bottom\“>“ +
    „<input type=\“text\“ name=\“job\“ class=\“form\“ size=\“30\“></td>“ +
    „</tr><tr valign=\“top\“>“ +
    „<td align=\“right\“>Aké <br> nástroje <br> využívate:</td><td >“ +
    „<input type=\“checkbox\“ name=\“tools\“ value=\“NetBeans\“> NetBeans <br>“ +
    „<input type=\“checkbox\“ name=\“tools\“ value=\“JBuilder\“> JBuilder <br>“ +
    „<input type=\“checkbox\“ name=\“tools\“ value=\“Sun One Studio\“> Sun One Studio <br>“ +
    „<input type=\“checkbox\“ name=\“tools\“ value=\“iné\“> iné “ +
    „<input type=\“text\“ name=\“other_tool\“ class=\“form\“ size=\“20\“>“ +
    „</td></tr></table></fieldset><br>“ +
    „<em>Polia označené * sú povinné!</em>“ +
    „<div align=\“right\“>“ +
    „<input type=\“submit\“ name=\“odoslat\“ class=\“submit\“ value=\“Odoslať\“></div>“ +
    „</form></td></tr></table>“ +
    „</body></html>“);
  out.close();
}
 
  public void doPost(HttpServletRequest req, HttpServletResponse res)
    throws ServletException, IOException {
 
  res.setContentType(„text/html;charset=windows-1250“);
  PrintWriter out = res.getWriter();
 
  // získanie obsahu parametra „name“
  String name = req.getParameter(„name“);
  name = new String(name.getBytes(„ISO-8859-1“), „windows-1250“);
  if(name.equals(„“)) {
    name = „<font color=\“#FF0000\“>Zadajte prosím meno!</font>“;
    }
 
  // získanie obsahu parametra „surname“
  String surname = req.getParameter(„surname“);
  surname = new String(surname.getBytes(„ISO-8859-1“), „windows-1250“);
 
  // získanie obsahu parametra „email“
  String email = req.getParameter(„email“);
  if( email.equals(„“) | email.indexOf(„@“) == -1) {
    email = „<font color=\“#FF0000\“>Zadajte prosím váš email!</font>“;
    }
 
  // získanie obsahu parametra „job“
  String job = req.getParameter(„job“);
  job = new String(job.getBytes(„ISO-8859-1“), „windows-1250“);
  if(job.equals(„“)) {
    job = „<font color=\“#FF0000\“>Nezadali ste vaše pracovné zaradenie!</font>“;
  }
 
  // získanie obsahu parametra „tools“
  String[] tools = req.getParameterValues(„tools“);
 
  // získanie obsahu parametra „other_tool“
  String other_tool = req.getParameter(„other_tool“);
  other_tool = new String(other_tool.getBytes(„ISO-8859-1“), „windows-1250“);
 
  // vypísanie získaných a otestovaných parametrov
  out.print(„<html><head><title>Výsledky …</title></head><body>“);
    „<b><u>Osobné údaje a zaradenie:</u></b><br>“ +
    „<b>Meno: </b>“ + name + „<br>“ +
    „<b>Priezvisko: </b>“ + surname + „<br>“ +
    „<b>Email: </b>“ + email + „<br>“ +
    „<b>Zaradenie: </b>“ + job + „<br><p>“ +
    „<b><u>Používané nástroje:</u></b><br>“);
 
  // vypísanie používaných nástrojov
  if ( tools != null) {
    for (int i = 0; i < tools.length; i++) {
      if (tools[i].equals(„iné“)) {
        out.print(„- “ + tools[i] + „: “ + other_tool +“<br>“);
      } else { out.print(„- “ + tools[i] + „<br>“); }
    }
  }
 
  out.print(„<p>Ďakujeme za všetky poskytnuté údaje.</p>“ +
    „<hr><a href=\““ + req.getRequestURI() +
    „\“>Anketa</a></body></html>“);
  out.close();
  }
}

Uznávam, že študovať cudzí kód aspoň bez zvýraznenej syntaxe môže byť pomerne náročné. Preto som pre vás vytvoril html stránku so zvýrazneným zdrojovým kódom príkladu, ktorú si môžete otvoriť v novom okne.

V prvej časti kódu v metóde doGet() jednoducho vytváram formulár ankety. Používam na to jednu metódu out.println, ktorá mi vypíše na výstup všetok html kód. Ak by ste si teda otvorili zdrojový kód vytvorenej stránky, celý by bol v jednom riadku. Všimnite si jednu neobvyklú vec. V definícii formulára form nešpecifikujem parameter action. Znamená to, že servlet pošle obsah formulára sám sebe. Ale zároveň špecifikujem typ požiadavky POST. Preto mi obsah formulára spracuje metóda doPost. Okrem dvoch metód na zisťovanie obsahu parametrov getParameter() a getParameterValues() nepoužívam v kóde žiadne špeciality. V podstate len testujem niektoré hodnoty, či to nie sú prázdne reťazce alebo NULL.

V kóde mám aj niekoľko nasledovne vyzerajúcich riadkov líšiacich sa v názve premennej String:

name = new String(name.getBytes(„ISO-8859-1“), „windows-1250“);

V tomto riadku najprv získam z premennej name pole bajtov v kódovaní ISO-8859-1. Potom pomocou konštruktora String(byte[], charset) z tohto pola vytvorím nový reťazec v kódovaní windows-1250. Tomcat totiž má problém v prenose znakov s diakritikou (v našom regióne) a týmto spôsobom je možné problém vyriešiť. Je možné, že problém je zložitejší, ale nemám bohužiaľ čas ísť do toho hlbšie. Dúfam, že po prečítaní tohto článku vám nebude spracovanie formulárov cez servlety robiť veľké problémy.

V závere vám ponúkam možnosť stiahnuť si príklad v zipe a vyskúšať si ho u seba.

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