Java Servlets – web.xml

29. května 2003

V predchádzajúcej časti sme vytvorili jednoduchý servlet generujúci statický obsah. Po vysvetlení jednotlivých krokov sme servlet nasadili na server. Príklad ste mali možnosť vyskúšať aj on-line alebo si ho stiahnuť. V tejto časti sa pozrieme na možnosti konfiguračného súboru web.xml z pohľadu možného využitia pri inicializácii servletu.

Inicializácia servletu pomocou web.xml

V predchádzajúcej časti som čiastočne načrtol použitie web.xml. Konkrétne išlo o zaregistrovanie servletu pod nejakým menom. Táto registrácia nie je povinná, servlet bude fungovať aj bez nej. Toto sme si už nakoniec ukázali. Dokonca ste si možno všimli, že som použil vetu: „Ďalej si môžete vytvoriť v adresáry WEB-INF súbor web.xml„. Z tejto vety vyplýva, že vytvorenie a používanie web.xml nie je povinné. Ak sa však rozhodnete pre používanie tohto súboru, musíte dodržať jeho syntaktické pravidlá. Ďalšou dôležitou vecou je, že štruktúra a syntax súboru je závislá na použitom serveri, môže sa líšiť. Ja pracujem so serverom Jakarta-Tomcat. Preto sa neodporúča používať tento súbor (s veľkým množstvom elementov), z dôvodu možných problémov pri potrebe prenositeľnosti aplikácie z jedného servera na iný.

Zaregistrovať servlet v súbore web.xml by sme už mali vedieť. Možno by bolo ešte treba spomenúť, že poradie jednotlivých elementov je predpísané a nie je možné ho meniť. Teda tak, ako budem elementy uvádzať, také musí byť aj ich poradie v reálnom súbore web.xml. A tiež platí, že elementy sú case-sensitive, konkrétne musia byť písané malými písmenami.

Na vloženie inicializačných parametrov do súboru web.xml pre konkrétny servlet sa používa element <init-param> a dva subelementy <param-name> a <param-value>.

web.xml

<?xml version=“1.0″ encoding=“ISO-8859-2″?>
 
<!DOCTYPE web-app
   PUBLIC „-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN“
   „http://java.sun.com/dtd/web-app_2_3.dtd“>
<web-app>
  <servlet>
   <servlet-name>Init</servlet-name>
   <servlet-class>interval.InitServlet</servlet-class>
   <init-param>
     <param-name>meno</param-name>
     <param-value>Jozef Dlhý</param-value>
   </init-param>
   <init-param>
     <param-name>email</param-name>
     <param-value>jozef.dlhy@post.sk</param-value>
   </init-param>
  </servlet>
</web-app>

Ak máme inicializačné parametre zadefinované (môže to byť čokoľvek, napríklad obyčajné reťazce, čísla, cesta k súboru s heslami, parametre potrebné na pripojenie k databáze…), vytvoríme servlet, ktorý ich použije. Všimnite si, že v deklarácii DOCTYPE web.xml dokumentu je treba použiť web-app_2_3.dtd. Tento údaj hovorí serveru, akú verziu Servlet API chcem použiť. Posledná verzia ja 2.3, pracuje sa na 2.4. Ak by ste použili web-app_2_2.dtd nemohli by ste využiť niektoré výhody verzie 2.3, napríklad filtrovanie užívateľských požiadaviek. V nasledujúcej ukážke je InitServlet, ktorý prečíta vstupné parametre zo súboru web.xml a použije ich.

InitServlet.java

package interval;
 
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
 
public class InitServlet extends HttpServlet {
 
private String name, email;
 
public void init(ServletConfig config) throws ServletException {
  super.init(config);
  name = config.getInitParameter(„meno“);
  email = config.getInitParameter(„email“);
}
 
public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
  response.setContentType(„text/html;charset=windows-1250“);
  PrintWriter out = response.getWriter();
  out.println(„<HTML><HEAD><TITLE>Inicializácia servletu – web.xml“ +
      „</TITLE></HEAD>\n“ +
      „<BODY>\n“ +
      „<H2>Inicializačné parametre:</H2>\n“ +
      „<UL>\n“ +
      „<LI>Meno a priezvisko: “ + name + „\n“ +
      „<LI>Email: “ + email + „\n“ +
      „</UL>\n“ +
      „</BODY></HTML>“);
  }
}

Oproti príkladu z minulej časti, implementoval som metódu init(). Ak voláte túto metódu s parametrom ServletConfig, treba v jej tele na prvom riadku zavolať metódu predka super.init(ServletConfig config). Prečo je to tak? Objekt ServletConfig sa používa niekde inde v servlete a metóda init() predka ho zaregistruje tam, kde ho môže neskôr nájsť.

Následne som pomocou metódy getInitParameter(String parameter) získal hodnotu inicializačného parametra zo súboru web.xml. Takto získané hodnoty som uložil do privátnych premenných, ktoré som neskôr použil v nám už známej metóde doGet.

Ak zavoláte servlet InitServlet zaregistrovaný pod menom Init, dostanete nasledujúci výsledok:

výsledok volania Init

Ak by ste zavolali servlet pod jeho skutočným menom interval.InitServlet, výsledok by bol mierne odlišný:

výsledok volania interval.InitServlet

Vidíte, že ak zavoláte servlet pod skutočným menom, servlet síce vráti odpoveď, ale nemá v tomto prípade prístup k inicializačným parametrom, ukrytým v súbor web.xml.

Na koniec ešte malá rada. Nepoužívajte web.xml na vloženie veľkého množstva inicializačných parametrov. Radšej si vytvorte samostatný súbor *.properties, do tohoto súboru vložte všetky parametre rovnakého typu (napríklad zoznam oprávnených užívateľov) a v súbore web.xml uveďte len jeden parameter, obsahujúci cestu k vytvorenému súboru. Túto informáciu potom použite vo vašom servlete (servletoch). Ide totiž o to, že servlet zisťuje inicializačné parametre štandardným spôsobom podľa Servlet API, ale umiestnenie týchto parametrov je silne serverovo závislé. Uľahčíte si tak život pri prenose vašej aplikácie na iný server.

Použitý príklad si môžete stiahnuť a vytvoriť si vlastné inicializačné parametre. V budúcej časti sa pozrieme na niekoľko ďalších možností, ktoré súbor web.xml ponúka.

Štítky: Články

Mohlo by vás také zajímat

Nejnovější

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *