7.2. Javas servleti

Ievads

Mērķi

  • Saprast Javas servletu arhitektūru
  • Saprast servleta programmēšanas pamatiezīmes
  • Prast veidot Web aplikācijām piemērotu direktoriju struktūru un būvēt tās ar Ant
  • Prast ar servletiem veidot datubāzu aplikācijas, apstrādāt failu augšupielādi un atgriezt binārus datus

Kas ir servlets

  • Servlets ir Javas programma, kura darbojas J2EE aplikāciju serverī; saņem un apstrādā HTTP pieprasījumus.
  • Servleti (jeb servsīklietotnes) domāti, lai modificētu Web servera standartuzvedību; tie tātad ir servera puses analogs Javas apletiem
  • OC4J satur servletu konteineru, kurš nodrošina servleta ieejas un izejas datu piesaisti Web servera portam
  • JSP lapas pirms to izpildes arī tiek pārveidotas par servletiem
  • Servleti un JSP parasti ģenerē HTML vai XML dokumentus, tomēr servletus mēdz izmantot arī citu dokumentu tipu veidošanai

Servletu un OC4J arhitektūra

Servleta galvenās metodes

Klasē javax.servlet.http.HttpServlet ir šādas metodes:

doGet(HttpServletRequest req, HttpServletResponse resp) 
doPost(HttpServletRequest req, HttpServletResponse resp) 
service(HttpServletRequest req, HttpServletResponse resp) 

Servleta programmētājam ieteicams pārdefinēt "doGet" un "doPost" metodi. "service" metode atpazīst HTTP pieprasījuma tipu un pārsūta (dispatches) to kādai no "doXxx()" metodēm. Nereti "doGet()" un "doPost()" dara vienu un to pašu:

doPost(HttpServletRequest req, HttpServletResponse resp) {
    doGet(req, resp); 
}

Izņēmumi Pēc "doGet()" prototipa:

doGet(...) throws ServletException, java.io.IOException

Tos var deklarēt, ka "doGet()" viņus met. Var arī noķert un apstrādāt.

Tipiska "doGet()" implementācija

Metodē parasti jāuzstāda "Content-type" hederis, jāinicializē rakstītājs un jādrukā uz tā lapas saturs:

public void doGet (HttpServletRequest request, 
        HttpServletResponse response)
        throws ServletException, IOException { 
    response.setContentType("text/html; charset=windows-1257"); 
    PrintWriter out = response.getWriter(); 
    ...
}

Konvencija: Lai servletu un JSP kodēšana iespējami maz atšķirtos, ieteicams lietot šādus mainīgo vārdus (JSP tie ir "iebūvēti"):

HttpServletRequest request
HttpServletResponse response
PrintWriter out

Inicializācijas mainīgie

Failā web.xml, kurš glabājas WEB-INF direktorijā norādām Web aplikācijai vajadzīgos parametrus. "web.xml" faila piemērs:

<?xml version="1.0"?>
<!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>
   <display-name>exercise44</display-name>
   <description>
        Maza Web aplikācija ar dazhiem servletiem
   </description>
   <distributable/>
   <context-param>
      <param-name>atslega1</param-name>
      <param-value>vertiba1</param-value>
   </context-param>
</web-app>

Servletā tos var nolasīt ar šādu kodu:

public void doGet(...) throws ... {
    ...
    ServletContext scontext = getServletContext();
    Enumeration en = scontext.getInitParameterNames();
    while (en.hasMoreElements()) {
        String k = (String)(en.nextElement()); 
        String v = scontext.getInitParameter(k); 
    }
}

Servletu aplikāciju uzlikšana uz servera

Uzlikšana uz servera (deployment) OC4J gadījumā var notikt 2 veidos:

  • Servletus un JSP lapas pievieno atpakotā veidā jau izveidotajai "default-web-app"
  • Ar "admin.jar -deploy" izveido jaunu Web aplikāciju

Web aplikāciju izstrādes vides organizēšana

Ieteikumi, kā organizēt Web aplikāciju direktoriju izvietojumu:

  1. Sk. Maven direktoriju izvietojums.
  2. Cits piedāvājums - http://tomcat.apache.org/tomcat-6.0-doc/appdev/source.html - tas ir Tomcat servera manuālis, bet ir lietojams arī citiem Javas aplikāciju serveriem un servletu konteineriem. Šis izvietojums ir ērts, ja veidojat paši savu projekta būvēšanas scenāriju ar Ant (vai pielāgojat Tomcat dokumentācijā minēto).

    Ikvienam direktoriju izvietojumam izstrādes vidē (development environment) ir spēkā ieteikums - direktorijas, kuras satur programmu izejas tekstus jāatdala no direktorijām, kuras satur izpildāmo aplikāciju.

    Galvenie argumenti:

    • "Tīras" izejas teksta direktorijas var vieglāk administrēt, pārvietot, veidot tām rezerves kopijas, lietot versiju pārvaldības rīkus
    • Izpildāmu aplikāciju vieglāk savākt tad, ja tā ir atdalīta no izejas teksta direktorijām

Galvenās izstrādes laika direktorijas

Visas te minētās direktorijas atrodas zem projekta_vards - projekta saknes direktorijas

  • src/site - cilvēku rakstītā dokumentācija
  • src/main/java - Javas programmas - t.sk. bean'i, servleti, u.c. Ja lietojam pakotnes, tad izveidojam zem "src" atbilstošu direktoriju koku.
  • src/main/resources - citi (ne-Javas) faili, kas vajadzīgi aplikācijas CLASSPATHā. Piemēram, log4j.properties un lokalizācijas faili.
  • src/main/webapp - HTML, JSP, bildes, u.c. redzamie Web aplikācijas resursi, ko klients var pieprasīt pa HTTP.
  • src/main/webapp/WEB-INF - satur kompilētās programmas, ārējas bibliotēkas, speciāli konfigurācijas faili, piemēram web.xml - šī direktorija nav tieši pieejama HTTP klientiem. Toties

Automātiski izveidosies direktorija target/ - tā satur atkarīgos failus (kompilācijas rezultātus) un kopijas dažādiem aplikācijas failiem, no kuriem pēc tam veido distribūcijas arhīvu (jeb WAR failu).

Direktorija "target" nav jāglabā Subversion vai citā versiju kontroles sistēmā un tur nav jēgas neko rediģēt, jo visi faili tur ik pa brīdim tiks dzēsti.