Začínáme s Webovými stránkami v Javě 2

V minulém díle jsme si ukázali, jak vytvořit jednoduchou stránku v JSP (tzv. špagetový kód).

Nyní si ukážeme, jak vytvořit webovou stránku s použitím návrhového vzoru Model-View-Controller (MVC).

MVC má tři části, Model, View a Controller. Každá část má svojí specifickou a přesně určenou roli:

  • Model – představuje data aplikace, nad kterými pracuje View.
  • View – transformuje model do prezentační formy – tj. to co uživatel vidí.
  • Controller – hraje roli prostředníka mezi Model a View.

Vše si předvedeme na jednoduché webové aplikaci. Na její první stránce zadáme jméno uživatele, a na druhé toto jméno zobrazíme.

Výsledek by měl vypadat takto:

  1. Ukázka stránky 1
  2. Ukázka stránky 2

Generujeme kostru

Ukázku si předvedeme na technologii JSF s Facelets. Jako kostru použijeme archetype (stejně jako minule) pro tvorbu JSF stránek, který používáme u nás ve firmě.

Pusťte tedy příkaz:

mvn archetype:create  -DarchetypeArtifactId=softeu-archetype-jsf 
-DremoteRepositories=http://maven.softeu.cz/  
-DgroupId=cz.softeu.test -DartifactId=helloApp

Poznámka: uvedené URL (http://maven.softeu.cz/) bude použito pro stažení šablony projektu. Tučně označené části doporučujeme změnit.

Vygenerovaný projekt již bude splňovat naše zadání. Nyní si popíšeme jeho jednotlivé části. Aby jste viděli výsledek, pustťe vše příkazem:

mvn jetty:run

a v prohlížeči zadejte adresu http://localhost:8080/.

Projekt se bude skládat z těchto souborů:

  • pom.xml – konfigurační soubor pro Maven. Obsahuje seznam potřebných knihoven.
  • src/main/webapp/css/screen.css – kaskádové styly
  • src/main/webapp/index.xhtml – stránka č. 1
  • src/main/webapp/hello.xhtml– stránka č. 2
  • src/main/webapp/WEB-INF/web.xml – konfigurace webové aplikace. Obsahuje také integraci JSF, Facelets a URL Rewriter.
  • src/main/webapp/WEB-INF/faces-config.xml– konfigurace pro JSF. Obsahuje integraci JSF s knihovnou Facelets.
  • src/main/webapp/WEB-INF/rewriter-config.xml – konfigurace pro URL Rewriter
  • src/main/webapp/WEB-INF/my-config.xml – konfigurace pro JSF.
  • src/main/webapp/WEB-INF/template/default.xhtml – šablona definující základní kostru aplikace
  • src/main/java/cz/softeu/test/HelloBean.java – java soubor reprezentující model
  • src/main/java/cz/softeu/test/HelloAction.java – java soubor reprezentující controller

Poznámka: adresář cz/softeu/test odpovídá groupId, které jste uvedli při generování projektu.

Nyní se podíváme na jednotlivé části.

Konfigurace

Protože je Java modulární systém, musí být jednotlivé komponenty (JSF+Facelets) správně propojeny. O to se starají soubory web.xml afaces-config.xml.

U webové aplikace by měli být URL dlouhodobě stabilní (aby odkazy na ní fungovaly i za 10 let), optimalizované pro vyhledávače, mělo by být možné je snadno nadiktovat do telefonu apod. K těmto účelům se pro apache používá modul mod_rewrite a pro Javu třeba URL Rewriter. Oba umožňují přepsat URL /index.jsf?typ=clanek&id=1 na krásnější /clanky/1/.

model

Modelem v této aplikaci je třída cz.softeu.test.HelloBean:

public class HelloBean {
    private String name;

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

Zde je jedna položka name typu String.

view

Pro tuto vrstvu použijeme JSF s Facalets. Protože by měli být všechny stránky ve stejném stylu, použijeme šablonu. Facelets nám k tomu nabízí mnoho možností. Vytvoříme si šablonu (/WEB-INF/template/default.xhtml):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:ui="http://java.sun.com/jsf/facelets">
<head>
    <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
    <title><ui:insert name="title"/> - helloApp </title>
    <link rel="stylesheet" type="text/css" href="#{facesContext.externalContext.requestContextPath}/css/screen.css"/>
</head>
<body>
    <ui:insert name="content" />
</body>
</html>

Všimněte si, prosím, příkazu <ui:insert name="title"/>, který umožňuje vkládat sekce. Ve stránce, která používá tuto šablonu, jen nadefinujeme obsah (<ui:define name="title">) požadované sekce stránky:

<?xml version="1.0" encoding="UTF-8"?>
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
        xmlns:ui="http://java.sun.com/jsf/facelets"
        xmlns:h="http://java.sun.com/jsf/html"
        xmlns:f="http://java.sun.com/jsf/core"
        template="/WEB-INF/template/default.xhtml">
<ui:define name="title">Hello World</ui:define>
<ui:define name="content">
            <h:form>
                <h2>Please enter your name: <h:inputText id="name" value="#{helloBean.name}" required="true"/></h2>
                <h:commandButton value="press me" action="#{helloAction.send}"/>
                <h:message for="name"/>
            </h:form>
</ui:define>
</ui:composition>

Atribut template="/WEB-INF/template/default.xhtml" určuje šablonu stránky. Lze tak používat více šablon.

Nyní se již podíváme na JSF. Začneme formulář příkazem <h:form>. Zde je použita komponenta <h:inputText/>. Obsahuje tyto atributy:

  • id – identifikujeme komponentu
  • value – určuje komponentu (#{helloBean.name})a její položku (více viz sekce controller)
  • required – položku je nutné vyplnit

Příkazem <h:message/> zobrazíme chybové zprávy pro zvolenou komponentu.
Ke komponentě lze uvést i validátory a tím lépe kontrolovat správnost zadávaných dat např.:

<h:inputText &dots; >
<f:validateLength minimum="2" maximum="25" /></h:inputText>

Nyní se podíváme na způsob jakým propojíme model s view. K těmto účelům nám poslouží soubor my-config.xml:

<faces-config>
    <managed-bean>
        <managed-bean-name>helloBean</managed-bean-name>
        <managed-bean-class>cz.softeu.test.HelloBean</managed-bean-class>
        <managed-bean-scope>request</managed-bean-scope>
    </managed-bean>
</faces-config>

Zde je uveden název komponenty (zde helloBean), její třída a rozsah – dobu života dané instance. Ta může nabývat hodnot:

  • request – jen po dobu jednoho požadavku (HTTP request)
  • session – po dobu HTTP session (identifikované cookie nebo přepsáním URL)
  • application – po celou dobu běhu aplikace pro všechny uživatele

Poznámka: obvykle se tato konfigurace zapisuje přímo do faces-config.xml. Nám se ovšem osvědčilo mít více konfiguračních souborů. Jejich seznam určujete ve web.xml.

controller

Nyní se podíváme jak vytvořit řídící část. Základem je třída cz.softeu.test.HelloAction:

package cz.softeu.test;

public class HelloAction {
    /**
     * Action method
     */
    public String send(){
        //do something real

        return ("success");
    }
}

Tato třída musí být opět namapována v souboru my-config.xml:

<faces-config>
    <managed-bean>
        <managed-bean-name>helloAction</managed-bean-name>
        <managed-bean-class>cz.softeu.test.HelloAction</managed-bean-class>
        <managed-bean-scope>request</managed-bean-scope>
    </managed-bean>
</faces-config>

Akce obsahuje metodu send, která bude zavolána po stisku tlačítka odeslat, tak jak je definováno v index.xhtml:

<h:commandButton value="press me" action="#{helloAction.send}"/>

Návratová hodnota této metody (typu String) identifikuje pohled, který bude použit po dokončení akce. Mapování mezi návratovou hodnotou a JSF stránkou uvedeme v my-config.xml:

<navigation-rule>
        <from-view-id>/index.xhtml</from-view-id>
        <navigation-case>
                <from-outcome>success</from-outcome>
                <to-view-id>/hello.xhtml</to-view-id>
        </navigation-case>
</navigation-rule>

Tato navigační pravidla nám umožňují přehledně zapisovat strukturu stránek a vazby mezi nimi. Protože se odeslání formuláře odesílá jako POST, je v některých případech dobré přesměrovat uživatele na stránku bez POST (tzv. redirect after POST) tak, aby mohl použít tlačítka Obnovit a Zpět. To zařídíte přidáním tagu <redirect /> do <navigation-case />.

Závěr

Dnes jsme si ukázali jak pracovat s Facelets a jak provázat model a controller s view.

Příště si ukážeme jak vytvářet průvodce (tzv. conversation scope) a jak snadno provázat model s controllerem. K tomu budeme používat knihovnu JBoss Seam.

23 thoughts on “Začínáme s Webovými stránkami v Javě 2”

  1. Jednu věc tomu nelze upřít. Je to mnohem složitější než udělat stejnou věc v PHP ;-),

    „K napsání tohoto záznamu mně inspirovala diskuse, že vývoj jednoduchých webových stránek v Javě je příliš složitý. Chtěl bych tedy ukázat, že i v Javě je to jednoduché“ – vzpomínáte?

    Ale těším se na pokračování, tohle přesně jsem potřeboval. Díky, jen tak dál.

  2. Tento seriál sa nemal volať „Začínáme s Webovými stránkami v Javě“ ale mal mať názov „Vytvárame rozsiahle webové aplikácie v Jave“.

    Vytváranie obyčajných a jednoduchých aplikácii v Jave – JSP, Servlety, Tag library – je jednoduché a myslím, že lepšie ako vytváranie PHP stránok. Keď začiatočník začne s JSF, tak je na najlepšie ceste aby sa zbláznil, stratil zamestnanie, rozviedol sa, utopil sa, ….

  3. JSP je jedna z technologií, kterou lze používat pro JSF také. Její výhodou je větší podobnost s PHP.

    Bohužel pokud ovšem začnete s JSF pracovat více, objeví se problémy s různým přístupem JSF a JSP ke zpracování stránky. Proto zde popisuji především Facelets.

    Webovou prezentaci firmy lze pomocí Facelets udělat velmi snadno (díky šablonám).

    A těch několik „aktivních“ částí (např. poptávkový formulář s emailem, novinky, …) lze s JSF udělat stejně snadno.

  4. > Petr Zajíc
    > Jednu věc tomu nelze upřít. Je to mnohem složitější než udělat stejnou věc v PHP ;-),

    No, udělat něco co zobrazí pozdrav jednodušší určitě bude 🙂 (ale to i v JSP 🙂

    Když ale začnete dělat složitější aplikaci, potřebujete i v PHP šablonovací systém (pamatujete MVC), AJAX knihovny, CRUD, přístup do databáze, ORM (i to pro PHP je), …

    A tam již ten rozdíl není 🙂

    Ale máte pravdu – mělo by se porovnávat s větší aplikací než je ta ilustrační.

  5. Zdravím,

    spot fajn, ale ukazuje, jak je JSF složité a ztuha konfigurovatelné. Asi bych to raději zakázal číst někomu, kdo by chtěl přecházet z PHP na JSF/JSP. Navíc v češtině neexistuje jediná kniha o JSF.

    P.S. .NET je na tom úplně stejně, akorát je tady o ASP.NET spousta českých knih.

  6. to: Petr Ferschmann
    Máš sice pravdu, že všechny tyto možnosti v PHP existují, ale v jaké kvalitě? Navíc celé JSP je téměř od začátku navržené jako MVC, což je ohromná výhoda. JSF jen umocňuje tento základ a snaží se dělat věci efektivněji a lépe. Myslím, že nic jako JSF či JPA v PHP nikdy nevznikne. A jestli ano a bude to kvalitní, demostrativně se nahý proběhnu po Václaváku 😀
    Já osobně začal rovnou na JSF, je pravda, že jsem momentálně ve velkém chaosu, ale již nyní vidím nesporné výhody oproti skriptování v PHP.
    Jinak všem, které JSF zajímá, doporučuji knihu: „JSF in Action“.

  7. Co vidíte složitého na tom, pustit příkaz:

    mvn archetype:create -DarchetypeArtifactId=softeu-archetype-jsf
    -DremoteRepositories=http://maven.softeu.cz/
    -DgroupId=cz.softeu.test -DartifactId=helloApp

    A začít implementovat stránky? Navíc to obsahuje i integrovaný web server (pustíte příkazem mvn jetty:run).

    Pro PHP také potřebujete webový server a jeho integraci s PHP. Navíc instalaci mod_rewrite (. Také potřebujete doplnit moduly do PHP a knihovnu PEAR, …. Je to jednoduché hlavně proto, že to za vás již udělal distributor resp. poskytovatel webhostingu (a jeho distributor :-).

  8. Tento zpusob programovani zda se mi ponekud nestastny …
    Docela by me zajimalo kolik lidi si zkusi uvedeny postup, pomoci copy/paste vytvori primitivnost a ona bude chodit, a zacnou se povazovat za java guru, lide, kteri bez googla nejsou schopni napsat ani HelloWorld.
    Jen doufam ze se mi nedostane pod ruku kod takoveho guru, ktery budu muset opravovat :-D…

  9. Mam dotaz, kdyz pustim kod jak je napsan v prikladu

    (mvn archetype:create -DarchetypeArtifactId=softeu-archetype-jsf
    -DremoteRepositories=http://maven.softeu.cz/
    -DgroupId=cz.softeu.test -DartifactId=helloApp)

    tak se mi to vyhodi ze si musim stahnout to jar od tebe a nainstalovat do localni repository.

    Kdyz jsem ale zkopiroval ten priklad z komentare pondeli (vypada stejny jako ten predtim) ale do widowsi console se mi to nasackovalo s pomlckama takto:

    mvn archetype:create -DarchetypeArti-factId=softeu-archetype-jsf -DremoteReposi-­tories=http://ma-­ven.softeu.cz/ -DgroupId=cz.sof-­teu.test -DartifactId=he­lloApp

    tak vse probehlo bez problemu. Vytvorila se kostra bez jakeho-koli varovani o instalaci dodatecneho jarka.

    Zni to divne, ale nemam pro to vysvetleni. Muze mi to nekdo vysvetlit?

  10. Petre mu predchozi komentar zmas. Neni aktualni. Sice vytvoreni projektu probehne, ale je to bezny create archetype (1 java file a 1 junit file)

    Takze se ptam proc kdyz spustim ten prikaz tak se mi vypise ze „Failed to resolve artifact“ a chce at ho stahnu softeu-archetype-jsf jarko a nainstaluji do localni repositary.

    tady je vypis:

    [INFO] [archetype:create]
    [INFO] Defaulting package to group ID: cz.sofşteu.test
    [INFO] ————————————————————————
    [ERROR] BUILD ERROR
    [INFO] ————————————————————————
    [INFO] Failed to resolve artifact.

    GroupId: org.apache.maven.archetypes
    ArtifactId: softeu-archetype-jsf
    Version: RELEASE

    Reason: Unable to determine the release version

    Try downloading the file manually from the project website.

    Then, install it using the command:
    mvn install:install-file -DgroupId=org.apache.maven.archetypes -DartifactId=softeu-archetype-jsf
    -Dversion=RELEASE -Dpackaging=jar -Dfile=/path/to/file

    org.apache.maven.archetypes:softeu-archetype-jsf:jar:RELEASE

    [INFO] ————————————————————————
    [INFO] For more information, run Maven with the -e switch

  11. Zdravím,

    za ty pomlčky může kombinace Texy! a prohlížečů. Texy! je aktivní a doplňuje místo, kde se smí zalomit. Prohlížeč tam ovšem při kopii doplní pomlčky.

    Teď k vašemu problému. Prosím zkontrolujte správnost příkazu (hlavně ty pomlčky :-), a že je zde uveden parametr -DremoteRepositories=http://maven.softeu.cz/ . Tím se říká, odkud se má kostra stáhnout. Možná to asi celé dejte i na jeden řádek.
    Pokud to nepomůže, zkuste spustit celý příkaz znovu, ale přidejte parametr -cpu . Tím by si měl zaktualizovat cache.

    Pokud ani to nepomůže, tak doporučuji promazat cache Mavenu ($HOME/.m2/repository).

  12. ahoj
    tak pomohlo az premazani repository. Divne nevim ktery package mu tohleto delal.
    Dik za tip.

  13. Dobrý článek.
    Měl bych malý dotaz k JSF + Facelets. Zkoušel jsem tuto kombinaci už dříve, ale narazil jsem na takovou drobnou nepříjemnost. Když vytvořím pomocí facelets tagů a xhtml souborů nějakou šablonu, kde použivám direktivu ui:include pro vložení navigace, hlavičky a patičky stránky. První problém byl, že vkladaný xhtml soubor musel být v kódování utf8, jinak se vyvolala vyjímka při nahrávání stránky. To by nebyl takový problém, jelikož stačilo změnit kódování na utf8. Stránky se teďka v pořádku načtou, ale všechny háčky a čárky jsou escapovány pomocí &aacute; atd.. Je to nepříjemné, když se podívám na zdrojový kód stránky a vidím tam tyto escapované sekvence. Jako by ty stránky byly v jiném kódování než utf8, ale přitom všude uvádím utf8. Nevíte někdo tedy, kde bych toto mohl vypnout nebo kde dělám chybu?
    Předem děkuji za odpověď.
    Jakub

  14. Ahoj,
    Předem bych rád upozornil na to, že NECHCI vyvolat flamewar, ale jen dát dobrou radu začátečníkům, kteří se chystají učit programovat webové aplikace v Javě.
    Pokud se zde někdo začíná učit programovat webovky, rozhodně mu doporučuji, ať alespoň vyzkouší ASP.NET 2 (pro nějž je také zdarma VELMI kvalitní vývojové prostředí Visual Web Developer Express, také s integrovaným testovacím serverem zdarma).
    Je to dnes nejmodernější technologie, která poskytuje přístup k tvorbě webu na uplně jiné úrovni – mě přechod od PHP či Javy k ASP.NET připadá jako přechod od strukturovaného programování k objektovému…
    Úplnému začátečníkovy je stejně jedno, kterou platformu zvolí, protože obje chtějí pro zvládnutí určité nemalé úsilí. A kdo se rozhodne pro .NET, za čas zjistí jak moc udělal dobře! Viz. všechny vymoženosti, např. DataBinding, systém providerů, UserControls,Reflexe (budete se možná divit, ale i na webu má reflexe velmi šikovné využití!) atd atd atd atd

  15. Zdravím,

    rozhodně věřím, že přechod od PHP k ASP.NET 2 musel být výborný. Osobně si ale myslím, že stejného efektu dosáhnete pokud přejdete od JSP ke komponentovému systému (např. JSF + Seam).

    Úplnému začátečníkovi je jedno jakou platformu zvolí do té doby, než bude chtít službu provozovat na Linuxu.

    Musím říct, že bez reflexe si dnes již nedokážu představit programování 🙂

  16. Stránky se teďka v pořádku načtou, ale všechny háčky a čárky jsou escapovány pomocí &aacute; atd.. Je to nepříjemné, když se podívám na zdrojový kód stránky a vidím tam tyto escapované sekvence. Jako by ty stránky byly v jiném kódování než utf8, ale přitom všude uvádím utf8.

    Toto je známá chyba v MyFaces. Bohužel jsem zatím nepřišel na to jak jí odstranit – na druhou stranu mně to ani moc netrápí.

    Odkaz na bug:
    http://issues.apache.org/jira/browse/MYFACES-1396

  17. mvn archetype for seamgen => exactly what I needed. Thank YOU very much!!
    Just tried your jsf+facelets+seam archetype, i got some warnings bout undefined properties (ex. seam.version) & checksum errors, and one velocity template could not be found. Can you tell me, is this something to worry bout? At least, in generated pom.xml there is seam.version defined.
    cheerio from stuttgart, germany – migatux.

    [miga@regio-nb mvn-projects]$ mvn archetype:create -DarchetypeArtifactId=softeu-archetype-seam -DremoteRepositories=http://maven.softeu.cz/ -DgroupId=cz.softeu.test -DartifactId=helloApp2
    [INFO] Scanning for projects…

    (…)

    [INFO] Setting property: classpath.resource.loader.class => ‚org.codehaus.plexus.velocity.ContextClassLoaderResourceLoader‘.
    [INFO] Setting property: velocimacro.messages.on => ‚false‘.
    [INFO] Setting property: resource.loader => ‚classpath‘.
    [INFO] Setting property: resource.manager.logwhenfound => ‚false‘.
    [INFO] **************************************************************
    [INFO] Starting Jakarta Velocity v1.4
    [INFO] RuntimeInstance initializing.
    [INFO] Default Properties File: org/apache/velocity/runtime/defaults/velocity.properties
    [INFO] Default ResourceManager initializing. (class org.apache.velocity.runtime.resource.ResourceManagerImpl)
    [INFO] Resource Loader Instantiated: org.codehaus.plexus.velocity.ContextClassLoaderResourceLoader
    [INFO] ClasspathResourceLoader : initialization starting.
    [INFO] ClasspathResourceLoader : initialization complete.
    [INFO] ResourceCache : initialized. (class org.apache.velocity.runtime.resource.ResourceCacheImpl)
    [INFO] Default ResourceManager initialization complete.
    [INFO] Loaded System Directive: org.apache.velocity.runtime.directive.Literal
    [INFO] Loaded System Directive: org.apache.velocity.runtime.directive.Macro
    [INFO] Loaded System Directive: org.apache.velocity.runtime.directive.Parse
    [INFO] Loaded System Directive: org.apache.velocity.runtime.directive.Include
    [INFO] Loaded System Directive: org.apache.velocity.runtime.directive.Foreach
    [INFO] Created: 20 parsers.
    [INFO] Velocimacro : initialization starting.
    [INFO] Velocimacro : adding VMs from VM library template : VM_global_library.vm
    [ERROR] ResourceManager : unable to find resource ‚VM_global_library.vm‘ in any resource loader.
    [INFO] Velocimacro : error using VM library template VM_global_library.vm : org.apache.velocity.exception.ResourceNotFoundException: Unable to find resource ‚VM_global_library.vm‘
    [INFO] Velocimacro : VM library template macro registration complete.
    [INFO] Velocimacro : allowInline = true : VMs can be defined inline in templates
    [INFO] Velocimacro : allowInlineToOverride = false : VMs defined inline may NOT replace previous VM definitions
    [INFO] Velocimacro : allowInlineLocal = false : VMs defined inline will be global in scope if allowed.
    [INFO] Velocimacro : initialization complete.
    [INFO] Velocity successfully started.
    [INFO] [archetype:create]
    [INFO] Defaulting package to group ID: cz.softeu.test
    [INFO] We are using command line specified remote repositories: http://maven.softeu.cz/
    [INFO] artifact org.apache.maven.archetypes:softeu-archetype-seam: checking for updates from id0
    [WARNING] *** CHECKSUM FAILED – Checksum failed on download: local = ’21cc507862eeed86845efd2e106e67fef31d60db‘; remote = ‚5bf305724e39dd3fd49efdb9faf949c307287e39′ – RETRYING
    [WARNING] *** CHECKSUM FAILED – Checksum failed on download: local = ’21cc507862eeed86845efd2e106e67fef31d60db‘; remote = ‚5bf305724e39dd3fd49efdb9faf949c307287e39‘ – IGNORING
    Downloading: http://maven.softeu.cz//org/apache/maven/archetypes/softeu-archetype-seam/1.5.8/softeu-archetype-seam-1.5.8.jar
    18K downloaded
    [INFO] —————————————————————————-
    [INFO] Using following parameters for creating Archetype: softeu-archetype-seam:RELEASE
    [INFO] —————————————————————————-
    [INFO] Parameter: groupId, Value: cz.softeu.test
    [INFO] Parameter: packageName, Value: cz.softeu.test
    [INFO] Parameter: basedir, Value: /home/miga/work/src/java/mvn-projects
    [INFO] Parameter: package, Value: cz.softeu.test
    [INFO] Parameter: version, Value: 1.0-SNAPSHOT
    [INFO] Parameter: artifactId, Value: helloApp2
    [WARNING] org.apache.velocity.runtime.exception.ReferenceException: reference : template = archetype-resources/pom.xml [line 152,column 34] : ${seam.version} is not a valid reference.
    [WARNING] org.apache.velocity.runtime.exception.ReferenceException: reference : template = archetype-resources/pom.xml [line 158,column 34] : ${seam.version} is not a valid reference.
    [WARNING] org.apache.velocity.runtime.exception.ReferenceException: reference : template = archetype-resources/pom.xml [line 164,column 34] : ${seam.version} is not a valid reference.
    [WARNING] org.apache.velocity.runtime.exception.ReferenceException: reference : template = archetype-resources/pom.xml [line 170,column 34] : ${seam.version} is not a valid reference.
    [WARNING] org.apache.velocity.runtime.exception.ReferenceException: reference : template = archetype-resources/pom.xml [line 176,column 34] : ${seam.version} is not a valid reference.
    [WARNING] org.apache.velocity.runtime.exception.ReferenceException: reference : template = archetype-resources/pom.xml [line 182,column 34] : ${seam.version} is not a valid reference.
    [WARNING] org.apache.velocity.runtime.exception.ReferenceException: reference : template = archetype-resources/pom.xml [line 310,column 50] : ${seam.version} is not a valid reference.
    [WARNING] org.apache.velocity.runtime.exception.ReferenceException: reference : template = archetype-resources/pom.xml [line 332,column 50] : ${seam.version} is not a valid reference.
    [WARNING] org.apache.velocity.runtime.exception.ReferenceException: reference : template = archetype-resources/pom.xml [line 356,column 68] : ${env.JBOSS_HOME} is not a valid reference.
    [INFO] ********************* End of debug info from resources from generated POM ***********************
    [WARNING] org.apache.velocity.runtime.exception.ReferenceException: reference : template = archetype-resources/src/main/resources-filter/META-INF/persistence.xml [line 12,column 57] : ${hibernate.hbm2ddl.auto} is not a valid reference.
    [WARNING] org.apache.velocity.runtime.exception.ReferenceException: reference : template = archetype-resources/src/main/resources-filter/META-INF/persistence.xml [line 13,column 53] : ${hibernate.show_sql} is not a valid reference.
    [WARNING] org.apache.velocity.runtime.exception.ReferenceException: reference : template = archetype-resources/src/main/resources-filter/META-INF/persistence.xml [line 14,column 60] : ${hibernate.jdbc.batch_size} is not a valid reference.
    [WARNING] org.apache.velocity.runtime.exception.ReferenceException: reference : template = archetype-resources/src/main/resources-filter/META-INF/persistence.xml [line 16,column 52] : ${hibernate.dialect} is not a valid reference.
    [WARNING] org.apache.velocity.runtime.exception.ReferenceException: reference : template = archetype-resources/src/main/resources-filter/META-INF/persistence.xml [line 21,column 73] : ${hibernate.cache.use_second_level_cache} is not a valid reference.
    [WARNING] org.apache.velocity.runtime.exception.ReferenceException: reference : template = archetype-resources/src/main/resources-filter/META-INF/persistence.xml [line 22,column 70] : ${hibernate.transaction.factory_class} is not a valid reference.
    [WARNING] org.apache.velocity.runtime.exception.ReferenceException: reference : template = archetype-resources/src/main/resources-filter/META-INF/persistence.xml [line 23,column 77] : ${hibernate.transaction.manager_lookup_class} is not a valid reference.
    [WARNING] org.apache.velocity.runtime.exception.ReferenceException: reference : template = archetype-resources/src/main/resources-filter/META-INF/jboss-beans.xml [line 8,column 57] : ${jboss.datasource.class} is not a valid reference.
    [WARNING] org.apache.velocity.runtime.exception.ReferenceException: reference : template = archetype-resources/src/main/resources-filter/META-INF/jboss-beans.xml [line 9,column 34] : ${jdbc.driverClass} is not a valid reference.
    [WARNING] org.apache.velocity.runtime.exception.ReferenceException: reference : template = archetype-resources/src/main/resources-filter/META-INF/jboss-beans.xml [line 10,column 36] : ${jdbc.url} is not a valid reference.
    [WARNING] org.apache.velocity.runtime.exception.ReferenceException: reference : template = archetype-resources/src/main/resources-filter/META-INF/jboss-beans.xml [line 11,column 63] : ${jdbc.username} is not a valid reference.
    [WARNING] org.apache.velocity.runtime.exception.ReferenceException: reference : template = archetype-resources/src/main/resources-filter/META-INF/jboss-beans.xml [line 12,column 63] : ${jdbc.password} is not a valid reference.
    [WARNING] org.apache.velocity.runtime.exception.ReferenceException: reference : template = archetype-resources/src/main/resources/log4j.xml [line 10,column 6] : $Id is not a valid reference.
    [WARNING] org.apache.velocity.runtime.exception.ReferenceException: reference : template = archetype-resources/pom.xml [line 152,column 34] : ${seam.version} is not a valid reference.
    [WARNING] org.apache.velocity.runtime.exception.ReferenceException: reference : template = archetype-resources/pom.xml [line 158,column 34] : ${seam.version} is not a valid reference.
    [WARNING] org.apache.velocity.runtime.exception.ReferenceException: reference : template = archetype-resources/pom.xml [line 164,column 34] : ${seam.version} is not a valid reference.
    [WARNING] org.apache.velocity.runtime.exception.ReferenceException: reference : template = archetype-resources/pom.xml [line 170,column 34] : ${seam.version} is not a valid reference.
    [WARNING] org.apache.velocity.runtime.exception.ReferenceException: reference : template = archetype-resources/pom.xml [line 176,column 34] : ${seam.version} is not a valid reference.
    [WARNING] org.apache.velocity.runtime.exception.ReferenceException: reference : template = archetype-resources/pom.xml [line 182,column 34] : ${seam.version} is not a valid reference.
    [WARNING] org.apache.velocity.runtime.exception.ReferenceException: reference : template = archetype-resources/pom.xml [line 310,column 50] : ${seam.version} is not a valid reference.
    [WARNING] org.apache.velocity.runtime.exception.ReferenceException: reference : template = archetype-resources/pom.xml [line 332,column 50] : ${seam.version} is not a valid reference.
    [WARNING] org.apache.velocity.runtime.exception.ReferenceException: reference : template = archetype-resources/pom.xml [line 356,column 68] : ${env.JBOSS_HOME} is not a valid reference.
    [INFO] Archetype created in dir: /home/miga/work/src/java/mvn-projects/helloApp2
    [INFO] ————————————————————————
    [INFO] BUILD SUCCESSFUL
    [INFO] ————————————————————————
    [INFO] Total time: 40 seconds
    [INFO] Finished at: Tue Apr 24 22:26:37 CEST 2007
    [INFO] Final Memory: 5M/9M
    [INFO] ————————————————————————
    [miga@regio-nb mvn-projects]$

  18. Ahoj,

    pred pul rokem jsem se zacal ucit JSF a jsem z toho docela zoufaly, jsem porad prakticky na zacatku. Delal jsem v tom bakalarku a dost pravdepodobne ji neobhajim a to pochybuju, ze nektery z kolegu se svou praci stravil polovinu casu, co ja :-/.

    Ale k veci, rad bych vyuzil prilezitosti a zkusil zjistit, kde jsem udelal chybu, respektive jake nastroje a postupy se vam osvedcily.

    Moje „konfigurace“: Windows XP + Netbeans 5.5 + Tomcat 5.5.17.

    1) vyvojove prostredi: Netbeans je velky zrout vykonu, pameti spotrebuje az cca 250 MB, pred mesicem jsem dokoupil do notebooku gigovku… Ale nemel jsem odvahu ztracet cas s ucenim se ovladani noveho prostredi. Respektive, chtel jsem zkusit Eclipse, jakozto asi jediny srovnatelny program, ale pry je tam podpora webove javy dost slozita a schudne je to jen s nejakym WebLogic rozsirenim. Tam je potreba se registrovat, aby mel clovek program na mesicni vyzkouseni. Ale ani po opakovane registraci mi nic neposlali!

    2) Server: Kamarad me varoval pred neSunima serverama. Jenze Sun Java Server je desne pomaly, aspon u me. Startuje se 10min! Beh aplikace jsem ani nezkousel. Glassfish neni standardne podporovany. Nestandardne se mi to nepodarilo rozchodit. Zbyl Tomcat. Az tohle skonci, s Tomcatem se nadobro rozloucim. Napr. po opakovanem nahravani aplikace dojde pamet a server spadne. Jednak to do urcite verze (tusim) Javy ani nenapsalo pricinu, takze jsem nekolik dni stravil marnym hledanim chyby, jednak s tim nejde nic delat, jedine restartovat server. Server totiz udajne neuklizi undeploynute aplikace, takze tam zustavaji a zabiraji tu pamet. Se stejnou potizi se kamarad setkal na jBossu. Zrejme se s tim asi opravdu neda nic delat. No nemam slov…

    3) hlaseni chyb ve strance typu zdvojena ID komponent (hricky Netbeansu!) nebo neplatna reference na metodu v backing beanu: vyhodi mi to chybovou stranku, na ktere neni zhola nic o pricine. Nic neni na vystupu, nic neni v logu serveru. Na logovani vyjimek pouzivam jen vlastni tridu, vypise vyjimku na vystup, ale pochybuju, ze by mi v tomhle nejak pomohl treba log4j, nebo se mylim?

    PHP je o necem jinem a je to otrocina, ale clovek ma vsechno pod kontrolou… To, co jsem zkousel v JSF pul roku, bych mel v PHP za vikend. Trosku znam i ASP.NET a prinejmensim vyvojove prostredi (MS Visual Studio) si nemuzu vynachvalit.

    Neberte to prosim nikdo jako utok. Jen se snazim 1) zjistit, kde je chyba, 2) varovat ty, kdo se octnou v podobne situaci jako ja pre pul rokem – ja jsem tehdy jen cetl, jak je JSF super…

  19. 2 Honza: no, tady je videt „learning curve“. Presne v tyhle situaci je lepsi pracovat v teamu, kde mas aspon nejakyho „guru“ kterej ti pomuze, a veci ktery sam resis tyden, mas za 5 minut hotovy. Vsechny 3 problemy co popisujes bys mel poreseny po konzultaci s tim „guru“ – proste s nekym kdo v tom dela vic….
    Zase na druhou stranu ty zkusenosti co timzpusobem co ted pracujes ziskas jsou uplne k nezaplaceni.
    Mozna se zkus domluvit v nejaky firme na nejakym zpusobu spoluprace – ze k nim budes chodit obcas na nejaky konzultace (s predem pripravenejma problemama), a oplatkou za to u nich treba po skole/o prazdninach muzes nastoupit – uz te budou mit „proklepnutyho“, ale hlavne vyskolenyho.
    Pokud budes mit nejaky dotazy, ozvi se mi, treba budu umet poradit:-). Jo, a log4j rozhodne pouzij, pripadne se podivej na jetty….

  20. 2 Jindra: Díky za tipy. Dneska jsem zase o cosi moudřejší, nějaké zkušenosti jsem při tom posbíral, to je pravda. (Ale měl bych si to radši napsat :). )

  21. 2 Honza: Naprosto souhlasím s Jindoru. JSF samotné není na zvládnutí složitá technologie. Ale v takové aplikaci většinou používáš mnoho dalších pokročilejších knihoven a api, které spolu interagují a už jen design se rozvine v poměrně komplexní úlohu. Proto je v podobných situacích ideální mít v dosahu nějakého specialistu, který ti ušetří mnoho hodin googlování.

    Ad Vývojové prostředí
    Ačkoliv na tom Eclipse není o mnoho „lépe“ (to není dobré slovo – lepší je slovo „jinak“) než NetBeans co se týče paměti (prostě si vezmou co mají, pokud jim to nezakážete), mohu vřele doporučit pro vývoj JSF aplikací Eclipse + Exadel Studio, které by mělo být někdy od léta free dokonce v Pro verzi (http://www.exadel.com/). Stáhne si s sebou i WTP (Web Tools Platform) čímž získáte jednu z nejlepších platforem pro ladění web aplikací.

    Ad Server
    Osobně pro vývoj používám Tomcat a to opět kvůli podpoře a integraci s WTP. Exadel studio ti ještě přidá pár ovládacích prvků, takže spouštění serveru přímo z Eclipsu je sranda.

    Ad Logování
    Rozhodně přejdi na Log4j.

    Tož hodně štěstí s tým pertinaxom 🙂

    Dařbič

  22. A ještě ahoj všem a pár slov k článku.

    Srovnávání technologií J2EE, ASP.NET, PHP, … pochopitelně nemá nějakého valného smyslu. A ke komentářím článku podobného ražení nepatří. Ani já nebudu obhajovat žádnou z uvedených technologií, ale rád bych podpořil Petra v jeho snaze, kterou perfektně vystihuje název seriálu: „Začínáme s webovými aplikacemi v Javě“. Stejně jako jsou rozdílné technologie J2EE a PHP, jsou také rozdílné aplikace v nich implementované. A to rozhodně ne kvalitou! Ale rozsahem, požadavky na výkonnost, škálovatelnost, bezpečnost, … A právě proto tady vlastně různé technologie máme 🙂 Chtěl jsem tím říci to, že Petr zvolil naprosto správnou cestu, jak opravdu začít psát webové aplikace na platformě Java. Samozřejmě jde o jednu z možných alternativ, ale i tak se jedná o cenné informace. Pokud se rozhodnete pro Javu, JSF & spol. máte k tomu samozřejmě opodstatněné důvody. A taková aplikace rozhodně nezůstane v dimenzích několika stránek a bez potřeby SCM nástroje. Pokud by se Petr vydal při výkladu cestou, kterou nás šlo mnoho z nás včetně mě a třeba i Honzy (Honzo ve vší úctě) – „sednu a chci aby se mi objevilo moje první faceletí hello world v browseru“, pravděpodobně bysme skončili po pár hodinách znechucení z toho, že musíme používat čím dál více nástrojů, knihoven, apod. Proč sakra nemůžu ten e-shop napsat ve stejném prostředí a s podporou stejných knihoven jako ten hello world? (s nadsázkou se to lezkdy lépe vysvětluje :-). Tedy je dobré hned od začátku vědět, co je Maven, jak správně nakonfigurovat server a s čím to můžu integrovat abych nemusel vynalézat kolo. Moje dvouletá dcera si také umí pustit DVD, kdežto já v jejích letech neuměl pustit televizi (jo, tady může být i jiný důvod :-).
    No, snad někdo pochopil co jsem chtěl říci, ale každopádně: Petře jen tak dál.

    Dařbič

Napsat komentář

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