Apache Shale
Upcoming SlideShare
Loading in...5
×
 

Apache Shale

on

  • 6,796 views

German talk on Shale

German talk on Shale

Statistics

Views

Total Views
6,796
Views on SlideShare
6,792
Embed Views
4

Actions

Likes
0
Downloads
95
Comments
0

2 Embeds 4

http://www.3tools.de 2
http://www.slideshare.net 2

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Apache Shale Apache Shale Presentation Transcript

  • Apache Shale Was ist Apache Shale ?
  • Table of Content
    • Struts und Shale
    • Shale – Ein Framework für JSF
    • Bestandteile von Shale
      • Vorstellung der Shale Module
    • Zukunft
      • WebBeans
      • JavaServer Faces 2.0
  • Struts und Shale
    • Gründer: Craig McClanahan
    • Shale war! Ein Struts-Unterprojekt
      • Struts 2.0 ? „The next Struts“ (David Geary)
    • Struts:
      • Action-basiert (auch in Struts2, aka WebWork)
    • Shale:
      • JSF-zentriert, Services/AddOns für JSF
    View slide
  • Shale Framework
    • JavaServer Faces:
      • API für „UI components“
      • leichtgewichtiges Framework (erweiterbar)
    • Shale:
      • Modernes Web Anwendungs Framework für JSF 1.x …
      • Sammlung lose gekoppelte Services
        • Je nach Notwendigkeit kombinierbar
      • Unterstützt JSF bei der Überbrückung von „Lücken“
        • Open Source („Speed boat“) vs. Spezifikation („Schnecke“)
    View slide
  • Shale – Bestandteile (I)
    • Application Controller
    • Clay-Plugin
    • Dialog Manager
    • Remoting
    • Spring-Integration
  • Shale – Bestandteile (II)
    • Test-Framework
    • Tiles Integration
    • Tiger
    • Validator Support
    • View Contoller
  • Shale – Application Controller
    • JSF ist page orientiert
      • Shale erweitert dieses sogar (view controller)
    • Action-basiert kann auch hilfreich sein:
      • Anwendungs-Controller, der alle Anfragen behandelt
      • Anpassungsmöglichkeiten:
        • Struts: RequestProcessor / Commons Chain (1.3)
        • JSF: PhaseListener
    • Shale Application Controller:
      • Ausführung von „Commands“ vor und nach dem JSF-Lifecycle
  • Shale – Application Controller (II)
    • Configuration:
      • web.xml: Commons Chain & ShaleApplicationFilter
      • chain-config.xml: Commands
    • <catalog name=&quot;shale&quot;>
    • <chain name=&quot;preprocess&quot;> (postprocess)
    • <command className=&quot;...&quot; />
    • </chain>
    • ...
  • Shale – Application Controller (III)
    • Commands basieren auf Jakarta Commons Chain:
    • public class PostCommand implements Command{
    • public boolean execute(Context context)…
    • {
    • ShaleWebContext swc = (ShaleWebContext) context;
    • //do some clean ups;
    • return false;
    • }
    • }
  • Shale – Application Controller (IV)
    • ContextRelativePathFilter
      • Bestandteil von Shale
    • Zugriff auf „Quellcodes“ verbieten (chain-config.xml):
    • <catalog name=&quot;shale&quot;>
    • <chain name=&quot;preprocess&quot;>
    • <command className=&quot;org.apache.shale.application.ContextRelativePathFilter&quot; includes=&quot;S*.xml,S*.faces,S*.html,S*.gif,S*.jpg, index.jsp &quot; excludes=&quot;S*.jsp ,S*.jspf ,S*.xhtml&quot;/>
    • </chain>
    • ...
  • Shale – Clay-Plugin
    • Temaplating Framework für JSF
      • Alternative zu Facelets und JSP(X)
    • Tiles-ähnlicher als Facelets
    • Mehr XML files, als Facelets
      • Configuration overhead ?!
    • Beispiel
  • Shale – Beispiel
    • XML-Configs:
      • web.xml
        • 3 Context-param Einträge
      • clay-config.xml
        • Für Clay Komponenten
      • clay-views-config.xmk
        • Seiten, die auf der/den Komponenten basieren
    • gewöhnliche HTML Datei als Template
  • Shale – Clay Komponenten
    • <component jsfid=&quot;baseLayout&quot; extends=&quot;clay&quot; id=&quot;base&quot;>
    • <attributes>
    • <set name=&quot;clayJsfid&quot; value=&quot;/templates/template.html&quot; />
    • </attributes>
    • <symbols>
    • <set name=&quot;title&quot; value=&quot;Hello World&quot; />
    • <set name=&quot;leftContent&quot; value=&quot;/pages/defaultLeftNav.html&quot; />
    • <set name=&quot;headerContent&quot; value=&quot;/pages/defaultHeader.html&quot; />
    • <set name=&quot;bodyContent&quot; value=&quot;/pages/defaultBody.html&quot; />
    • <set name=&quot;footerContent&quot; value=&quot;/pages/defaultFooter.html&quot; />
    • </symbols>
    • </component>
  • Shale – Clay Views
    • <component jsfid=&quot;/page1.jsf&quot; extends=&quot;baseLayout&quot;>
    • <symbols>
    • <set name=&quot;title&quot; value=&quot;Page 1&quot; />
    • <set name=&quot;bodyContent&quot; value=&quot;/pages/page1Body.html&quot; />
    • </symbols>
    • </component>
    • <component jsfid=&quot;/page2.jsf&quot; extends=&quot;baseLayout&quot;>
    • <symbols>
    • <set name=&quot;title&quot; value=&quot;Page 2&quot; />
    • <set name=&quot;bodyContent&quot; value=&quot;/pages/page2Body.html&quot; />
    • </symbols>
    • </component>
  • Shale – template.html
    • <body>
    • <div id=&quot;head&quot;><span jsfid=&quot;clay&quot; clayjsfid=&quot;@headerContent&quot;
    • allowbody=&quot;false&quot;>Header Content</span></div>
    • <div id=&quot;menu&quot;><span jsfid=&quot;clay&quot; clayjsfid=&quot;@leftContent&quot;
    • allowbody=&quot;false&quot;>Left Content</span></div>
    • <div id='content'><span jsfid=&quot;clay&quot; clayjsfid=&quot;@bodyContent&quot;
    • allowbody=&quot;false&quot;>Body Content</span></div>
    • <div id=&quot;footer&quot;><span jsfid=&quot;clay&quot; clayjsfid=&quot;@footerContent&quot;
    • allowbody=&quot;false&quot;>Footer Content</span></div>
    • </body>
  • Shale – Seite
    • ...
    • <td>
    • <input id=&quot;name&quot; type=&quot;text&quot; size=&quot;40&quot; maxlength=&quot;50&quot; value=&quot;#{@managed-bean-name.person.name}&quot; />
    • </td>
    • ...
    • <td>
    • <input type=&quot;submit&quot; action=&quot;#{ @managed-bean-name .sayHello}&quot; value=&quot;#{messages['page2.button.label']}&quot;>
    • </td>
    • ...
  • Shale – Beispiel
    • HTML Mapping in „Clay Views“:
    • <a> </a>
    • <form> </form>
    • <input type=txt>
    • <input type=checkbox>
    • <input type=radio>
    • <input type=submit>
    • <label> </label>
    • <select> </select>
    • <select multiple> </select>
    • <option>
    • <textarea> </textarea>
  • Shale – Dialog Manager (I)
    • Erweiterung des JSF-NavigationHandler um Dialog / Conversation
    • Wiederverwendung von „views“ in mehreren „Klickstrecken“ mit Standard JSF schwer:
      • <h:commandButton rendered=„#{bogus}“ />
    • Zwei Ausprägungen:
      • Basic – Einfache Implementierung
      • SCXML – W3C State Chart XML Implementation
        • Basiert auf Jakarta SCXML
    • Shale Dialog basiert auf der Idee vom Spring Web Flow
  • Shale – Dialog Manager (II)
  • Shale – Dialog Manager (III)
    • Basic Dialog kennt vier Zustände:
      • Action
        • Ausführen einer „Action-Methode“, via JSF MethodBinding
      • View
        • JSF View (normale JSF seite mit Commands controls)
      • End – s
      • Subdialog – Unterdialog, der„Auslöser“ wird gespeichert.
    • Beispiel
  • Shale – Dialog Manager (IV)
    • <dialog name=&quot;Impact&quot; start=„ kundenuebersicht &quot;>
    • <!-- globale transitions -->
    • <transition outcome=&quot;start&quot; target=„kundenuebersicht&quot;/>
    • <transition outcome=&quot;end&quot; target=&quot;Exit&quot;/>
    • <view name=„ kundenuebersicht &quot; viewId=&quot;/kundenMaster.jsp&quot;>
    • <transition outcome=&quot;details&quot; target=„ kundedetail &quot;/>
    • <transition outcome=&quot;tree&quot; target=&quot;treeview&quot;/>
    • </view>
    • <view name=„ kundedetail &quot; viewId=&quot;/kundeDetail.jsp&quot; />
    • <view name=&quot;treeview&quot; viewId=&quot;/tree.jsp&quot; />
    • <end name=&quot;Exit&quot; viewId=&quot;/iahallo.jsp&quot;/>
    • </dialog>
  • Shale – Dialog Manager (V)
    • Starten eines Dialogs
    • Navigation:
      • Über Command Control
        • commandButton / commandLink
      • „ logical outcome“ => dialog:irgendwas
        • Prefix konfigurierbar *
  • Shale – Dialog Manager (VI)
    • Programmatically *
    • FacesContext context = FacesContext.getCurrentInstance(); DialogContextManager manager = (DialogContextManager) context.getApplication().getVariableResolver(). resolveVariable(context, Constants.MANAGER_BEAN); DialogContext dcontext = manager.create(context, &quot;foo&quot;); dcontext.start(context); return null;
  • Shale – Remoting (I)
    • Abildung von Serverseitigen Ressourcen auf URLs
    • Processor führt beliebige Aktionen aus:
        • Class Resource: JS oder CSS in JARs
        • Web Resource: JS oder CSS im Web-App. Root
        • Method Binding: Backing Bean Methode
        • Chain: Ein Jakarta Commons Chain Catalog
    • Beispiel Method Binding
  • Shale – Remoting (II)
  • Shale – Remoting (III)
    • JavaScript (mit Prototype Framework):
    • function validateUsername(username) {
    • new Ajax.Request(
    • &quot;dynamic/userBean/validateUsername.faces&quot;,
    • {
    • method: &quot;post&quot;,
    • parameters: &quot;username=&quot; + username,
    • onComplete: showMessage //Callback
    • }
    • );
    • }
  • Shale – Remoting (IV)
    • public void validateUsername() {
    • FacesContext context = FacesContext.getCurrentInstance();
    • String username = (String)context
    • .getExternalContext()
    • .getRequestParameterMap().get(&quot;username&quot;);´
    • ...
    • ResponseWriter writer =
    • (new ResponseFactory()).getResponseWriter(context, &quot;text/plain&quot;);
    • try {
    • writer.writeText(text, null);
    • }
    • catch (IOException e) {
    • e.printStackTrace();
    • }
    • }
  • Shale – Spring-Integration
    • Spring: DI / IoC container
      • Support für JSF: DelegatingVariableResolver
        • faces-config.xml Eintrag notwendig
    • Shale:
      • DelegatingVariableResolver automatisch aktiviert
    • Zugriff auf WebApplicationContext:
    • WebApplicationContext wac = (WebApplicationContext)
    • getValue(&quot;#{webApplicationContext}&quot;);
    • Spring 1.x (1.0.x branch) und Spring 2.x (trunk)
  • Shale – Test-Framework
    • JUnit-basiertes Testframework für JSF
    • Mock Objekte für JSF
      • JMock support
    • Testen von JSF Komponenten
      • Trinidad
    • Testen von Shale
      • View Controller Support
    • Testen von Implementierung
      • MyFaces
  • Shale – JMock Beispiel
    • public void testInvokeOnComp() throws Exception {
    • UIForm form = new UIForm();
    • UIInput i1 = new UIInput();
    • i1.setId(&quot;_id1&quot;);
    • ...
    • form.getChildren().add(i1);
    • this.facesContext.getViewRoot().getChildren().add(form);
    • Mock mock = mock(ContextCallback.class);
    • ContextCallback cc = (ContextCallback) mock.proxy();
    • mock.expects(once()).method(&quot;invokeContextCallback&quot;).with(eq(facesContext), eq(i2));
    • this.facesContext.getViewRoot(). invokeOnComponent (facesContext, i2.getClientId(facesContext), cc);
    • mock.verify();
    • }
  • Shale – Tiles Integration
    • Support für „standalone“ Tiles
    • Stellt JSF ViewHandler für Tiles bereit
    • Tiles:
      • Templating Framework für JSP
      • Nicht entwickelt für JSF
        • Clay oder Facelets
      • old school
    • Interessant bei „Migration“ ?
  • Shale – Tiger Extensions
    • Java5 Annotations für JSF:
      • Managed Beans
        • @Bean(name=&quot;mybean&quot;, scope=Scope.SESSION)
        • public class MyBean...
      • View Controller
        • @View public class MyFooController ...
      • Components
        • @FacesComponent(&quot;my.component.type&quot;) public class
        • MyComponent extends UIComponentBase ...
      • web.xml Context-Parameter-Eintrag:
        • org.apache.shale.tiger.SCAN_PACKAGES
  • Shale – Validator Support (I)
    • Client-side Validation (nicht Teil von JSF)
    • JSF nur wenig Validator-Komponenten
      • aber API für eigene Validator-Komponenten
    • Integriert Jakarta Commons Validator
      • Credit Card
      • Date (naja...)
      • Email
      • RegEpx, ...
    • JSP Tags für Integration
  • Shale – Validator Support (II) <h:form onsubmit=&quot;return validateForm(this);&quot;> <h:inputText ... <val:commonsValidator type=&quot;creditCard&quot; arg=&quot;#{msgs.creditCardNumberPrompt}&quot; server=&quot;true&quot; client=&quot;true&quot;> </h:inputText> ... </h:form>
  • Shale – Validator Support (III)
    • Design Schwäche:
      • Abschalten von server-side Validation
        • Sicherheitsproblem !!!
      • „ Super“-Tags (type für Validator)
    • Alternativen:
      • Apache MyFaces Tomahawk
      • Apache Trinidad
  • Shale – View Controller (I)
    • „ Best practice“ => Eine Bean pro Seite:
      • Ein „ViewController“
      • Häufig in JSF IDEs der Fall (JDeveloper / Creator)
    • Erweitert die „page-orientierte“ Funktionsweise von JSF
      • init()
      • preprocess()
      • prerender()
      • destroy()
      • isPostBack()
  • Shale – View Controller (II)
    • Convenience Implementierung
      • AbstractViewController
      • Alle Methoden (leer) ausprogrammiert
    • AbstractViewController extends AbstractFacesBean
      • Viele nützliche Hilfsmethoden
      • getBean(„#{myManagedBean}“);
  • Zukunft
    • JSR 299 WebBeans
      • Framework on top of JSF
      • Shale, wie Seam oder ADF ein Grund für „einheitliches“ Framework
      • Annotations für Rollen
        • Google Guice (Java5 DI container)
    • JavaServer Faces 2.0
      • Noch kein JSR!
      • Offene Diskussion in der „Community“
      • WebBeans Punkte stehen hier ebenfalls zur Diskussion ...
  • Fragen ?
    • Folien:
    • http://slideshare.net/mwessendorf