Die Common-Controls Tag Bibliothek

<ctrl:columnhtml>

Erzeugt eine HTML-Spalte. Der HTML-Code kann direkt im Tag-Body angegeben werden, oder er wird über das property-Attribut aus dem Datamodel geholt.

Wenn im Tag Body EL (Expression Language) Ausdrücke verwendet werden, dann sollte darauf geachtet werden, dass hier die Schreibweise für verzögerte EL Ausdrücke verwendet werden muss (eine spezielle Common-Controls Schreibweise).

Normale Schreibweise${bean.name == 'Hans'}
Verzögerte Schreibweise:@{bean.name == 'Hans'}

Hintergrund: Ein normaler EL Ausdruck wird bereits zur Compile Zeit der JSP Seite aufgelösst und hat damit keinen Zugriff auf die Row Bean (bean Variable). Der verzögerte Ausdruck wird erst auf dem Server beim iterieren über die Row Beans ausgewertet und hat somit Zugriff auf die bean Variable.

RolleJava Klasse
DesignmodelColumnHtmlDesignModel
Das <columnhtml>-Tag darf nur innerhalb von einem Taghandler, welcher das ColumnContainerTag Interface implementiert, verwendet werden. Dies sind beispielsweise das <list>- oder das <treelist>-Tag.
../images/images/columnhtml_small.gif

Body content: JSP
Tag class: ColumnHtmlTag
Tei class: ColumnHtmlTei
 

[ Syntax ]

Standard Syntax
<ctrl:columnhtml
[ ajax = "Boolean" ]
[ disabled = "Boolean" ]
[ disableProperty = "String" ]
[ editable = "Boolean" ]
[ editableProperty = "String" ]
[ id = "String" ]
[ join = "{none | false | concatenate | true | separator}" ]
[ maxlength = "Integer" ]
[ onblur = "String" ]
[ onchange = "String" ]
[ onclick = "String" ]
[ oncontextmenu = "String" ]
[ ondblclick = "String" ]
[ onfocus = "String" ]
[ onkeydown = "String" ]
[ onkeypress = "String" ]
[ onkeyup = "String" ]
[ onmousedown = "String" ]
[ onmousemove = "String" ]
[ onmouseout = "String" ]
[ onmouseover = "String" ]
[ onmouseup = "String" ]
[ permission = "ACL" ]
[ property = "String" ]
[ sortable = "Boolean" ]
[ style = "String" ]
[ styleClass = "String" ]
[ styleId = "String" ]
[ target = "String" ]
[ targetProperty = "String" ]
[ title = "String" ]
[ tooltip = "String" ]
[ tooltipProperty = "String" ]
[ transaction = "Boolean" ]
[ type = "Java Klasse (als Zeichenkettenkonstante)" ]
[ width = "String" ]
>
...Body Content...

</ctrl:columnhtml>
 

[ Attribute ]

AttributTypBeschreibungPflichtRTExp
ajaxBoolean Aktiviert die AJAX Funktion der Spalte. Alle Ereignisse werden dann mit JavaScript asynchron an den Server gesendet und dort verarbeitet.

Die Verarbeitung auf dem Server unterscheidet sich nicht von einer normalen Request Behandlung. Der Anwendungsentwickler hat jedoch die Möglichkeit über die Methoden des AjaxRequest Interfaces (Basisklasse von ActionContext) die Ergebnis Rückmeldung zu steuern.

Im Normalfall (-> AjaxRequest.isAjaxCanceled() == false) wird ein Delta XML Stream zum Web Browser zurückgeschickt. Dieser Stream enthält nur die schmutzigen Kontrollelemente, welche dann mit Hilfe eines JavaScript Handlers vom Web Browser im HTML DOM Tree selektiv ausgetauscht werden. Es wird also keine vollständige HTML Seite vom Server übertragen!

  • (+) Die übertragene Datenmenge ist kleiner.
  • (+) Die HTML Seite bleibt im Browser stehen und es gibt kein "flackern".
  • (-) Der Request wird nicht in der Browser Historie vermerkt!
  • (-) Es wird JavaScript benötigt, sonst wird ein normaler Server roundtrip ausgelößt

Die meisten Kontrollelemente fügen sich selbst in die Dirty Liste des ActionContext ein. Hierzu wird einfach die Methode AjaxRequest.markDirty() aufgerufen. Der Anwendungsentwickler hat damit die Möglichkeit noch weitere Kontrollelemente - die durch eine Zustandsänderung ebenfalls schmutzig geworden sind - in den Delta Stream aufzunehmen

Wenn der Request eine vollständig neue HTML Seite zurückgeben soll, dann besteht auch die Möglichkeit die AJAX Verarbeitung auf dem Server abzubrechen. Hierzu wird die Methode AjaxRequest.cancelAjaxRequest() aufgerufen. Das Framework sendet danach immer eine vollständige HTML Seite zurück an den Web Browser.

Das Common-Controls AJAX XML Protokoll hat das folgende Format:


<?xml version="1.0" encoding="UTF-8" ?>
<ajax-response>
	<token/>
	<controls>
		<control styleId="" class="" name="">
			<html>
				<[CDATA[...]] >
			</html>
		</control>
	</controls>
</ajax-response>

				
 
disabledBoolean Gibt an ob die Spalte inaktiv sein soll.

Dieses Attribut zeigt nur dann Wirkung, wenn die Spalte editierbar ist.

 
disablePropertyString Gibt den Namen eines Properties an, welches die jeweiligen Zelle deaktiviert. Das Property muss einen java.lang.Boolean Datentyp zurückliefern.

Dieses Attribut zeigt nur dann Wirkung, wenn die Zelle editierbar ist.

Anmerkung: Gültiger Java Bezeichner. Die Zeilenobjekte müssen eine passende Property-Getter Methode implementieren.

 
editableBoolean Gibt an ob die Spalte editiert werden kann.

Damit die eingegebenen Daten zum Server geschickt werden, sollte das Kontrollelement zusätzlich auf formElement="true" konfiguriert werden.

 
editablePropertyString Gibt den Namen eines Properties an, welches über die Editierbarkeit der jeweiligen Zelle entscheidet. Das Property muss einen java.lang.Boolean Datentyp zurückliefern.

Damit die eingegebenen Daten zum Server geschickt werden, sollte das Kontrollelement zusätzlich auf formElement="true" konfiguriert werden.

Anmerkung: Gültiger Java Bezeichner. Die Zeilenobjekte müssen eine passende Property-Getter Methode implementieren.

 
idString Weist der Spalte einen eindeutigen Bezeichner zu. Im Tag Body wird daraufhin eine Java Variable angelegt, auf welche in Java Scriptlets zugegriffen werden kann. Diese Variable verweist immer auf die aktuelle Row-Bean.

Dieses Attribut wird meist in Verbindung mit dem type Attribut verwendet

Anmerkung: Da zur JSP Compile Zeit eine Java Variable mit diesem Bezeichner angelegt wird, muss hier ein String Literal (und keine Expression!) angegeben werden! Der Bezeichner muss den Regeln für gültiger Java Bezeichner folgen.

 
joinJoinMode Verbindet die Zellen der Spalte mit den Zellen der vorangehenden Spalte.

Zellen können nur innerhalb derselben Spaltengruppe verbunden werden!

  • none = Die Spalten werden nicht verbunden
  • false = Entspricht "none"
  • concatenate = Die Spalten werden ohne Zwischenraum zusammengefügt
  • true = Entspricht "concatenate"
  • separator = Die Spalten werden mit einem Zwischenraum zusammengefügt
 
maxlengthInteger Gibt die maximale Zeichenzahl für die Anzeige in Spaltenüberschriften und Zellen an. Weitere Zeichen werden durch "..." angedeutet.
Diese Funktionalität ist unwirksam, wenn das Attribut filter="false" gesetzt ist, da in diesem Fall die tatsächlich sichtbare Zeichenzahl nicht ermittelt werden kann.
 
onblurString Fires when the object loses the input focus.

Anmerkung: JavaScript Code

 
onchangeString Fires when the contents of the object or selection have changed.

Anmerkung: JavaScript Code

 
onclickString Fires when the user clicks the left mouse button on the object.

Anmerkung: JavaScript Code

 
oncontextmenuString Fires when the user clicks the right mouse button in the client area, opening the context menu.

Anmerkung: JavaScript Code

 
ondblclickString Fires when the user double-clicks the object.

Anmerkung: JavaScript Code

 
onfocusString Fires when the object receives focus.

Anmerkung: JavaScript Code

 
onkeydownString Fires when the user presses a key.

Anmerkung: JavaScript Code

 
onkeypressString Fires when the user presses an alphanumeric key.

Anmerkung: JavaScript Code

 
onkeyupString Fires when the user releases a key.

Anmerkung: JavaScript Code

 
onmousedownString Fires when the user clicks the object with either mouse button.

Anmerkung: JavaScript Code

 
onmousemoveString Fires when the user moves the mouse over the object.

Anmerkung: JavaScript Code

 
onmouseoutString Fires when the user moves the mouse pointer outside the boundaries of the object.

Anmerkung: JavaScript Code

 
onmouseoverString Fires when the user moves the mouse pointer into the object.

Anmerkung: JavaScript Code

 
onmouseupString Fires when the user releases a mouse button while the mouse is over the object.

Anmerkung: JavaScript Code

 
permissionACL Mit diesem Attribut kann der Zugriff auf das Element beschränkt werden.

Berechtigungen werden über das Principal Objekt in der Benutzer Session geprüft. Das Principal Objekt wird mit der Methode SecurityUtil.registerPrincipal() in der Session registriert. Es wird vom Anwendungsentwickler durch Implementierung des Principal Interfaces zur Verfügung gestellt. Somit lassen sich sehr einfach beliebige Berechtigungssysteme mit dem Framework verbinden.

Berechtigungen werden immer in Form einer Access Control List (ACL) angegeben. Dabei handelt es sich um einen Ausdruck dessen Elemente Einzelberechtigungen sind. Das Framweork unterstützt die folgenden Berechtigungstypen, welche jedoch vom Anwendungsentwickler beliebig erweitert werden können:

Literal
true|false -> StaticPermission
Rolle
#rollenname -> RoleBasedPermission
Funktion
$funktionsname -> FunctionBasedPermission

Zur Formulierung der Ausdrücke kann die folgende Syntax verwendet werden:

PERMISSION_PREFIX
	: '#' | '$'

AND_OP
	: 'and' | '&' | '*'

XOR_OP
	: 'xor' | '^'

OR_OP
	: 'or' | '|' | '+'

UNARY_OP
	: '~' | '!'

permission
	: PERMISSION_PREFIX IDENTIFIER

primary_expr
	: permission
	| '(' expr_list ')'

unary_expr
	: primary_expr
	| UNARY_OP primary_expr

logical_and_expr
	: unary_expr
	| logical_and_expr AND_OP unary_expr

logical_xor_expr
	: logical_and_expr
	| logical_or_expr XOR_OP logical_and_expr

logical_or_expr
	: logical_xor_expr
	| logical_or_expr OR_OP logical_xor_expr

expr_list
	: logical_or_expr
	| expr_list ';' logical_or_expr
	| expr_list ',' logical_or_expr

Access Control Listen werden mit der statischen Methode AccessControlList.parse() eingelesen. Der Parser verwendet wiederum die statische Methode PermissionFactory.parse() um die einzelnen Permissions zu lesen. Der Anwendungsentwickler kann über die PermissionFactory eigene von Permission abgeleitete Klassen registrieren und so den Sprachumfang der ACL erweitern.

 
propertyString Der Name des Properties welches die Daten der Spalte liefert.

Anmerkung: Gültiger Java Bezeichner. Die Zeilenobjekte müssen eine passende Property-Getter Methode implementieren.

 
sortableBoolean Das Attribut gibt an, ob nach dieser Spalte sortiert werden kann. Wird hier der Wert true angegeben, dann kann der Benutzer mit einem Mausklick auf den Spaltenkopf die Sortierung umschalten. Es wird in diesem Fall ein onSort Event ausgelösst.

In den folgenden Fällen kann das Framework das ListDataModel selbstständig sortieren:

  • Das ListDataModel ist von einer Java Collection Klasse abgeleitet
  • Das ListDataModel implementiert das Sortable Interface

In allen übrigen Fällen muss der Anwendungsentwickler eine eigene onSort() Methode zur Verfügung stellen.

 
styleString Über dieses Attribut kann direkt ein HTML-style Attribut für die Zellen der Spalte angegeben werden.

Anmerkung: Siehe HTML Dokumentation für das Attribut style.

 
styleClassString Über dieses Attribut kann direkt ein HTML-class Attribut für die Zellen der Spalte angegeben werden.

Anmerkung: Siehe HTML Dokumentation für das Attribut class.

 
styleIdString Über dieses Attribut kann direkt ein HTML-id Attribut für die Zellen der Spalte angegeben werden.

Anmerkung: Siehe HTML Dokumentation für das Attribut id.

 
targetString Über dieses Attribut kann direkt ein HTML-target Attribut für die Zellen der Spalte angegeben werden.

Anmerkung: Siehe HTML Dokumentation für das Attribut target.

 
targetPropertyString Gibt den Namen eines Properties an, welches als HTML-Target Attribut für die jeweilige Zelle verwendet wird.

Anmerkung: Gültiger Java Bezeichner. Die Zeilenobjekte müssen eine passende Property-Getter Methode implementieren.

 
titleString Gibt die Spaltenüberschrift an.

Die Zeichenkette wird vor der Ausgabe HTML-codiert.

 
tooltipString Gibt den Tooltip Text an

Anmerkung: lokalisierbare Zeichenkettenkonstante

 
tooltipPropertyString Gibt den Namen eines Properties an, mit dessen Hilfe die jeweilige Zelle mit einem HTML-Text Attribut versehen werden kann.

Anmerkung: Gültiger Java Bezeichner. Die Zeilenobjekte müssen eine passende Property-Getter Methode implementieren.

 
transactionBoolean Mit diesem Flag wird angegeben ob ein Transaction Token (siehe Struts Token Dokumentation) an alle Hyperlinks der Spalte angehängt werden soll.

Mit dem Transaction Token können Form Re-submissions (mehrfaches Absenden eines HTML Formulars) erkannt werden.

Funktionsweise: Das Transaction Token is ein "Stempel" mit welchem die Applikation jede generierte HTML Seite stempelt (es wird ein hidden Field bzw. zusätzliche URL Parameter für alle Hyperlinks erzeugt). Bei einem Server Request kann der vom Browser zurückgeliefert Stempel mit dem in der Session gespeicherten Wert verglichen werden. Wenn der Wert übereinstimmt, dann passt die Seite zum aktuellen Applikations Zustand.
Stimmt der Stempel nicht überein, dann sind Applikationszustand und Browser Inhalt asynchron und die Applikation kann auf diesen Fehler - wie auch immer - reagieren. Eine Abweichung entsteht immer dann, wenn der Anwender eine ältere Seite aus der Browser Historie absendet.

 
typeJava Klasse (als Zeichenkettenkonstante) Der voll qualifizierte Name der Java Klasse welche als Scripting-Variable im Tag Body verwendet werden soll. Dieses Attribut wird nur in Verbindung mit dem id Attribut eingesetzt.  
widthString Setzt die Breite der Spalte. Die Breite kann dabei absolut oder prozentual angegeben werden.

Siehe HTML-Dokumentation.

 

[ Beispiel ]

Erzeugt ein List Control mit einer HTML Spalte. In der HTML Spalte wird ein Gauge Control verwendet.


<%@ taglib uri="http://www.common-controls.com/cc/tags-ctrl"    prefix="ctrl" %>

<ctrl:list
   action="bookBrowse"
   name="booklist"
   title="books"
   rows="10"
   width="650">


   <ctrl:columnhtml title="skills" width="150" id="row">
      <ctrl:gauge
         name="row"
         property="skills"
         emptyText="No Skills"
         width="120"
         height="4"/>

   </ctrl:columnhtml>
</ctrl:list>