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.