Wykorzystaj w pełni możliwości programowania obiektowego.

1 Dlaczego Egg?

Dowiedz się więcej o możliwościach Egg Framework oraz porównaj go z istniejącymi technologiami.

2 Javadoc

Przejrzyj dokumentację API zawierającą szczegółowe opis każdej klasy oraz metody.

3 Artykuły

Przejdź krok po kroku przez proces tworzenia projektów w Egg Framework.

4 Podręcznik

Dowiedz się więcej o każdym z elementów Egg Framework.

Uwaga, artykuł jest w trakcie edycji.

Pierwsza strona

Aby stworzyć stronę HTML wystarczy utworzyć klasę dziedziczącą po klasie Html. W jej konstruktorze zaś należy uruchomić metody dodające elementy, takie jak body. Poniższy przykład prezentuje prostą stronę Hello World! Specjalnie do celów testowych dodano statyczną metodę main, w której tworzona jest instancja strony i wyświetlana w konsoli.

package org.eggframework2.view.examples.xhtml;

import org.eggframework2.view.elements.xhtml.tags.Body;
import org.eggframework2.view.elements.xhtml.tags.Html;

public class HelloWorldHtml extends Html {

    public HelloWorldHtml() {
        add(new Body("Hello world!"));
    }
   
    public static void main(String[] args) {
        HelloWorldHtml html = new HelloWorldHtml();
        System.out.println(html);
    }

}

Na konsoli zostanie wypisane:

<html>
<body>Hello world!</body>
</html>

Komponent wykorzystujący szablony

Komponenty tworzy się podobnie jak same strony. Wystarczy napisać klasę dziedziczącą po odpowiedniej klasie znacznika np. Span, Div, P. Dzięki takiemu podejściu własne komponenty tworzy się w rekordowo krótkim czasie co sprzyja obiektowemu tworzeniu systemu.

Tworzenie layout'u stron na za pomocą kodu Javy nie jest jednak zbyt wygodne. W przypadku skomplikowanych układów graficznych może to być nielada udręką. Na szczęscie w Egg Framework istnieje mechanizm szablonów, który problem ten rozwiązuje. Dzięki niemu poszczególne części strony mogą być dołączane bezpośrednio z plików XML. Każdy komponent będący rodzicem (czyli także strona Html) może korzystać z tego mechanizmu aby dołączyć do swoich potomków element powstały z szablonu.

Po dodaniu szablonu, można się odwoływać do jego znaczników po ID. Każdy znacznik posiadający unikalny atrybut ID może być odczytany i zmodyfikowany w kodzie Javy.

package org.eggframework2.view.examples.xhtml;

import java.io.IOException;

import org.eggframework2.view.elements.xhtml.tags.Div;
import org.eggframework2.view.elements.xhtml.tags.P;

public class TemplateElementExample extends P {

    public TemplateElementExample() throws IOException {
        addElementFromTemplate(TemplateElementExample.class.getResource("template.xhtml"));
        Div layer1 = (Div) getElementWithId("layer1");
        layer1.addText("-added content-");
    }

    public static void main(String[] args) throws IOException {
        TemplateElementExample example = new TemplateElementExample();
        System.out.println(example);
    }
}

Szablon template.xhtml:

<div>
    <b>Some template</b>
    <div id="layer1">Layer 1</div>
    <div id="layer2">Layer 2</div>
</div>

Na konsoli zostanie wypisane:

<p>
<div>
<b>Some template</b>
<div id="layer1">Layer 1-added content-</div>
<div id="layer2">Layer 2</div>
</div>
</p>

Szablony należy jednak stosować z umiarem. Mechanizm ten powstał przede wszystkim aby przyspieszał proces tworzenia layoutu. Ze względu na ograniczenia języka znaczników nie powinien być stosowany do tworzenia właściwej treści strony - za to odpowiedzialne powinny być klasy Javy. Dzięki temu będzie można wykorzystać w pełni możliwości programowania obiektowego.

Tworzenie strony i inicjalizacja

Stronę utworzyć można za pomocą operatora new. Jednak takie podejście jest bardzo ograniczone. Nie można bowiem w łatwy sposób dodać kodu uruchamianego przed i po utworzeniu każdej strony. Trzeba także ręcznie inicjalizować stronę uruchamiając jej metodę init. Metodę tą posiada każda strona. W niej powinien znaleźć się kod, który umieszczony w konstruktorze nie zadziałałby ze względu na brak danych w tworzonej instancji.

Interfejs SiteFactory definiuje fabrykę tworzącą i inicjalizującą strony.

SiteFactoryExample.java:

package org.eggframework2.view.examples;

import java.util.HashMap;

import org.eggframework2.view.SiteCreatorException;
import org.eggframework2.view.SiteFactory;
import org.eggframework2.view.SiteFactoryException;
import org.eggframework2.view.SiteFactoryImpl;

public class SiteFactoryExample {

    public static void main(String[] args) throws SiteFactoryException, SiteCreatorException, ClassNotFoundException,
            InstantiationException, IllegalAccessException {
        SiteFactory factory = new SiteFactoryImpl();
        SiteExample site = (SiteExample) factory.create(SiteExample.class.getName(), null);
        System.out.println(site.isInited());
    }

}

SiteExample.java:

package org.eggframework2.view.examples;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.eggframework2.view.OutputBuilder;
import org.eggframework2.view.elements.Site;

public class SiteExample implements Site {

    private Log log = LogFactory.getLog(SiteExample.class);

    private boolean inited;

    public void init() {
        log.info("Site was initialized");
        inited = true;
    }

    public void marshal(OutputBuilder builder) {
        log.info("Marshaling site");
        builder.append("<root>SITE EXAMPLE</root>");
    }

    public boolean isInited() {
        return inited;
    }

}

Kontekst strony

Strona lub jej komponenty mogą korzystać z informacji kontekstowych (np. konfiguracji, usług itp.). Jest to możliwe dzięki wykorzystaniu kontekstu strony. Jest to jeden obiekt na całą aplikację (podobnie jak atrybut aplikacyjny znany z serwletów) implementujący interfejs SiteContext. Można go pobrać za pomocą statycznej metodzy SiteContextUtils.getSiteContext.

SiteContextAwareSite.java:

package org.eggframework2.view.examples;

import org.eggframework2.view.OutputBuilder;
import org.eggframework2.view.SiteContext;
import org.eggframework2.view.SiteContextUtils;
import org.eggframework2.view.ViewConfiguration;
import org.eggframework2.view.elements.Site;

public class SiteContextAwareSite implements Site {

    private String encoding;

    public void init() {
        SiteContext ctx = SiteContextUtils.getSiteContext();
        ViewConfiguration viewConfiguration = ctx.getViewConfiguration();
        encoding = viewConfiguration.getCharsetEncoding();
    }

    public void marshal(OutputBuilder builder) {
        builder.append("Charset Encoding is set to " + encoding);
    }

}

Szeregowanie elementów

Dotychczas elementy wyświetlane były na konsoli poprzez niejawne wywołanie metody toString(). Każdy element nadpisuje tę metodę zwracając łańcuch tekstowy zawierający swoją reprezentację w postaci języka znaczników. Jest to przydatna cecha, jednakże ze względu na niemożliwość powinno się z niej korzystać tylko do celów testowych.

Szeregowanie zarówno strony jak i elementów wchodzących w jej skład obywa się za pomocą implementacji interfejsu ElementMarshaller.

package org.eggframework2.view.examples;

import java.util.HashMap;

import org.eggframework2.view.SiteCreatorException;
import org.eggframework2.view.SiteFactory;
import org.eggframework2.view.SiteFactoryException;
import org.eggframework2.view.SiteFactoryImpl;

public class SiteFactoryExample {

    public static void main(String[] args) throws SiteFactoryException, SiteCreatorException, ClassNotFoundException,
            InstantiationException, IllegalAccessException {
        SiteFactory factory = new SiteFactoryImpl();
        SiteExample site = (SiteExample) factory.create(SiteExample.class.getName(), null);
        System.out.println(site.isInited());
    }

}

Walidacja strony

Akapit w trakcie edycji

Walidacja XHTMLowymi walidatorami

Akapit w trakcie edycji

Wykorzystanie automatycznego przeładowywania

Akapit w trakcie edycji

Uruchamianie serwera wbudowanego

Akapit w trakcie edycji