Apache Jetspeed ein Framework für Webportale...Manager des Java AWT zu vergleichen ist. Die...

39
e-Commerce Entwicklung von Webportalen mit der Portlet API Apache Jetspeed ein Framework für Webportale

Transcript of Apache Jetspeed ein Framework für Webportale...Manager des Java AWT zu vergleichen ist. Die...

  • e-Commerce

    Entwicklung von Webportalen mit der Portlet API

    Apache Jetspeed ein Framework für Webportale

  • e-Commerce

    Agenda• Jetspeed Web Portal eine Einführung

    • Die Portal API und Erweiterungen

    • MVC II Architektur für Portlets

    • Consumer Producer Metapher

    • Portlets und WebServices

  • e-Commerce

    Jetspeed Portal Layout

    Pages

    Portlets

    Click customize...

  • e-Commerce

    JetSpeed Pages Administration

    Click customize

    Page...

  • e-Commerce

    JetSpeed Page Administration

    Click add Portlet...

  • e-Commerce

    JetSpeed Portlets Administration

  • e-Commerce

    Kommerzielles Portal-Layout

  • e-Commerce

    Visuelle Struktur einer Portal Seite

    • Portale sind nach der Desktop Metapher aufgebaut ohne jedoch bereits deren volle Funktionalität zu erreichen.

    Der Benutzer kann seine Portal Seiten selber konfigurieren und deren Inhalte zusammenstellen.

    Die kleinste atomare konfigurierbare Einheit ist das Portlet, dessen Ansicht vom Portal Controller verwaltet wird.

    Das Layout der Portlets geschieht z.Z. noch mit einem sehr einfachen Algorithmus, der mit dem Gridlayout Manager des Java AWT zu vergleichen ist.

    Die einzelnen Portale lassen sich vergrößern und verkleinern, ähnlich zu einer Windows Anwendung.

    Portal-Page

    Portlet_1 - View

    Portlet_3 - View

    Portlet_2 - View

    Portlet_4 - Iconfied

    Portlet_5 - Iconfied

  • e-Commerce

    Logische Struktur einer Seite

    Screen/Page

    PortletController

    PortletControl PortletControl PortletControl

    Portlet_1 Portlet_2 Portlet_3

    PortletController: fungiert als LayoutManager und verwaltet die PortletControls.

    PortletControl: dekoriert ein Portlet und stellt dessen Inhalt innerhalb eines Rahmens mit Titelzeile da.

  • e-Commerce

    Aufbau einer Portals Engine

  • e-Commerce

    Jetspeed Schichtenmodell

    Jetspeed

    Portlet API

    Turbine & Velocity

    Servlet Engine

    Http Server

    Jetspeed basiert auf den Apache Subprojekten Turbine und Velocity.

    Turbine ist ein Servlet basiertes Framework, das den Bau einer Webanwendung mit einer MVC Architektur ermöglicht.

    Für das Seitenlayout wird Velocity verwendet, welches eine eigene Beschreibungssprache beinhaltet. Alternativ lässt sich jedoch auch JSP verwenden.

    Als Servlet Engine funktioniert jeder Webcontainer der die Servlet Version2.2 unterstützt.

  • e-Commerce

    Client / Server Sicht der Portal APIClientseitiges UML Modell Simple Portlet

    RunData(from org.apa che. turbine .util)

    HttpServletRequest(from jav ax.serv let.http)

    HttpServletResponse(from jav ax.servlet.http)

    PortalPage

    Portlet

    getContent()

    (from org.apache.jetspeed.portal)

    ConcreteElement(from org.apache.ecs)

    PortletView

    0..*0..*

    public ConcreteElement getContent(RunData data) { StringElement html = new StringElement(); html.setTagText("HelloWorld"); return html;}

  • e-Commerce

    Unsymmetrische Jetspeed API

    • Im Vergleich zur Servlet API wirkt die Interaktion mit einem Jetspeed Portlet unübersichtlich:

    – Die Eingabeparameter werden an das Portlet mit einem RunData Objekt aus dem Turbine Package übergeben.

    – Die Ausgabe erfolgt mit einem HTML ConcreteElement aus dem Element Construction Set Package (ECS).

    – Das Rendering und Layout der Portlets erfolgt mit Klassen aus dem Velocity Package.

    • Dies wirkt auf den ersten Blick sehr verwirrend und vermischt viele verschiedene Apache - Jakarta Subprojekte.

    • Wünschenswert ist eine Portlet API anlog zur Servlet API mit einem PortletRequest als Eingabe und einem PortletResponse als Ausgabe.

  • e-Commerce

    JSR-168• Die ursprünglichen Vorschläge von IBM und Sun für

    eine Portlet API (JSR-162/167) wurden im Februar 2002 zusammengeführt und ein neuer JSR-168 im März ins Leben gerufen.

    • Specification leads: IBM & Sun.• Expert Group members:

    Apache, ATG, BEA, Boeing, Borland, BroadVision, Citrix, Epicentric, Fujitsu, Hitachi, HP, IONA, Oracle, SAP, SAS, SilverStream & Sybase.

    • March - Expert Group work first meeting• May/June - first draft, specification and RI• October - final draft, specification and RI• December - V 1.0 specification, RI & TCK

  • e-Commerce

    Erweiterte Portlet API• Eine API analog zur Servlet Programmierung lässt sich durch einfache Anwendung des

    Decorator Patterns erreichen

    • Die Methoden doView/Edit/Config/Help reagieren auf die entsprechenden Buttons der Portletfensterleiste.

    • Die Interaktion erfolgt ähnlich zu den normalen Servletaufrufen doGet/Post mittels dekorierenden PortletRequest/Response Klassen.

    HttpServlet

    doGet()doPost()

    (from

    Portlet

    getContent()doEdit()doView()doConfig()doHelp()

    (from

    PortletRequest

    PortletResponse

    HttpServletRequest(from javax.serv let.http)

    HttpServletResponse

    (from java x.serv let.http)

    Enhanced Portlet API asDecorator Pattern

  • e-Commerce

    Verteilung von getContent// from: AbstractPortletAdapterpublic ConcreteElement getContent(RunData rundata) { PortletRequest req = decorateRequest(rundata); PortletResponse res = decorateResponse(rundata); try {

    switch(req.getPortletMode()) { case PortletRequest.EDIT:

    doEdit(req,res); break;

    case PortletRequest.HELP: doHelp(req,res);

    break; case PortletRequest.CUSTOMIZE:

    doCustomize(req,res); break;case PortletRequest.VIEW:default: doView(req,res);

    } // switch

  • e-Commerce

    Dekorierung der Portlet API

    AbstractPortletAdapter

    doEdit() doView() doConfig() doHelp()

    (from de.cimt.portlet)

    PortletResponse(from de.cimt.portlet)

    PortletRequest

    (from

    PortletRequestWrapper(from de.cimt.portlet.wrapper)

    HttpServletRequest(from jav ax.serv let.http)

    PortletResponseWrapper(from de.cimt.portlet.wrapper)

    HttpServletResponse(from javax.serv let.http)

    AbstractPortlet(from portlets)

    Portlet

    getContent()

    (from

    Eine solche Form der Portlet API wird vermutlich im JSR 168 vorgeschlagen. Die hier vorgestellteImplementierung erlaubt es dieses auch mit Jetspeed zu testen.

  • e-Commerce

    Personalisierung

    – Mit einem Portal arbeiten i. A. immer registrierte Benutzer, die sich per Logon Prozedur authentifiziert haben und einem User Objekt zugeordnet sind.

    – Die Personalisierung wird gekapselt durch das User Objekt und die PortletSession.

    HttpServlet

    doGet()doPost()

    (from

    Portlet

    getContent()doEdit()doView()doConfig()doHelp()

    (from

    PortletRequest(from org.apache.jetspeed.portal)

    PortletResponse

    (from org.apache.jetspe ed.porta l)

    HttpServletRequest(from javax.serv let.http)

    HttpServletResponse

    (from javax.serv let.http)

    Enhanced Portlet API viaDecorator Pattern

    HttpSession(from javax.servlet.http)

    PortletSession(f rom org.apache.j etspeed.p ortal)

    PrintWriter(from io)

    User

  • e-Commerce

    MVC II für PortletsDas Portlet fungiert als Controller.Nach der Interaktion mit den BusinessModell Klassen erfolgt die Delegationan die jeweilige JSP zum Aufbereitendes Html Inhalts.

    AbstractPortletAdapter

    doEdit() doView() doConfig() doHelp()

    (from de .cimt.portle t)

    Portlet(from org.apache.jetspeed.portal)

    StockQuoteEdit

    StockQuoteView

    StockQuoteConfig

    StockQuoteHelp

    StockQuotePortlet

    doEdit()doView()doConfig()doHelp()

    edit

    view

    config

    help

    PortletRequest(from de.cimt.portlet)

  • e-Commerce

    Vom Portlet zur JSP// from: AbstractPortletAdapterprotected void dispatch(String uri,PortletRequest req, PortletResponse res,boolean forward) throws PortletException,IOException { RunData rundata = (RunData) req.getAttribute("rundata"); ServletContext context = rundata.getServletContext(); RequestDispatcher dispatcher =context.getRequestDispatcher(uri); try { if(forward) { dispatcher.forward(req,res); } else { rundata.getOut().flush(); dispatcher.include(req,res); } } catch(Exception e) { // error recovery ...Ab hier funktioniert alles was wir schon vom Gespann Servlet & JSP kennen ...

  • e-Commerce

    Struktur einer JSP für Portlets• JSPs die von einem Portlet per include Befehl geladen

    werden dürfen keine vollständigen HTML Seiten erzeugen:– Sie werden durch die PortletControl Klasse dekoriert

    • mit TitelBar und MenuIcons verziert– und vom PortletController angeordnet

    • d.h. in den Kontext einer HTML-Table innerhalb einer Seite gestellt.

    Entries:

    key value

  • e-Commerce

    Registrierung eines Portlets

    • Portlets werden bei der Jetspeed Registratur bekannt gegeben.

    • Im Jetspeed Unterverzeichnis %JETSPEED%\WEB-INF\conf befinden sich XML Descriptoren mit der Endung *.xreg, welche die einzelnen Portlets beschreiben:

    Soap Portlet Portlet using SOAP WebService as Producer de.cimt.portlet.soap.SoapPortlet Soap WebService

  • e-Commerce

    Portlet Anwendungen

    • Ein Portlet ist so wie bis lang besprochen im Prinzip nichts weiter als eine Spezialisierung eines Servlets.

    – Es erzeugt keine eigene HTML Seite sondern nur einen kleineren rechteckigen Ausschnitt, der dann mit den Inhalten weitere Portlets zu einer Seite zusammengesetzt wird.

    – Die JSP als View müssen entsprechend "abgespeckt" sein, da sie keine eigenständigen und etc. Auszeichnungen enthalten dürfen.

    • Ein Mehrwert entsteht, wenn verschiedene Portlets miteinander kommunizieren und arbeiten können.

    • Erst dieses Zusammenspiel erlaubt die Umsetzung der Desktop Metapher.

  • e-Commerce

    Umsetzung der Desktop Metapher

    • Hierzu wird eine Nachrichten API ähnlich zu den ActionEvent ActionListener Muster des AWT benötigt.

    • Ein Portierung von Struts auf die Portlet API ist bereits in Arbeit.

    • Ein Problem sind mehrere Portlets auf einer Seite, die gleichzeitig Benutzereingaben erwarten. Hier greift die Desktop Metapher nicht. Es können nur die Daten eines Portlets / Formulars per get-Request übermittelt werden, die Eingaben der anderen Portlets gehen verloren, da auf der Clientseite kein Status gehalten werden kann.

    • => Ein Umsetzung der Desktop Metapher mit Portlet Technologie verlangt eine andere Interaktionsform und Benutzerführung.

  • e-Commerce

    Beispiel: Simple Portlet Messaging

  • e-Commerce

    Consumer - Producer• Portale bieten eine Vielzahl von Informationen und Links

    zu internen und externen Datenquellen.• Im Prinzip ist das Portal gar nicht für den Inhalt selber

    zuständig, sondern nur für eine geeignete Präsentation.• Dies lässt sich mit der Metapher einer Consumer-

    Producer Architektur realisieren. Externe Dienste dienen als Producer von Content.

    • Das Portal stellt als Drehscheibe für die Consumer diesen Inhalt da, möglichst noch für unterschiedliche Ausgabemedien wie z.B.:– Web via HTML– Handy via WML

  • e-Commerce

    Consumer Producer Metapher

    Portal - ServerPor

    talChan

    nels

    Externe Dienste

    Daten

    Intern

    e

    Dien

    ste

    SMS

    HTTP

    WAP

    Neuer Markt

    T-Online

    BillingWetter.de

    Lager

    SAP

    Dateisystem

    Datenbank

    CMS

  • e-Commerce

    WebServices als Producer

    Portlet(from portal)

    Service

    (from serv ice)

    0..*0..*

    TransportProtocol

    Http XML Rmi Corba

    Soap

    SessionBean

    WebService

    PluggableAdapter

    Producer erzeugen Content in einem plattformneutralen Format (XML) und sendet diesen an das Portal (SOAP).

    Der Content wird an das Portlet übergeben, dass sich um eine geeignete Aufbereitung (XML,XSLT) und das Rendering kümmert.

    Rendering for

    Channels

  • e-Commerce

    Erweiterte Portal Architektur• Derzeit gibt es Bemühungen zur Standardisierung einer

    einheitlichen Portal Metapher und Architektur.

    – WSIA: WebServices for Interactiv Applications– WSRP: WebServices for Remote Portlets

    • Mit Blick auf den JSR-168 ist daher zu erwarten, dass sich die Portal API noch ändern wird.

    • Jetzt anlaufende Portal Projekte sind gut beraten sich auf diese Situation einzustellen und geeignete Brandschutzwände in ihre Software Designentwürfe mit einzuziehen, um nicht von den APIs einzelner Hersteller abhängig zu sein...

  • e-Commerce

    WSIA/WSRP the Big Picture

    Stocks serviceDocument service Cartoon service

    Internet or Intranet via SOAP

  • e-Commerce

    Hallo World WebService-Portlet• Das Soap Portlet verbindet sich zu einem WebService,

    der für den Content sorgt.• Das Portlet selber stellt in seiner ViewJSP den

    übergebenen Content einfach nur noch da.

    • SoapPortlet prinzipieller Aufbau:– Default Provider, Service und Methode werden im

    SoapPortlet.xreg vorkonfiguriert und in der Portlet.init Methode ausgewertet.

    – Im Customize Mode kann der Benutzer dies individuell verändern.

    – Im View Mode erzeugt das Portlet einen SOAP Request an den WebService und stell den Content in seiner JSP da.

  • e-Commerce

    Soap Portlet Customize Mode

  • e-Commerce

    Soap Portlet View Mode in Action

  • e-Commerce

    Das Soap Portlet im Detail...public void doView(PortletRequest req, PortletResponse res) throws ... String uri = "/jsp/SoapPortletView.jsp"; String task = req.getParameter("task"); if ("invokeWebService".equals(task)) { try { String soapContent = invokeWebService(getProvider(req), getService(req),getMethod(req),getSoapParameters(req)); req.setAttribute("content",soapContent); }catch(Exception e) { req.setAttribute("content",e.toString()); } } else if ("customizeWebService".equals(task)) { saveCustomizeParameters(req); } setAttributesForJSP(req); include(uri, req, res);}

  • e-Commerce

    Cont. ... invokeWebService/** * get the response from the WebService */protected String invokeWebService(String provider,String service, String method,Vector params) throws Exception { String msg; Response resp = getSOAPResponse(provider,service,method,params); // simple error handling if (resp.generatedFault()) { Fault fault = resp.getFault(); msg = fault.getFaultString(); msg += "\n code "+fault.getFaultCode(); } else { Parameter result = resp.getReturnValue(); msg = result.getValue().toString(); } return msg;}

  • e-Commerce

    Cont. ... getSOAPResponseprotected Response getSOAPResponse(String provider,String service, String method,Vector params) throws SOAPException,MalformedURLException { Call soapCall = createCall(service,method,params); Response soapResponse = soapCall.invoke( new URL(provider),""); return soapResponse; }protected Call createCall(String service, String method,Vector params) { Call soapCall = new Call(); soapCall.setTargetObjectURI(service); soapCall.setMethodName(method); soapCall.setEncodingStyleURI(Constants.NS_URI_SOAP_ENC); soapCall.setParams(params); return soapCall;}

    Die Interaktion ist generisch implementiert...

  • e-Commerce

    Der HelloWorld "WebService"

    public class HelloWorld { public String sayHello(String name) { return "Hello "+name+" from SOAP WebService"; }

    }

    • Einfacher ist ein WebService nicht zu entwickeln...• Woher kennt Apache SOAP den WebService?• => WebService Deployment Descriptor.

  • e-Commerce

    Deployment mit Apache SOAP

  • e-Commerce

    Resumé Web Portale

    • Mit der Portal API lassen sich einfach anspruchsvolle Webanwendungen mittels Portlets zusammenbauen.

    • WebPortale, WebService, XML und SOAP lassen sich in einer höherwertigen Architektur einbetten.

    • Eine Consumer Producer Architektur bietet hierzu die geeignete Metapher.

    • Um wirklich interaktive Webanwendungen zu bauen, benötigt es einiges an Umdenken hinsichtlich der Desktop Metapher. Denn Antwortzeiten und Interaktionsformen sind anders als bei einem lokalen Arbeitsplatz.

    Folie 1AgendaJetspeed Portal LayoutJetSpeed Pages AdministrationJetSpeed Page AdministrationJetSpeed Portlets AdministrationLayout eines kommerziellen PortalsVisuelle Struktur einer Portal Seite Logische Struktur einer Portal SeiteAufbau einer Portals EngineJetspeed SchichtenmodellClient / Server Sicht der Jetspeed APIUnsymmetrische Jetspeed APIJava Community Process, JSR-168Erweiterte Portlet APIVerteilung von getContentDekorierung der Portlet APIPersonalisierungMVC II für PortletsVom Portlet zur JSPStruktur einer JSP für PortletsRegistrierung eines PortletsPortlet AnwendungenUmsetzung der Desktop MetapherBeispiel: Simple Portlet MessagingConsumer - ProducerConsumer Producer MetapherWebServices als ProducerErweiterte Portal ArchitekturWSIA/WSRP the Big PictureHallo World Portlet mit WebServiceSoap Portlet Customize ModeSoap Portlet View Mode in ActionDas Soap Portlet im Detail...Cont. ... invokeWebServiceCont. ... getSOAPResponseDer HelloWorld "WebService"Deployment mit Apache SOAPResumé Web Portale