Wykorzystaj w pełni możliwości programowania obiektowego.
Dowiedz się więcej o możliwościach Egg Framework oraz porównaj go z istniejącymi technologiami.
Przejrzyj dokumentację API zawierającą szczegółowe opis każdej klasy oraz metody.
Przejdź krok po kroku przez proces tworzenia projektów w Egg Framework.
Dowiedz się więcej o każdym z elementów Egg Framework.
Uwaga, artykuł jest w trakcie edycji.
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>
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.
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; } }
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); } }
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()); } }
Akapit w trakcie edycji
Akapit w trakcie edycji
Akapit w trakcie edycji
Akapit w trakcie edycji