Verbindung zwischen Client und Server
Alle Methoden werden in der ajax-form.js
Datei implementiert. Darin befinden sich JSON Objekte. JSON ist eine Art Daten zu speichern, so wie es XML auch macht. Im vorherigen Kapitel wurde dem Button ein klick Attribut übergeben, welches eine JavaScript Methode ausführt. ButtonyDyerControl
und handleButtonClick
wurden überreicht. Ersteres ist ein Objekt und Letzteres eine Variable, die eine Methode beinhaltet und die ist es, die beim Anklicken aufgerufen wird.
Die Methode macht nicht viel, ausser die execute
Methode aufzurufen, die zum Ziel hat, dass in Java auf der Server Seite Veränderungen vorgenommen werden können. Theoretisch könnte man die Farbe des Buttons hier ändern - den Algorithmus hier schreiben. Das ist aber nicht im Sinne des MVC Konzeptes. Wenn man es hier ändern würde, würde das Kontroll die Informationen des Modells nicht aktualisieren können. Es sind die Informationen im Modell, die letztendlich ausgestrahlt werden sollen.
ButtonDyerControl: {
handleButtonClick: function(optionElement, controlID, showWait) {
services.ajax.execute("dispatchControlCommand", {
controlCommand : "changeColor",
controlID : controlID
}, true);
}
}
Damit das Programm von JavaScript auch wieder zurück zum Server findet, wird eine Klasse benötigt, die von ControlCommand
erbt. Die Klasse hat einen COMMAND_ID
String, die identisch mit dem Parameter in derexecute
Methode ist.
In der HandlerResult execute
Methode können nun Aufgaben vorgenommen werden. Wir haben die boolean Variable isDark
in der Kontroll Klasse definiert und dort wird sie auch verwendet, um zu entscheiden, ob der Button ein helles oder dunkles Design bekommt. Deshalb erstellen wir ein ButtonDyerControl
Objekt und rufen die Methode changeColor
darauf auf. Es wäre auch ohne die Instanziierung des Objektes möglich, die Methode aufzurufen und dort isDark
auf falsch setzen, aber dann müsste es static
sein. Das wäre unpraktisch, weil im Falle, dass mehrere Buttons auf der Seite angezeigt werden, würde sich das Design aller Buttons verändern.
public static class ChangeColorCommand extends ControlCommand {
public static final String COMMAND_ID = "changeColor";
public static final ChangeColorCommand INSTANCE = new ChangeColorCommand(COMMAND_ID);
public ChangeColorCommand(String aCommand) {
super(aCommand);
}
// Called from file: ajax-form.js - ButtonDyerControl: handleButtonClick
@Override
protected HandlerResult execute(DisplayContext commandContext, Control control, Map<String, Object> arguments) {
ButtonDyerControl buttonDyer = (ButtonDyerControl) control;
buttonDyer.changeColor(commandContext);
return HandlerResult.DEFAULT_RESULT;
}
@Override
public ResKey getI18NKey() {
return YourResKey;
}
}
Jedes Kommando hat einen ResKey
und jedes Packet im Java Projekt kann eine I18NConstants.java
Datei enthalten. In dieser werden die ResKeys
definiert. Die TopLogic Anwendung gibt es auch auf Englisch. Um beide Sprachen abzudecken werden ResKeys
erstellt, die sowohl die Englische als auch Deutsche Bezeichnung speichert. Dank der Hilfe von der DeepL API, kann man die Englische Bezeichnung im Kommentar definieren. DeepL übersetzt das dann auf Deutsch und weist beide Sprachen dem Objekt zu. Ohne den Kommentar Trick, würde man das manuell in beiden Text Dateien definieren müssen.
/**
* @en Changes the design of the button.
*/
public static ResKey YourResKey;
Zu guter Letzt wird nun die changeColor
Methode aufgerufen, welches in der Kontroll Klasse definiert wrude.
public void changeColor(DisplayContext commandContext) {
if (isDark) {
isDark = false;
} else {
isDark = true;
}
requestRepaint();
}
Noch ist der Button in der Anwendung nicht sichtbar, was mit dem Erzeugung von Control-Instanzen möglich gemacht wird.