Úvod do webových aplikací: Porovnání verzí

Z FI WIKI
Přejít na: navigace, hledání
(MVC (Model View Controler))
(nový obsah od Makuba)
Řádka 1: Řádka 1:
[http://java.sun.com/javaee/5/docs/tutorial/doc/ Java EE 5 Tutorial]
+
Webové aplikace jsou probírány podrobně v předmětu [[PA165]], pro který existují
 +
podrobně zpracované materiály pod heslem [[:Kategorie:Webové aplikace]].
  
== MVC (Model View Controller) ==
+
V předmětu PV168 není prostor probrat webové aplikace dostatečně podrobně. Podobně jako se v semináři probírá JDBC,
* http://en.wikipedia.org/wiki/Model-View-Controller
+
a ORM nástroje jsou nechány do předmětu [[PA165]], probereme zde jen pevné základy, které se v čase nemění,
* http://java.sun.com/blueprints/patterns/MVC-detailed.html
+
a různé nadstavby a frameworky, jejichž obliba se mění z roku na rok, ponecháme do PA165.
  
=== Princip ===
+
== Úvod ==
Obecně řečeno, vytváření aplikací s využitím architektury MVC vyžaduje vytvoření tří komponent, mezi které patří:
+
  
* '''Model (model)''', což je doménově specifická reprezentace informací, s nimiž aplikace pracuje.
+
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):
* '''View (pohled)''', který převádí data reprezentovaná modelem do podoby vhodné k interaktivní prezentaci uživateli.
+
* uživatel '''nemusí nic instalovat'''
* '''Controller (řadič)''', který reaguje na události (typicky pocházející od uživatele) a zajišťuje změny v modelu nebo v pohledu.  
+
* 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ží
  
Komponenty řadič a pohled jsou ve standardním rozdělení vrstev na prezentační, doménovou a datovou obvykle zařazovány jako prezentační vrstva. V MVC je tato prezentační vrstva rozdělena mezi komponenty řadič a pohled, nicméně nejdůležitější rozdělení je mezí prezentací a doménovou vrstvou.  
+
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) ([http://www.adobe.com/products/player_census/flashplayer/version_penetration.html 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
  
Ačkoliv může být koncept MVC realizován různým způsobem, obecně platí tento princip:
+
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).
# Uživatel provede nějakou akci v uživatelském rozhraní (např. stiskne tlačítko).
+
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.
# Řadič obdrží oznámení o této akci z objektu uživatelského rozhraní.
+
# Řadič přistoupí k modelu a v případě potřeby ho zaktualizuje na základě provedené uživatelské akce (např. zaktualizuje nákupní košík uživatele).
+
# Model je pouze jiný název pro doménovou vrstvu. Doménová logika zpracuje změněná data (např. přepočítá celkovou cenu, daně a expediční poplatky pro položky v košíku). Některé aplikace užívají mechanizmus pro perzistentní uložení dat (např. databázi). To je však otázka vztahu mezi doménovou a datovou vrstvou, která není architekturou MVC pokryta.
+
# Komponenta pohled použije zaktualizovaný model pro zobrazení zaktualizovaných dat uživateli (např. vypíše obsah košíku). Komponenta pohled získává data přímo z modelu, zatímco model nepotřebuje žádné informace o komponentě View (je na ní nezávislý). Nicméně je možné použít návrhový vzor pozorovatel, umožňující modelu informovat jakoukoliv komponentu o případných změnách dat. V tom případě se komponenta view zaregistruje u modelu jako příjemce těchno informací. Je důležité podotknout, že řadič nepředává doménové objekty (model) komponentě pohledu, nicméně jí může poslat příkaz, aby svůj obsah podle modelu zaktualizovala.
+
# Uživatelské rozhraní čeká na další akci uživatele, která celý cyklus zahájí znovu.
+
  
[[Soubor:Mvc-structure-generic.gif]]
+
== 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 [[I18n - Internacionalizace|internacionalizaci]].
  
== Servlets [http://java.sun.com/products/servlet/] ==
+
Cenou je o něco náročnější učení.
* http://en.wikipedia.org/wiki/Servlet
+
Servlety jsou reakcí Javy na CGI scripty. Jedná se o programy v Javě, které běží na webovém serveru a odpovídají na požadavky ze strany klientů. Servlety nejsou spjaty z žádným konkrétním client-server protokolem, nicméně nejširší využití servletů je s HTTP protokolem. Slovem “Servlet” je tedy často míněno “HTTP Servlet”.
+
  
Servlety jsou implementací tříd v balíku javax.servlet (základní Servlet framework) a javax.servlet.http (rozšíření Servlet frameworku pro servlety odpovídají na HTTP požadavky). Jelikož jsou servlety napsány ve vysoce portabilním jazyku a splňují požadavky na framework, umožňují vytváření sofistikovaných serverových aplikací nezávisle na operačním systému.
+
Základem serverové části webových aplikací naplatformě Java jsou tzv. [[JavaServlets|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)
  
Servlety se používají zejména pro:
+
Rozhraní servletů se časem téměř nemění, naopak webové aplikační rámce podléhají rychlému vývoji i módě.
  
* Zpracování a ukládaní dat z HTML formulářů.
+
== Managed environment ==
* Generovaní dynamického obsahu např. vracení databázových dotazů klientovi.
+
* Manipulace se stavovými informacemi nad bezstavovým HTTP protokolem např. realizace on-line nákupního sytému, který souběžně obsluhuje několik zákazníků a přiřazuje každý požadavek odpovídajícímu zákazníkovi.
+
  
=== Servlety vs CGI ===
+
U servletů se poprvé setkáváme pojmem '''managed environment'''. Servlety nejsou spustitelné aplikace, jak
Tradiční způsob přidávání další funkcionality webovému serveru je pomocí Common Gateway Interface (CGI), jedná se o jazykově nezávislý interface, který umožňuje serveru spouštět externí procesy. Každý požadavek je zodpovězen separátní instancí CGI scriptu.
+
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.
  
Servlety mají nad CGI několik výhod:
+
Servlet container vytváří instance servletů, při příchodu HTTP požadavků zpracuje příchozí data a volá metody servletů, vygenerovanou
* Servlet neběží v separátním procesu. Což odstraňuje zátěž s vytvářením nového procesu pro každý požadavek.
+
odpověd zasílá prohlížeči, a při ukončení aplikace servlety ruší.  
* Servlet zůstává v paměti mezi požadavky. CGI script je nutné nahrávat a spouštět pro každý požadavek.
+
* Existuje pouze jediná instance servletu, která souběžně obsluhuje všechny požadavky. Tímto se ušetří paměť a zároveň může servlet jednoduše obsluhovat všechna data.
+
* Servlet může běžet v sandboxu a mít tak pevně definované bezpečnostní omezení.
+
  
=== Použití servletu ===
+
Je definováno rozhraní mezi servlet containerem a webovou aplikací tvořenou servlety, tzv. '''Servlet API''',
Na obrázku 1 je zobrazen jeden z nejčastějších využití servletů. Uživatel (1) vyplní formulář, který se odkazuje na servlet a kliknutím na submit tlačítko vyšle požadavek na informaci (2). Server (3) lokalizuje požadovaný servlet (4). A teď vyhodnotí a vrátí požadované informace ve formě web stránky (5). Ta je poté zobrazena v uživatelově prohlížeči (6).
+
které má různé verze, v současnosti se používají verze 2.4 a 2.5.
  
[[Soubor:Using.png]]
+
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ší.
  
== JSP (JavaServer Pages) [http://java.sun.com/products/jsp/] ==
+
Díky '''jednotnému API''' je možné psát aplikace nezávislé na konkrétním servlet containeru,
* http://en.wikipedia.org/wiki/JavaServer_Pages
+
a tutéž aplikaci používat v servlet containerech různých výrobců.
* http://www.caucho.com/resin-3.0/jsp/tutorial/index.xtp
+
* '''Odstínění prezentační logiky od aplikační logiky'''
+
  
 +
(Stejně tak je možné psát mobilní aplikace použitelné v každém mobilu podporujícím Midlet API.)
  
=== JSTL (Java Standard Tag Library) [http://java.sun.com/products/jsp/jstl/] ===
+
== Servlet API ==
* http://www.onjava.com/pub/a/onjava/2002/03/13/jsp.html
+
* [http://java.sun.com/j2ee/1.4/docs/tutorial/doc/index.html určité části Java2EE Tutoriálu]
+
  
Hlavní cíle JSTL jsou tyto:
+
Servletem je každá Java třída, která implementuje interface {{JavaEEClass|package=javax/servlet|classPrefix=javax.servlet.|class=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 {{JavaEEClass|package=javax/servlet/http|classPrefix=javax.servlet.http.|class=HttpServlet}}.
  
# Napomoci oddělit business logiku (JavaBeans) od prezentační logiky (JSTL tagy).
+
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.
# Umožnit vývojářům psát JSP kód bez větší znalosti Javy.
+
# Zpřehlednit a zjednodušit JSP kód. Odstranit nepřehledné scriptlety.
+
  
JSTL obsahuje spoustu různých tagů z několika oblastí. Každá z oblastí reprezentuje určitou funkcionalitu a má svůj prefix. URIs knihoven jsou tyto:
+
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'''.
  
* Core: <nowiki>http://java.sun.com/jsp/jstl/core</nowiki>
+
Podrobnosti viz část [[JavaServlets#Webová aplikace a kontext servletu]], prosím přečtěte si ji.
* XML: <nowiki>http://java.sun.com/jsp/jstl/xml</nowiki>
+
* Internationalization: <nowiki>http://java.sun.com/jsp/jstl/fmt</nowiki>
+
* SQL: h<nowiki>ttp://java.sun.com/jsp/jstl/sql</nowiki>
+
* Functions:<nowiki> http://java.sun.com/jsp/jstl/functions</nowiki>
+
  
<code>
+
Důležitá věc, kterou Servlet API poskytuje, je '''session'''. Jedná se vlastně o <code>HashMap</code>, do které je možné
<c:out value="Ahoj!"/>
+
si ukládat hodnoty mezi jednotlivými požadavky od stejného prohlížeče. Session je udržována pomocí cookies,
<sql:query var="books"
+
nebo v případě vypnutých cookies je její  identifikátor přidáván do všech generovaných URL.
  dataSource="${applicationScope.bookDS}">
+
  select * from PUBLIC.books where id = ?
+
  <sql:param value="${bookId}" />
+
</sql:query>
+
</code>
+
  
=== EL (Expression Language) [http://java.sun.com/javaee/5/docs/tutorial/doc/JSPIntro7.html#wp101877] ===
+
=== Praktická ukázka ===
* Součást JSTL
+
* Idea - zpřehlednění JSP, viz MVC model architektury aplikace
+
* Náhrada Scripletů (Java kód v JSP)
+
* Zpřístupňuje informace z nižší vrstvy (JavaBeans)
+
* Možnost použití několika výrazových jazyků
+
* Možnost vytváření vlastních knihoven
+
* SPEL standardizován v JSP 2.0
+
  
scriplet vs. EL
+
Teď je asi vhodný čas zkusit si vytvořit servlet.  
  
'''scriplet'''
+
V NetBeans vytvořte nový projekt typu '''Web Application'''  
<code>
+
(File - New project - Categories: Web - Projects: Web Application).  Server zvolte ''Tomcat 6'',
The population of <%= state.getFullName() %> in 2000 was
+
Java EE Version zvolte ''JavaEE 5''.
<%
+
StateInfo info = (StateInfo)stateInfo.get( state.getId() );
+
  if( info != null ) {
+
%>
+
<%= info.getPopulation(); %>
+
<%
+
}
+
%>
+
</code>
+
  
'''EL'''
+
V projektu vytvořte nový servlet zvaný '''UkazkovyServlet'''. Pravým tlačítkem klikněte na ''Source packages'',
<code>
+
dejte New - Other - Categories: Web - File Types: Servlet, Class Name dejte ''UkazkovyServlet''
The population of ${state.fullName} in 2000 was
+
a package dejte ''cz.muni.fi.pv168''. Je nutné zvolit nějaký package, jinak nebude servlet spustitelný !!!
${stateInfo[state.id].population}.
+
</code>
+
  
Výraz ${state.fullName} zavolá na JavaBeans komponentu state getFullName() a tím zpřístupní proměnou fullName.
+
Naeditujte text do následující podoby a spusťte aplikaci:
 +
<java>
 +
package cz.muni.fi.pv168;
  
* Vestavěné atributy: page, request, session, app, header, param, paramvalues
+
import java.io.*;
 +
import javax.servlet.*;
 +
import javax.servlet.http.*;
  
<code><c:out value="${param:username}"/></code>
+
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/>");
 +
        }
 +
    }
 +
   
 +
}
 +
</java>
  
== Servlet Kontejner ==
+
Servlet zavoláte na URL '''http://localhost/WebApplication1/UkazkovyServlet'''.
Jedním z nejpoužívanějších Servlet kontejnerů je [http://jakarta.apache.org/tomcat Apache Tomcat]
+
  
Tomcat verze 6.0 implementuje Servlet 2.5 a JavaServer Pages 2.1 specifikaci a obsahuje mnoho dalších vlastností, které z něj činní vhodnou platformu pro vývoj a provoz webových aplikací a webových služeb.
+
== JSP ==
  
Tomcat na kore.fi.muni.cz: http://kore.fi.muni.cz:8080
+
Psát delší sekvence HTML v servletech je poměrně nepohodlné, proto každý servlet container poskytuje tzv. [[Java Server Pages]] - JSP.
 
+
=== Adresářová struktura Tomcatu ===
+
* '''bin''' - startovací stripty
+
* '''conf''' - soubory s konfigurací serveru
+
* '''logs''' - výstup a logy serveru
+
* '''lib''' - knihovny nezbytné pro běh serveru
+
* '''webapps''' - úložiště pro aplikace
+
* '''work''' - pracovní adresář pro běžící aplikace
+
* '''temp''' - adresář používaný JVM pro dočasné soubory (java.io.tmpdir)
+
 
+
=== Adresářová struktura webových aplikací ===
+
* http://java.sun.com/blueprints/code/projectconventions.html
+
* http://maven.apache.org/guides/introduction/introduction-to-the-standard-directory-layout.html
+

Verze z 10. 4. 2008, 11:18

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.