Donnerstag, 5. August 2010

Danamische AJAX-Tabelle

Basis-Tabelle

<div id="ScrollElement" onscroll="nextElements()"
style="height: 100px; width: 300px; overflow: auto; border: solid 1px black;">
<table id="tableElement" >
<thead>
<tr>
<th>Item Name</th>
</tr>
</thead>
<tbody>
<tr><td>Item</td></tr>
<tr><td>Item</td></tr>
<tr><td>Item</td></tr>
<tr><td>Item</td></tr>
<tr><td>Item</td></tr>
<tr><td>Item</td></tr>
<tr><td>Item</td></tr>
<tr><td>Item</td></tr>
<tr><td>Item</td></tr>
<tr><td>Item</td></tr>
<tr><td>Item</td></tr>
<tr><td>Item</td></tr>
<tr><td>Item</td></tr>
<tr><td>Item</td></tr>
<tr><td>Item</td></tr>
<tr><td>Item</td></tr>
</tbody>
</table>
</div>
<span id='Debug'></span>


Javascriptcode

<script type="text/javascript">
var global_block = false;
var global_counter = 0;

function nextElements()
{
var element = document.getElementById('ScrollElement');
var height = element.scrollHeight;
var scroll = element.scrollTop;

var diff = height - scroll;

document.getElementById('Debug').innerHTML = diff;

if(diff <= 200 && global_block == false)
{
global_block = true;
appendNewElements();
}
}

function appendNewElements()
{
for(var i=0; i<10; i++)
{
global_counter++;

var newListElement = document.createElement('tr');

var tdelement = document.createElement('td');

var newtext=document.createTextNode('Martin' + global_counter);

tdelement.appendChild(newtext);

newListElement.appendChild(tdelement);

//newListElement.innerHTML = 'AppendedItem: ' + global_counter;

var parentElement = document.getElementById('tableElement').getElementsByTagName("TBODY")[0];

parentElement.appendChild(newListElement);


newListElement = null;
tdelement = null;
newtext = null;
parentElement = null;
}
global_block = false;
}
</script>


Anmerkung.

Dieses Basiskonstrukt läuft im sowohl im Internetexplorer (7) als auch im neuesten Chrome.

Mittwoch, 4. August 2010

JSF ComboBoxen mit Autopostback

Um Dynamische GUIs zu bauen gibt es verschieden Optionen die GUI zu verändern.
In den meisten JSF-Einführungenwird zwar beschrieben wie man ein SelectOne verwendet, jedoch nicht wie man eine Bestimmte logik im Backing bean anspricht.




<h:selectOneMenu id="selectCar" value="#{carBean.currentCar}">
<f:selectItems value="#{carBean.carList}" />
</h:selectOneMenu>


Der Entscheidende Punkt ist, dass 2 Attribute gesetut werden müssen.
das onchange="this.form.submit()" bewirkt, dass die Werte des Formulars ins Model übernommen werden (durch Aufruf der setter-Methode).
Die Business-Logik sollte man aber nicht in den Setter reinbauen. Sondern sollte mittels eines valueChangeListener eingebunden werden.


<h:selectOneMenu id="selectCar" value="#{carBean.currentCar}"
valueChangeListener="#{BackingBean.processValueChange}"
onchange="this.form.submit()"
>
<f:selectItems value="#{carBean.carList}" />
</h:selectOneMenu>



public void  proessValueChange(ValueChangeEvent event) {
//some logic
}

Mittwoch, 28. Juli 2010

Checklist - HTML-Tuningtips


  • Unterbinung von Automcomplete. autocompletet="off"
  • Bei Datumsfeldern size="10 und maxlength="10"
  • style="text-align: left; padding 2px 2px 2px 20px"

Donnerstag, 22. Juli 2010

DB2-Batch-Processing-Script

Manchmal sind die Datenmengen so groß, dass eine Sinnvolle verarbeitung nur noch
mittels der db2-Console funtktioniert. Die Anderen Tools die wir verwendet haben konnten mit dem ca. 80MB großen File nichts mehr anfangen.

Außerdem ist das db2cmd ein Tool, dass den DB2-Administratoren vertraut ist.

Wir haben ein script batch.cmd gebaut, dass wir unseren Administratoren zukommen lassen können.


db2 connect to mydbname user myuserid using mypasswd
db2 -vf mybigsqlfile.sql -z readme.txt


Unser File hatte noch den Schönheitsfehler, dass das Encoding UTF-8 war.
Das dB2 ist so doof und unterstellt, dass das Encodung des inputfiles (hier mybisqlfile.sql) das gleiche Encoding besitzt.

Sie haben 2 Möglichkeit dem Abhilfe zu schaffen.

  1. Ein File mit dem richten Encoding erzeugen.

  2. Das Encoding mittels eines Tools convertieren.

Sprechende JSF-Fehlermeldungen

Leider bekommt man ab und an Fehler in den Anwendungen gemeldet.
Meist hilft ein aussagekräftiger Screenshot weiter.
Normalerweise fängt man nun an in seinen Log-Files zu forschen.
- Wenn man überhaupt an diese einfach rankommt.
Viel einfacher ist es, wenn im Screenshot die Fehlermeldung schon eingebaut ist.

Bei der JSF-Programmierung gibt es den <h:messages>-Tag.



<h:messages> ..... showDetail="true"
</h:messages>




In diesem Tag sollte man das showDetail-Attribut auf true setzen. Dann bekommt man eine sprechende Meldung.


Fehlermeldung mit showDetail="false"





Fehlermeldung mit showDetail="true"

Montag, 28. Juni 2010

Servlet generiert Excel




Um direkt ein fertiges Excel zu bekommen muss man in der doPost bzw. doGet-Methode
die richtigen Metainformationen setzen, damit der Client (der Browser) weiß mit welchem externen Programm der die Daten öffnen kann.

In unserem Beispiel haben wir dies gelöst indem man den contentType und den Header der Response gesetzt haben.


ExcelXlsExporter exporter = new ExcelXlsExporter(model);
response.setContentType("application/vnd.ms-excel");
response.setHeader("content-disposition", "attachment; filename = irgendwas.xls");
OutputStream fos = response.getOutputStream();
exporter.createStream(fos);
fos.close();

Mittwoch, 23. Juni 2010

Eclipse Helios (3.6) ist raus!

Ich habs natürlich gleich mal runtergeladen.
It's new and shiny!