Hlavní navigace

S Javou na webovém serveru (3)

Lukáš Zapletal

JSP nebo-li Java Server Pages technologie umožňuje vývojářům rychle a snadno vytvářet dynamické weby. Díky tomu, že se oddělí statický a dynamický obsah (JSP stránka a JavaBean komponenta), že Java běží na mnoha systémech, a že je velmi bezpečná, se stává v poslední době velmi populární. V závěru tohoto seriálu se naučíme vytvářet vlastní jednoduché JSP stránky, protože Tomcat má v sobě JSP kompilátor i kontejner.

Článek má však pouze informativní charakter. V žádném případě v něm nehledejte základy programování JSP, protože spoustu důležitých vlastností zde nebude ani zmíněno.

JSP stránky jsou interpretovány a vytvářejí nějaký výstup (obvykle HTML, ale může se jednat i o XML nebo WML). Zapisují se do textových souboru v XML formátu (podobnému HTML). Využívá se zde značek (atributů), které oddělují statické informace od vlastních výkonných. Příklad:

<BODY>
<P>Hello JSP!</P>

<%
  Date date = new Date();
  String today = DateFormat.getDateInstance().format(date);
%>

<P>Today is <%= today %>
</BODY>

JSP rozlišuje několik značek

  • <%! – deklarace se používají pro definování proměnných a metod, které jsou platné pro celou stránku
  • <%= – výrazy se vyhodnotí a výsledek se vloží přímo na stránku
  • <% – scriplety (scripplets) slouží k vlastnímu zadávání kódu Javy
  • <%– – komentáře jsou ignorovány již na straně serveru

JSP nabízí v základní výbavě například přesměrování výjimek na jinou JSP stránku, která je zpracuje a výborný session management, který si nyní předvedeme:

<%
myObject mo = new myObject();
session.putValue("mo",mo);
%>
...
<%
myObject mo2 = (myObject) session.getValue("mo");
%>

Do session lze ukládat pouze platné objekty. Pokud chcete vložit některý z primitivních typů Javy, musíte použít obalovacích tříd z Java Core API (Integer, Float…). Tolik k úplným základům, nyní se vrhneme na JavaBeans komponenty.

JavaBeans komponenty umožňují znovu použít již napsaný kód. Můžete samozřejmě celou aplikaci napsat pomocí scripletu, ale to je nevýhodné. Vzhledem k tomu, že se webové projekty obvykle sestávají z mnoha JSP souborů, museli byste kód pořád dokola opisovat. Jelikož ale vše probíhá v Javě, která je objektově orientovaná, problém řeší právě JavaBeans. Stačí napsat komponentu, která bude dělat konkrétní akci (tahat data z databáze, komunikovat po TCP nebo pouze zapouzdřovat počítadlo přístupů – jako v našem příkladě níže) a pomocí speciálních atributů ji v JSP stránce použít. Říká se, že příklad je nadevšechnu teorii, takže si nadefinujeme jednoduchý JavaBean s proměnnou counter, geter/seter metodami getCounter a setCounter (jen pro ukázku – v praktickém případě by to mohl být atribut udávající zda uložit či neuložit počítadlo do databáze) a metodou count:

package jsptest;

public class CounterBean {
  private long counter = 0;

  public CounterBean() {
  }

  public long getCounter() {
    return counter;
  }

  public void setCounter(long counter) {
    this.counter = counter;
  }

  public long count() {
    return ++counter;
  }
}

Nyní komponentu vložíme do stránky a zprovozníme. K tomu slouží atribut <jsp:useBean, který vytvoří instanci objektu v daném kontextu (application, session, request nebo page). Pokud je instance již vytvořena, vrátí odkaz na ni.

<%@ page import="java.text.*, java.util.*" %>
<%@ page contentType="text/html; charset=iso-8859-1" %>
<HTML>
<HEAD>
<jsp:useBean id="CounterBeanId"
scope="application" class="jsptest.CounterBean" />
<TITLE>Jsp Test</TITLE>
</HEAD>

<BODY>
<P>Hello JSP!</P>

<P>This page has been visited
<%= CounterBeanId.count() %>
times.
</BODY>
</HTML>

Jednotlivé get/set metody Beansů se dají „namapovat“ na proměnné získané z formulářů, a tak usnadnit jejich zpracování. Velkou výhodou JavaBensů je také to, že se jejich instance sdílí ve svém kontextu (session, application nebo request). Jedna stránka může například zpracovat formulář, vytvořit instanci JavaBeansu a přesměrovat požadavek na jinou JSP stránku, která může provést s instancí Beansu nějakou akci a znovu přesměrovat požadavek nebo vyprodukovat výstup. Toto se velmi často používá zejména v session kontextech, kdy se takto požadavky řetězí (request chaining).

Myslím, že jsem osvětlil základní pojmy týkající se Java Server Pages. Po přečtení článku sice nebudete ještě schopni produkovat plnohodnotné a robustní JSP úlohy (musí se dbát také na synchronizaci vláken při mnoha požadavcích zároveň), ale máte celkový přehled o problematice.

Miniseriál o Tomcatu sice končí, můžete se však těšit na nový článek „Enterprise Java na Linuxu“, který přiblíží open source aplikační servery (JBoss, Enhydra…), jak se instalují a co nabízejí.

Našli jste v článku chybu?