|
XCP Blackboard | ||||
|
|||||
| Tip No. 4 Eine Anwendung mit Auswahllisten in XCP erstellen | |
Mit dem Generator in iXSQL kann einfach und schnell mit der XCP-Technologie eine
Anwendung in XCP erstellt werden. In diesen Tip wird aber beschrieben, wie eine
solches Modul auch per Hand erstellt werden kann.
AufgabeAnzeige der Daten des EMP-DEPT-Tabellen-Modells.
Software für die Entwicklung:
1. Hello World BeispielZuerst prüfen wir mit einem Hello-World-Beispiel die richtige Konfiguration aller Komponenten.Zum Erstellen der Dateien wird ein Ordner mitarbeiter in unserm XCP-Arbeitsverzeichnis angelegt. Zum Beispiel unter: D:\xcp_software\ixsql-standard\jakarta-tomcat\webapps\ixsql-standardden Ordner mitarbeiter. In diesem Ordner legen wir für die HTML-Templates den Ordner templates und für die SQL-Dateien den Ordner sql an.
+ixsql-standard
+mitarbeiter
+templates
+sql
Im Verzeichnis mitarbeiter wird die Datei start.xcp angelegt:
start.xcp<?xcp processor="xslt" filename="/WEB-INF/defaults/html2xcp.xsl"?> <?xcp processor="xslt" filename="/WEB-INF/defaults/sql2xcp.xsl"?> <xcp:page xmlns:html="http://www.xcp.info/libs/html" xmlns:sql="http://www.xcp.info/libs/sql" xmlns:xcp="http://www.xcp.info/libs/xcp"> <html:template file="templates/start.html" /> </xcp:page> Das passende Template wird im Verzeichnis templates angelegt. start.html
<html>
<body>
Hello World
</body>
</html>
Der Aufruf des ersten Moduls erfolgt über die URL: http://localhost:28080/ixsql-standard/mitarbeiter/start.xcpup 2. Arbeiten mit der Datenbanka.) Verbindungsaufbau zur Datenbank ermöglichenZuvor muss in iXSQL die Datenbankverbindung über den Connection-Pool konfiguriert werden. Dies geschieht über die Dateien xcpinit.xml und pools.xml im Verzeichnis WEB-INF Ihrer iXSQL-Installation. In pools.xml die Werte der Datei entsprechend anpassen und in xcpinit.xml den Pool-Parameter einkommentieren.Beispiel für eine pools.xml:
<connections>
<connection name="scott" id="demo" current="true">
<driverclass>oracle.jdbc.driver.OracleDriver</driverclass>
<databaseurl>jdbc:oracle:thin:@127.0.0.1:1521:OEMREP</databaseurl>
<username>scott</username>
<password>tiger</password>
<size>3</size>
<validcheck>select '1' from dual</validcheck>
</connection>
</connections>
Beispiel für eine xcpinit.xml: <xcp> <option name="db.pool.config" value="/WEB-INF/pools.xml"/> </xcp> b.) Tabelle anlegenUnsere Mitarbeiterdaten sind in zwei Tabelle EMP und DEPT im Benutzer-Schema SCOTT abgelegt.Aufbau: SQL> CREATE TABLE SCOTT.DEPT ( DEPTNO NUMBER(2,0), DNAME VARCHAR2(14), LOC VARCHAR2(13), CONSTRAINT PK_DEPT PRIMARY KEY (DEPTNO) ); CREATE TABLE SCOTT.EMP( EMPNO NUMBER(4,0), ENAME VARCHAR2(10), JOB VARCHAR2(9), MGR NUMBER(4,0), HIREDATE DATE, SAL NUMBER(7,2), COMM NUMBER(7,2), DEPTNO NUMBER(2,0), CONSTRAINT PK_EMP PRIMARY KEY (EMPNO), CONSTRAINT FK_DEPTNO FOREIGN KEY (DEPTNO) REFERENCES SCOTT.DEPT (DEPTNO) ENABLE ) ; Anlegen von Testdaten in der DEPT Tabelle:
SQL> INSERT INTO DEPT ( DEPTNO, DNAME, LOC ) VALUES (10, 'ACCOUNTING', 'NEW YORK');
INSERT INTO DEPT ( DEPTNO, DNAME, LOC ) VALUES (20, 'RESEARCH', 'DALLAS');
INSERT INTO DEPT ( DEPTNO, DNAME, LOC ) VALUES (30, 'SALES', 'CHICAGO');
INSERT INTO DEPT ( DEPTNO, DNAME, LOC ) VALUES (40, 'OPERATIONS', 'BOSTON');
INSERT INTO DEPT ( DEPTNO, DNAME, LOC ) VALUES (60, 'TRAINING', 'AUGSBURG');
commit;
Anlegen von Testdaten in der EMP Tabelle:
SQL> INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO )
VALUES (9997, 'MAIER', 'CONSULT', 7566, TO_Date( '03/12/1991 12:00:00 AM',
'MM/DD/YYYY HH:MI:SS AM'), 12000, 100, 60);
INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO )
VALUES (9996, 'BÖCK', 'CLERK', 9999, TO_Date( '03/01/1991 12:00:00 AM',
'MM/DD/YYYY HH:MI:SS AM') , 6000, 10, 60);
INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO )
VALUES (9995, 'MÜLLER', 'CONSULT', 9999, TO_Date( '03/01/1991 12:00:00 AM',
'MM/DD/YYYY HH:MI:SS AM'), 7000, 30, 60);
commit;
c.) Die SQL-AbfrageDie Tabelle EMP soll nach allen Feldern abgefragt werden können. Dazu erstellen wir die *.sql-Datei query.sql.Anlegen von Testdaten in der DEPT Tabelle: query.sqlselect EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO from emp &where Die SQL-Anweisung wird in der Datei query.sql im Unterverzeichnis sql gespeichert. Die Textersetzungsvariable &where wird später von XCP ausgewertet und durch die aktuellen Suchparameter ersetzt. 3. Das Abfragemodul erstellenZuerst wird die Start-Seite erweitert, um die Abfrage aufzurufen:start.html
<html>
<body>
<form action="query.xcp">
<input type="text" name="qp_like_ename" />
<input type="submit" value="Suchen" />
</form>
</body>
</html>
Dazu muss die folgende Namensgebung eingehalten werden: qp_<Prädika_kürzelt>_<Spaltenname>wie zum Beispiel im SQL-Statement: qp_e_empno wird zu ?empno = <value>? qp_like_ename wird zu ?ename like <value>?up Als nächstes wird die XCP-Datei für das Query-Modul erstellt: query.xcp
<?xcp processor="xslt" filename="/WEB-INF/defaults/html2xcp.xsl"?>
<?xcp processor="xslt" filename="/WEB-INF/defaults/sql2xcp.xsl"?>
<xcp:page xmlns:html="http://www.xcp.info/libs/html"
xmlns:sql="http://www.xcp.info/libs/sql"
xmlns:xcp="http://www.xcp.info/libs/xcp">
<sql:where/>
<html:template file="templates/result.html" >
<html:markup type="query"
name="datarow"
rows="20"
file="sql/query.sql"/>
</html:template>
</xcp:page>
Das passende Template:
<html>
<body>
##DATAROW_BEGIN##
$$EMPNO$$ | $$ENAME$$ | $$JOB$$ | $$MGR$$ | $$HIREDATE$$ | $$SAL$$ | $$COMM$$ | $$DEPTNO$$ <br>
##DATAROW_END##
</body>
</html>
Mit $$<SPALTENNAME>$$ kann auf den aktuellen Spaltenwert in der jeweiligen Trefferzeile zugegriffen werden. Über die URL http://localhost:28080/ixsql-standard/mitarbeiter/start.xcp kann nun die Abfrageseite geöffnet und zum Beispiel mit S% nach allen Mitarbeitern mit einem S als Anfangsbuchstabe gesucht werden. Wie alles im Browser aussieht, sehen Sie im Anhang von diesem Tip. up 4. Die Anzeige der Abteilung mit in die Suchmaske aufnehmenIm Suchformular soll der Namen der Abteilung über eine Auswahlliste (HTML-Select-Box) ausgewählt werden können.Problem: Wie wird eine Auswahlliste in HTML (<select><option></option></select>) aus der Datenbank erstellt? a.) SQL-Statement erstellen und in Datei dept.sql speichernDie notwendingen Daten werden durch das folgende SQL-Statement ermittelt:select deptno,dname from deptup b.) Mit dem HTML-Tag html:markup type="sqllist" wird eine Auswahlliste erzeugt und mit einen Markup in das Suchformular eingebundenstart.xcp<?xcp processor="xslt" filename="/WEB-INF/defaults/html2xcp.xsl"?> <?xcp processor="xslt" filename="/WEB-INF/defaults/sql2xcp.xsl"?> <xcp:page xmlns:html="http://www.xcp.info/libs/html" xmlns:sql="http://www.xcp.info/libs/sql" xmlns:xcp="http://www.xcp.info/libs/xcp"> <html:template file="templates/start.html" > <html:markup type="sqllist" markup="DEPT_LIST" requiered="false" name="qp_e_deptno" size="1" sqlfile="sql/dept.sql" /> </html:template> </xcp:page> Mit dem html:markup-Tag vom Typ sqllist kann eine Auswahliste erzeugt werden. start.html
<html>
<body>
<form action="query.xcp">
<input type="text" name="qp_like_ename"><br>
##DEPT_LIST##
<br>
<input type="submit" value="Suchen" />
</form>
</body>
</html>
Im HTML-Formular sind Markups immer mit der ##<NAME>##-Notation gekennzeichnet. Auf gleiche Weise kann ein Radio-Button oder Checkbox-Element mit dem html:markup-Tag vom Typ sqlcheck erzeugt werden. Wird der Parameter multiple="true" gesetzt, werden Checkboxen angezeigt, wird dieser Parameter auf multiple="false" gesetzt, werden Radion-Buttons angezeigt. up 5. Eine Detail-Ansicht der Mitarbeiterdaten erstellenIm nächsten Schritt wollen wir aus der Ergebnis Liste der Suche auf eine Detailansicht des Angestellten-Datensatzes navigieren. In der Ergebnisseite der Suche wird ein Link auf die Detail-Seite eingebunden:result.html: ... <a href="detail.xcp?qp_e_empno=$$EMPNO$$">$$EMPNO$$</a> ... a.) Erstellen des notwendigen XCP-ModulsDas SQL-Statement von der Ergebnisliste können wir weiterverwenden, da SQL-Statements in XCP dynamisch parametrisiert werden können. (Parameter qp_e_empno)Unser Detail-XCP-Modul ruft ein neues passendes HTML-Template in Verbindung mit dem SQL Statement auf. Detail.xcp<?xcp processor="xslt" filename="/WEB-INF/defaults/html2xcp.xsl"?> <?xcp processor="xslt" filename="/WEB-INF/defaults/sql2xcp.xsl"?> <xcp:page xmlns:html="http://www.xcp.info/libs/html" xmlns:sql="http://www.xcp.info/libs/sql" xmlns:xcp="http://www.xcp.info/libs/xcp"> <sql:where/> <html:template file="templates/detail.html" > <html:markup type="query" name="datarow" file="sql/query.sql"/> </html:template> </xcp:page> detail.html<html> <body> ##DATAROW_BEGIN## <form> <input type="hidden" name="empno" value="$$EMPNO$$" /> <table> <tr> <td>Nummer</td><td>$EMPNO$$</td> </tr> <tr> <td>Name</td><td>$$ENAME$$</td> </tr> <tr> <td>Job</td><td>$$JOB$$</td> </tr> <tr> <td>Nummer des Vorgesetzen</td><td>$$MGR$$</td> </tr> <tr> <td>Einstellungsdatum</td><td>$$HIREDATE$$</td> </tr> <tr> <td>Gehalt</td><td>$$SAL$$</td> </tr> <tr> <td>Provision</td><td>$$COMM$$</td> </tr> <tr> <td>Abteilung</td><td>$$DEPTNO$$</td> </tr> </table> </form> ##DATAROW_END## </body> </html> up b.) Dynamische Auswahllisten in Verbindung mit einer ErgebnislisteIm nächsten Schritt wollen wir die Abteilung in einer Auswahlliste in der Detailansicht darstellen. Dazu muss die jeweils aktuelle Abteilung des Mitarbeiters ausgewählt und angezeigt werden.Auch hier kommt das html:markup-Tag zum Einsatz, da aber die Auswahlliste mit dem SQL-Ergebnis verknüpft werden muss, ist folgendes zu beachten:
<sql:where/>
<html:template file="templates/detail.html" >
<html:markup type="sqllist"
markup="DEPT_LIST"
name="deptno" size="1"
sqlfile="sql/dept.sql"
mtype="data"/>
<html:markup type="query"
name="datarow"
file="sql/query.sql"
select="deptno"/>
</html:template>
Das Markup in der HMTL-Datei detail.html:
<tr>
<td>Abteilung</td><td>##DEPT_LIST##</td>
</tr>
Bei Aufruf der Detailseite wird nun das Markup ##DEPT_LIST## ersetzt und an der richtigen Position in HTML das Schlüsselwort ?selected? eingesetzt. up c.) Statische Auswahllisten in Verbindung mit einer ErgebnislisteZusätzlich soll die Provision auf eine feste Wertemenge eingeschränkt werden. Es sind nur die folgenden Werte zulässig:
0
10
30
90
100
300
500
1400
Diese Liste bilden wir in HTML mit einer statischen Auswahlliste ab und setzen diese Liste in unser HTML-Template detail.html ein. <select name="comm"> <option value="0">0</option> <option value="10">10</option> <option value="30">30</option> <option value="90">90</option> <option value="100">100</option> <option value="300">300</option> <option value="500">500</option> <option value="1400">1400</option> </select> Wie aber wird jetzt der aktuelle Wert des Mitarbeiter-Datensatzes berücksichtigt und das richtige Element der Liste ausgewählt? Für diese Aufgabe gibt es ein spezielles SQL-Markup in HTML: $$<Spaltenname>_<Spaltenwert>$$Dieses Markup wird, falls der Spaltenwert der benannten Spalte passt, durch das HTML-Schlüsselwort selected ersetzt und damit als das aktive Element der Auswahlliste gekennzeichnet. Damit die Ersetzung auch durchgeführt werden kann, muss im html:markup type="query" der Parameter select die benötigte Spalte enthalten: Erweiterte detail.xcp:
<html:markup type="query"
name="datarow"
file="sql/query.sql"
select="deptno, comm"/>
Erweitertes HTML-Template detail.html:
<tr>
<td>Provision</td>
<td>
<select name="comm">
<option value="0" $$COMM_0$$ >0</option>
<option value="10" $$COMM_10$$ >10</option>
<option value="30" $$COMM_30$$ >30</option>
<option value="90" $$COMM_90$$ >90</option>
<option value="100" $$COMM_100$$ >100</option>
<option value="300" $$COMM_300$$ >300</option>
<option value="500" $$COMM_500$$ >500</option>
<option value="1400" $$COMM_1400$$>1400</option>
</select>
</td>
</tr>
Um Probleme mit Nachkommastellen zu vermeiden, empfehlt sich für das Demo ein Round über die Provision: Erweitertes SQL Abfrage:
select EMPNO
, ENAME
, JOB
, MGR
, HIREDATE
, SAL
, round(COMM)
as COMM, DEPTNO
from emp
&where
Beachten Sie hier, dass alle Spalten immer einen festen Namen haben müssen, damit die Templatetechnik zuverlässig funktioniert. Hier im Beispiel wird der Spalte round (COMM) mit dem Schlüsselwort as der Name COMM zugewiesen. up 6. Die Mitarbeiter-Detailansicht speichernNachdem wir nur die Detailansicht erstellen können, wollen wir die Daten verändern und in der Datenbank wieder speichern.Zuerst wird das HTML-Formular erweitert: <html> <body> ##DATAROW_BEGIN## <form action="save.xcp"> <input type="hidden" name="empno" value="$$EMPNO$$" /> <table> <tr> <td>Nummer</td><td><input type="text" name="empno" value="$$EMPNO$$" size="30" /></td> </tr> <tr> <td>Name</td><td><input type="text" name="ename" value="$$ENAME$$" size="30" /></td> </tr> <tr> <td>Job</td><td><input type="text" name="job" value="$$JOB$$" size="30" /></td> </tr> <tr> <td>Nummer des Vorgesetzen</td><td><input type="text" name="mgr" value="$$MGR$$" size="30" /></td> </tr> <tr> <td>Einstellungsdatum</td><td><input type="text" name="hiredate" value="$$HIREDATE$$" size="30" /></td> </tr> <tr> <td>Gehalt</td><td><input type="text" name="sal" value="$$SAL$$" size="30" /></td> </tr> <tr> <td>Provision</td> <td> <select name="comm"> <option value="0" $$comm_0$$ >0</option> <option value="10" $$comm_10$$ >10</option> <option value="30" $$comm_30$$ >30</option> <option value="90" $$comm_90$$ >90</option> <option value="100" $$comm_100$$ >100</option> <option value="300" $$comm_300$$ >300</option> <option value="500" $$comm_500$$ >500</option> <option value="1400" $$comm_1400$$>1400</option> </select> </td> </tr> <tr> <td>Abteilung</td><td>##DEPT_LIST##</td> </tr> </table> <input type="submit" value="speichern" /> </form> ##DATAROW_END## </body> Wichtig ist hierbei, dass die Namen der Request-Parameter in HTML gleich den Spaltennamen in der Datenbank sind, um das bequeme 1:1-Mapping der Request-Parameter auf Datenbank-Spalten nutzen zu können. Für das Sichern der Daten wird die Datei save.xcp erstellt:
<?xcp processor="xslt" filename="/WEB-INF/defaults/html2xcp.xsl"?>
<?xcp processor="xslt" filename="/WEB-INF/defaults/sql2xcp.xsl"?>
<xcp:page xmlns:html="http://www.xcp.info/libs/html"
xmlns:sql="http://www.xcp.info/libs/sql"
xmlns:xcp="http://www.xcp.info/libs/xcp">
<sql:transaction>
<sql:execute sqlfile="sql/update_emp.sql"/>
</sql:transaction>
<xcp:set-param scope="page" name="qp_e_empno" parameter="empno"/>
<xcp:redirect url="detail.xcp"/>
</xcp:page>
Mit dem Tag sql:transaction wird ein Transaktionsblock in XCP erstellt. Das SQL-Statement im sql:execute-Tag wird ausgeführt. Tritt ein Fehler in der Datenbank auf, werden alle Änderungen zurückgesetzt (rollback). Sind keine Fehler aufgetreten, wird wieder auf unser Detail-Modul verwiesen. Um das Detail-Modul mit den richtigen Daten aufzurufen, wird der Wert des Parameters EMPNO als qp_e_empno-Parameter mit übergeben. Inhalt der SQL-Datei update_emp.sql im Verzeichnis sql: update emp set ENAME = :ENAME , JOB = :JOB , MGR = :MGR , HIREDATE = :HIREDATE , SAL = :SAL , COMM = :COMM , DEPTNO = :DEPTNO where EMPNO = :EMPNO Über die :-Notation wird die Verbindung zwischen den Request-Parametern des HTML-Formulars und den Datenbank-Werten hergestellt. up 7. Einen Datensatz neu anlegenÄhnlich unserem Update-Beispiel können Sie auch einen neuen Datensatz anlegen. Sie benötigen zusätzlich ein Insert-Statement, um die Daten zu speichernBeispiel: insert.sql insert into emp (EMPNO,ENAME,JOB,MGR,HIREDATE, SAL, COMM, DEPTNO) values ( EMPNO , :EMPNO , :JOB , :MGR , :HIREDATE , :SAL , :COMM , :DEPTNO ) Je nach Datenbank-Version muss an dieser Stelle die jeweilige Methode der verwendeten Datenbank angewandt werden um einen eindeutigen Schlüssel für den Datensatz zu erzeugen. Im folgenden Modul wird ein etwas komplexerer Ansatz gezeigt, um einen eindeutigen Schlüssel zu erzeugen. Hierbei wird der Wert des Primary-Key über ein Sequenz-Objekt der Datenbank (Oracle Syntax) erzeugt. Es kommt eine Hilfsklasse zum Einsatz und das Ergebnis der SQL-Abfrage wird zu den normalen Request-Parametern gespeichert und kann dann wieder mit der :-Notation referenziert werden. Zuvor muss die Sequence auf der DB angelegt werden: scott:sql>create sequence SEQ_EMP; Das XCP Modul: insert.xcp
<?xcp processor="xslt" filename="/WEB-INF/defaults/html2xcp.xsl"?>
<?xcp processor="xslt" filename="/WEB-INF/defaults/sql2xcp.xsl"?>
<xcp:page xmlns:html="http://www.xcp.info/libs/html"
xmlns:sql="http://www.xcp.info/libs/sql"
xmlns:xcp="http://www.xcp.info/libs/xcp">
<sql:transaction>
<xcp:code>
String id = com.netcos.obox.database.sql.SqlUtil.getStringResult(
this.connection
, "select SEQ_EMP.nextval as EMPNO from dual"
, null);
this.pci_request.set_param("EMPNO", id);
</xcp:code>
<sql:execute sqlfile="sql/insert_emp.sql"/>
</sql:transaction>
<xcp:set-param scope="page" name="qp_e_empno" parameter="empno"/>
<xcp:redirect url="detail.xcp"/>
</xcp:page>
In einem <xcp:code> Abschnitt können Sie Java Code direkt angeben und verwenden. up Weitere Verbesserungena.) Markups bereinigenWenn Sie den erzeugten HTML Code über den Browser analysieren,werden Sie noch einige alte Markups entdecken.Diese Markups können mit dem HTML-Tag <html:markup type="clean"/%gt; bereinigt werden. b.) Request-Parameter anzeigenUm Request-Parameter in eine HTML-Seite einzufügen, verwenden Sie die ##<NAME_PARAMETER>##-Notation. Die Markups werden dann nach Abarbeitung des HTML-Tags <html:markup type="request"/> ersetzt.c.) Ausführung von XCP-Abschnitten über Request-Parameter steuernMit dem XCP-Tag<xcp:if-param-equals name="parameter" value="value"> <!-- weiterer code --> </xcp:if-param-equals>können Sie die Ausführung von Abschnitten eines XCP-Moduls parametrisieren. Zum Beispiel können Sie damit alle XCP-Code-Beispiele von diesem Tip in einer Datei abbilden. ZusammenfassungIn diesem XCP-Tip für den Monat Februar haben Sie die Grundzüge für das Erstellen einer dynamischen Web-Anwendung mit XCP kennen gelernt.Die wichtigsten Punkte:
Wo finden Sie mehr InformationIn der IXSQL-Oberfl&aml;che unter Documentation/XCP Developer GuideErstellen Sie auch mit dem Generator eine solche Anwendung und analysieren Sie den erzeugten Quellcode. Der Generator nimmt Ihnen viele der hier beschriebenen Schritte ab up AnhangMit etwas HTML lassen sich die Module natürlich je nach Geschmack verschönern.Das Query-Modul:
Die Ergebnisliste:
Einen Datensatz bearbeiten:
up |
|
| ©2005 netcos AG | www.netcos.de |