Úvod do webových aplikací

Z FI WIKI
Přejít na: navigace, hledání

Webové aplikace jsou probírány podrobně v předmětu PA165, pro který existují podrobně zpracované materiály pod heslem Kategorie:Webové aplikace.

V předmětu PV168 není prostor probrat webové aplikace dostatečně podrobně. Podobně jako se v semináři probírá JDBC, a ORM nástroje jsou nechány do předmětu PA165, probereme zde jen pevné základy, které se v čase nemění, a různé nadstavby a frameworky, jejichž obliba se mění z roku na rok, ponecháme do PA165.

Úvod

Webové aplikace jsou aplikace, kde uživatelským rozhraním je webový prohlížeč. Mají dvě obrovské výhody oproti ostatním typům aplikací (desktopové, mobilní, příkazový řádek):

  • uživatel nemusí nic instalovat
  • vývojář se stará o jen jednu verzi aplikace
  • u správně napsaných aplikací existují adresy URL do částí aplikace, např. lze někomu jinému poslat odkaz na stránku s popisem určitého zboží

Sepišme si, co máme k dispozici na straně klienta:

  • ve 100 % případů máme HTML s hyperlinky a formuláři
  • v asi 95 % případů máme JavaScript, a můžeme s ním manipulovat HTML formuláře
  • většinou máme k dispozici Cookies pro ukládání stavu v prohlížeči
  • obvykle máme DOM (Document Object Model) a CSS (Cascading Style Sheets), které lze manipulovat JavaScriptem
  • většinou máme Flash plugin (animovaná vektorová grafika a multimédia, viz YouTube) (99% verze 6, 93% verze 9)
  • obvykle máme možnost použít Java applety, ale jen na úrovni pokaženého JDK 1.1
  • někdy lze použít Java Web Start pro nastartování desktopové aplikace

Pragmaticky má smysl používat to nejrozšířenější, tj. HTML s CSS a JavaScriptem, zajímavou možností se stává i Flash (s vývojovým nástrojem Flex). Při tvorbě aplikací pro širokou veřejnost je dobré vystačit si s čistým HTML, kvůli nevidomým uživatelům, případně možnosti tisku stránek.

Webové aplikace na platformě Java

Platforma Java je pro tvorbu serverové části webových aplikací poměrně vhodná, oproti např. PHP umožňuje psát snadněji udržovatelné aplikace, dobře škáluje, má skvěle zvládnutou internacionalizaci.

Cenou je o něco náročnější učení.

Základem serverové části webových aplikací naplatformě Java jsou tzv. Servlety, což jsou třídy obsluhující požadavky HTTP protokolu. Ty tvoří nejnižší vrstvu, nad kterou pak existují další nadstavby. Dalšími vrstvami jsou

  • Java Server Pages (JSP) - obdoba PHP a dalších server-side scripting nástrojů
  • Web Application Frameworks - rámce pro tvorbu složitějsích aplikací
    • rámce pro šablony stránek (Freemarker, WebMacro, Velocity, JSP+JSTL)
    • rámce pro řízení průchodu aplikací (Stripes, Struts)
    • rámce pro tvorbu stránek z komponent (Tapestry, WebWork, JSF)

Rozhraní servletů se časem téměř nemění, naopak webové aplikační rámce podléhají rychlému vývoji i módě.

Managed environment

U servletů se poprvé setkáváme pojmem managed environment. Servlety nejsou spustitelné aplikace, jak jsme byli dosud zvyklí, ale "žijí" uvnitř určitého prostředí, zvaného servlet container. Podobně například aplikace do mobilních telefonů, tzv. midlety, žijí uvnitř prostředí poskytovaného mobilním telefonem.

Servlet container vytváří instance servletů, při příchodu HTTP požadavků zpracuje příchozí data a volá metody servletů, vygenerovanou odpověd zasílá prohlížeči, a při ukončení aplikace servlety ruší.

Je definováno rozhraní mezi servlet containerem a webovou aplikací tvořenou servlety, tzv. Servlet API, které má různé verze, v současnosti se používají verze 2.4 a 2.5.

Existují různé implementace servlet containerů, např. Apache Tomcat, Jetty, JRun. Dále pak každý server odpovídající specifikaci Java Enterprise Edition musí obsahovat servlet container, např. BEA WebLogic, Oracle Application Server, IBM WebSphere a další.

Díky jednotnému API je možné psát aplikace nezávislé na konkrétním servlet containeru, a tutéž aplikaci používat v servlet containerech různých výrobců.

(Stejně tak je možné psát mobilní aplikace použitelné v každém mobilu podporujícím Midlet API.)

Servlet API

Servletem je každá Java třída, která implementuje interface javax.servlet.Servlet. Protože ale z praktického hlediska má smysl uvažovat pouze servlety obsluhující protokol HTTP, je důležitější vědět, že HTTP servletem je každá třída, která je potomkem třídy javax.servlet.http.HttpServlet.

Obsluha HTTP požadavků servlety je popsána v JavaServlets#Obsluha HTTP pomocí servletů, nemá smysl ji sem opisovat, prosím přečtete si ji tam.

Servlety jsou organizovány do tzv. aplikací, kdy skupina servletů je sdružena v jednom balíčku s příponou .war, což je soubor typu .jar (tedy ZIP archiv). V něm musí být přítomen soubor WEB-INF/web.xml, který popisuje konfiguraci aplikace, zejména mapování URL na servlety.

Podrobnosti viz část JavaServlets#Webová aplikace a kontext servletu, prosím přečtěte si ji.

Důležitá věc, kterou Servlet API poskytuje, je session. Jedná se vlastně o HashMap, do které je možné si ukládat hodnoty mezi jednotlivými požadavky od stejného prohlížeče. Session je udržována pomocí cookies, nebo v případě vypnutých cookies je její identifikátor přidáván do všech generovaných URL.

Praktická ukázka

Teď je asi vhodný čas zkusit si vytvořit servlet.

V NetBeans vytvořte nový projekt typu Web Application (File - New project - Categories: Web - Projects: Web Application). Server zvolte Tomcat 6, Java EE Version zvolte JavaEE 5.

V projektu vytvořte nový servlet zvaný UkazkovyServlet. Pravým tlačítkem klikněte na Source packages, dejte New - Other - Categories: Web - File Types: Servlet, Class Name dejte UkazkovyServlet a package dejte cz.muni.fi.pv168. Je nutné zvolit nějaký package, jinak nebude servlet spustitelný !!!

Naeditujte text do následující podoby a spusťte aplikaci:

 
package cz.muni.fi.pv168;
 
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
 
public class UkazkovyServlet extends HttpServlet {
    
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
        
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        
        int n = 10;
        String np = request.getParameter("n");
        if(np!=null) n = Integer.parseInt(np);
        
        for(int i=0;i<n;i++) {
            out.println("i="+i+"<br/>");
        }
    } 
    
}

Servlet zavoláte na URL http://localhost/WebApplication1/UkazkovyServlet.

JSP

Psát delší sekvence HTML v servletech je poměrně nepohodlné, proto každý servlet container poskytuje tzv. Java Server Pages - JSP.