Lees verder

Transcription

Lees verder
OpenUI5 op een non Netweaver platform
Hans Gmelig Meyling NL4B
VNSG magazine 2014
Deze keer gaat de NL4B tip over OpenUI5, misschien beter bekend als SAPUI5. SAPUI5 is een
ontwikkeling waar SAP al enkele jaren mee bezig is. SAPUI5 is een Javascript UI library met vele controls
waarmee webbased toepassingen kunnen worden gemaakt, voornamelijk voor mobile of tablet. Het
verschil met webdynpro en BSP zit er in dat bij SAPUI5 de development niet in ABAP zit, maar volledig
leunt op Javascript.
In tegenstelling tot menig HTML5/Javascriptvariant is de syntax van OpenUI5 echter veel meer Java
alike. OpenUI5 maakt gebruik van jQuery, maar biedt een ontwikkelomgeving met meer UI elementen,
inheritance, een ModelViewController paradigm en namespacing imports.
ABAP komt alleen nog om de hoek kijken bij specifieke calls die vanuit Javascript worden gemaakt naar
backend systemen om bijvoorbeeld data op te halen of op te slaan. We hebben het dan over de
Gateway/OData connectie, of direct op een ABAP stack gebruikmakend van bijvoorbeeld JSON of XML.
Bron: TechED 2013 CD119
OpenUI5 op non Netweaver servers
Noemenswaardig is de technische onafhankelijkheid van ABAP. Er deden al langer de geruchten dat
SAPUI5 ook geschikt zou kunnen zijn als frontend development tool voor non-SAP toepassingen. Eind
2013 is het verlossende woord van SAP dan gekomen. SAPUI5 is beschikbaar onder de naam OpenUI5,
free of charge voor elk gebruik onder de Apache 2.0 Open Source license.
VNSG magazine 2014
OpenUI5 op een non Netweaver platform
Hans Gmelig Meyling NL4B
Ontleend aan CD119 TechED 2013
OpenUI5 is door de opzet te gebruiken met conventionele HTTP servertechnieken, zoals Apache, IIS,
enzovoorts. SAPUI5 blijft wel bestaan als development environment op SAP Netweaver, maar verschilt
in principe niet met OpenUI5, met uitzondering van de beschikbaarheid van enkele specifieke libraries
en daarin gevatte controls. Voor meer informatie is een artikel van Andreas Kunz, gepubliceerd op 11
december 2013 op SCN een goed startpunt (1). Wij duiken nu de praktijk in van OpenUI5, en laten de
SAP backend onaangeroerd.
Starten met OpenUI5
We beginnen met de OpenUI5 startpagina: http://sap.github.io/openui5/index.html (2). Voor wie
Github niet kent, dat is een Cloud repository, die we nu echter alleen als startpunt gebruiken, maar dat
is verder volledig irrelevant voor dit artikel. Met de gegeven Url komen we op:
VNSG magazine 2014
OpenUI5 op een non Netweaver platform
Hans Gmelig Meyling NL4B
Via de link Download is de UI5 runtime en SDK te downloaden. Met de SDK heb je in Eclipse bijvoorbeeld
de mogelijkheid voor autocomplete, maar echt nodig is dat niet. Om met OpenUI5 aan de slag te kunnen
heb ik de UI5 Runtime gedownload, en wel de versie 1.16.8-SNAPSHOT (2013-12-17 / nightly build).
Uitgepakt ziet dit er als volgt uit:
De libraries zitten in de map resources. Verstandig is die directory met die naam in de uiteindelijke
webserver te gebruiken.
De non Netweaver server
Voor we verder gaan wil ik graag duidelijk maken dat elke HTTP server geschikt is om als basis voor de
OpenUI5 toepassing te dienen: IIS, Apache, of wat dan ook. Voor dit artikel heb ik echter gekozen voor
de volgende combinatie:


XAMPP portable MySQL database
Meer info op ApacheFriends.com
Een native HTTP server op basis van Java HttpServer classes
Meer info op docs.oracle.com
De reden dat ik hiervoor in dit geval heb gekozen is dat zo de gehele afwikkeling van client/server
communicatie in één development omgeving in zicht is. Development geschiedt hierbij in de IDE Eclipse,
en zonder in de details te verzuipen ziet het project er in de basis dan als volgt uit:
VNSG magazine 2014
OpenUI5 op een non Netweaver platform
Hans Gmelig Meyling NL4B
De lezer zal een aantal zaken herkennen:




createContext("/test", ... );
createContext("/service", ... );
FileServer.create(... new ... (Statics")
De projectmappen Statics en resources.
Analoog aan ABAP zouden we /test en /service kunnen zien als SICF services, en Statics als een
verwijzing naar een node in de Mime repository. In IIS zouden /test, /service en /Statics directories zijn
vanaf de server default root. De webserver kan worden gestart door class method WebServer main te
starten in de JVM.
De startpagina (index.html) vanuit Chrome opgestart ziet er dan als volgt uit:
De webserver doet het dus. Wellicht ten overvloede wijs ik gelijk op de fantastische mogelijkheden die
Chrome biedt voor Javascript debugging en webdevelopment in het algemeen.
De OpenUI5 View
De basis van een OpenUI5 page ziet er in essentie als volgt uit:
<!DOCTYPE html>
<html><head>
<meta http-equiv='X-UA-Compatible' content='IE=edge' />
<title>Hello World</title>
<script id='sap-ui-bootstrap'
src='resources/sap-ui-core.js'
data-sap-ui-theme='sap_bluecrystal'
data-sap-ui-libs='sap.ui.commons'></script>
<script>
// De plaats waar het allemaal gebeurt
// in Javascript
</script>
</head>
<body class='sapUiBody'>
<div id='content'></div>
</body>
VNSG magazine 2014
OpenUI5 op een non Netweaver platform
Hans Gmelig Meyling NL4B
</html>
Dat is de hele page. De kern zit hem in de bootstrap die wordt geladen vanuit 'resources/sap-ui-core.js'.
In het tweede stuk <script>...</script> wordt de daadwerkelijke lay-out opgebouwd, door via
javascript de controls op de page te zetten. Die controls worden dan explicit op een html element
geplaatst, zoals in dit geval het element <div id='content'></div>.
Bij een meer complexe lay-out is het al snel ononverzichtelijk alles in één html page te houden en krijg je
de voor ontwikkelaars bekende refinement, maar dan in JS files
<script src="app.js"></script>
</head>
<body class="sapUiBody" data-role="application">
<div id="content"></div>
</body>
En in app.js dan:
var detail = sap.ui.jsview("detailView", "testui5.Detail");
var oSplitApp = new sap.m.SplitApp("mySplitApp", {});
oSplitApp.placeAt("content");
Kijken we dan door op sap.ui.jsview("detailView", "testui5.Detail"); dan zie we de opbouw
van de controller zelf (in snapshot):
jQuery.sap.require("testui5.TaskListItem");
jQuery.sap.require ...;
sap.ui.jsview("testui5.Detail", {
getControllerName : function() {
OpenUI5 op een non Netweaver platform
Hans Gmelig Meyling NL4B
VNSG magazine 2014
return "testui5.Detail";
},
createContent : function(oController) {
return new sap.m.Page("formcontainer", {
title : "Overzicht",
content : [
new sap.ui.layout.form.SimpleForm({
editable : false,
layout : "ResponsiveGridLayout",
labelSpanL : 4,
...
new sap.ui.core.Title({
text : "Algemene gegevens"
}),
En dit is dan een echte toepassing geworden, met in het plaatje links het Eclipse project, in het midden
de App zelf in Chrome, en rechts de developer uilities in Chrome:
Dit laatste was een grote stap, van button naar een toepassing, maar de structuur van het programma
en hoe één en ander er in code uitziet is denk ik wel duidelijk. Overigens, dit is slechts één mogelijkheid
om een view te maken. Je kan ook kiezen voor XML of JSON views. Het lastige is nu dat voorbeelden bij
bepaalde controls in javascript code staan, en bij andere weer in XML views. Even snel de juiste manier
oppakken is er dus niet bij.
VNSG magazine 2014
OpenUI5 op een non Netweaver platform
Hans Gmelig Meyling NL4B
De voorbeelden van de controles zijn te vinden in:

De Developer Guide
https://openui5.hana.ondemand.com/#docs/guide/Documentation.html

En de API Reference
https://openui5.hana.ondemand.com/#docs/api/symbols/sap.ui.html

en de Control Gallery
https://openui5.hana.ondemand.com/#content/Controls/index.html
De Control Gallery biedt naast een overzicht gelijk voorbeelden waarbij de code van dat voorbeeld direct
is op te vragen:
Models in OpenUI5
In dit artikel houden we het beknopt, maar Models gebruiken we voor dataopslag in de client app, en
voor datatransport van en naar de server. Als voorbeeld nemen we een combobox.
<script>
var oComboBox1 = new sap.ui.commons.ComboBox("ComboBox1");
oComboBox1.setTooltip("Country");
oComboBox1.setEditable(true);
oComboBox1.setWidth("200px");
oComboBox1.placeAt("content");
</script>
</head>
<body class='sapUiBody'>
<div id='content'></div>
</body>
</html>
VNSG magazine 2014
OpenUI5 op een non Netweaver platform
Hans Gmelig Meyling NL4B
Deze combobox willen we natuurlijk vullen met data. Dat doen we met een model. In dit geval is het een
simpel model dat er in JSON als volgt uit ziet:
Companies:[{"compcode":"1000"},
{"compcode":"1000APA01"},
{"compcode":"1000APB12"},
{"compcode":"1000APB13"},
{"compcode":"1000APB14"}]
Een tabel dus genaamd Companies, met per regel een element genaamd compcode met een variabele
waarde: "1000", "1000APA01", etc.
Met de volgende code is dan een werkbaar Model te implementeren, met exact de gegeven data
var oModel = new sap.ui.model.json.JSONModel();
oModel.setData({
Companies:[{"compcode":"1000"},
{"compcode":"1000APA01"},
{"compcode":"1000APB12"},
{"compcode":"1000APB13"},
{"compcode":"1000APB14"}]
});
sap.ui.getCore().setModel(oModel);
oComboBox1.setModel(oModel);
var oItemTemplate1 = new sap.ui.core.ListItem();
oItemTemplate1.bindProperty("text", "compcode");
oComboBox1.bindItems("/Companies", oItemTemplate1);
Het op deze wijze 'hard' coderen van data kan handig zijn voor mockups. Mockup models kan je ook in
een losse JS file zetten, om het wat overzichtelijk te houden. Let op de binding van het model aan de
combobox Items en aan de property "text" van Listitem. In Chrome ziet dit er dan als volgt uit:
Met sap.ui.model.json.JSONModel.setData() zetten we een referentie naar het Model, in dit geval met
een stuk hard gecodeerde JSON, maar meer er zijn meer mogelijkheden.
VNSG magazine 2014
OpenUI5 op een non Netweaver platform
Hans Gmelig Meyling NL4B
Met de method sap.ui.model.json.JSONModel.loadData()kunnen we via een Ajax call data uit het
backend systeem halen:
var oModel = new sap.ui.model.json.JSONModel();
oModel.loadData("test");
"test" is in dit geval de (relatieve) Url van mijn webserver (zie de WebServer Java source in method main
createContext("/test"), die qua formaat dezelfde JSON oplevert:
Ofwel in de Java code in de server:
private String someDBUsage(Connection conn) throws InterruptedException, SQLException {
Statement st = conn.createStatement();
ResultSet rs = st.executeQuery("SELECT * FROM compcodes");
JSONObject output = new JSONObject();
JSONArray companies = new JSONArray();
output.put("Companies", companies);
while ( rs.next() ) {
companies.put(new JSONObject().put("compcode", rs.getString("compcode")));
}
return output.toString();
}
Met name de eenvoud valt op om van SQL queries JSON objecten te maken. Dit blijft eigenlijk net zo
makkelijk bij complexere geneste structuren.
In dit geval gaat het om een Combobox, maar op deze wijze kunnen net zo makkelijk complete
formulieren worden 'gebind' aan een Model. Vervolgens, van Model terug naar de Server? Meerdere
opties zijn daar dan weer voor mogelijk, maar een charmante optie is te vinden op SCN Extending
SAPUI5 JSON Model, gepost alweer in november 2012 door Christian Jianelli (6). Een andere optie is een
uitstapje naar native jQuery, of het gebruik van two-way bound models.
Epiloog
We hebben hier een heel klein stukje OpenUI5 besproken. OpenUI5 is heeft een steile leercurve, en
voor de ABAP of zelfs de Java webdynpro developer is er geen enkel feest van herkenning. Het aantal
controls is enorm, en serieuze ontwikkeling vereist grondige kennis van de control library, het specifieke
OpenUI5 MVC concept, en als specifieke styling gewenst is, CSS.
VNSG magazine 2014
OpenUI5 op een non Netweaver platform
Hans Gmelig Meyling NL4B
De documentatie is soms zeer overvloedig, maar bepaald niet altijd to-the-point, en vereist een stevig
basisniveau aan kennis over Javascript.
Echter, de mogelijkheden met andere dan Netweaver servers biedt niet alleen kansen voor nog
toegankelijker manieren voor application prototyping, maar is ook voor niet ABAP/Java developers qua
architectuur en concept een schitterend platform voor de ontwikkeling van web of mobile toepassingen.
14 februari 2014
Hans Gmelig Meyling
Onder meer geraadpleegde bronnen:
(1) SCN, artikel van Andreas Kunz, gepubliceerd december 2013
http://scn.sap.com/community/developer-center/front-end/blog/2013/12/11/what-is-openui5-sapui5
(2) OpenUI5 startpagina
http://sap.github.io/openui5/index.html
(3) OpenUI5 Developer Guide
https://openui5.hana.ondemand.com/#docs/guide/Documentation.html
(4) OpenUI5 API Reference
https://openui5.hana.ondemand.com/#docs/api/symbols/sap.ui.html
(5) OpenUI5 Control Gallery
https://openui5.hana.ondemand.com/#content/Controls/index.html
(6) SCN, artikel van Christian Jianelli, gepubliceerd november 2012
http://scn.sap.com/community/developer-center/front-end/blog/2012/11/20/extending-sapui5-jsonmodel