TabSetControl
Register für umfangreiche Masken, auch mehrstufig verschachtelt.
TabSetControl in 6 Schritten einbauen
Die Tour zeigt, wie sich das Kontrollelement auch nachträglich in eine bestehende Anwendung integrieren lässt.
TabControl - Gegenstand
Diese Übung demonstriert den Einsatz des TabSetControls. Im Rahmen der Übung wird ein TabSet erstellt, das mehrere JSP-Seiten zur Darstellung der Taben (Reiter) inkludiert. Das TabSetControl kann mit oder ohne Server Roundtrips arbeiten. Zudem läßt sich die Anzahl der sichtbaren Taben beschränken. Sind mehr Taben vorhanden, werden entsprechende Navigationselemente eingeblendet. Das Scrolling durch die Taben ist ebenfalls ohne Server Roundtrips möglich.
Beispieldarstellung TabSetControl
Innerhalb der Übung wollen wir das nachfolgende TabSet erstellen:
Zum Einsatz des TabSetControls sind folgende Schritte notwendig:
- Auswahl des Designs für die Benutzeroberfläche
- Erstellung einer Action-Klasse zur Aufruf der JSP-Seite
- Bereitstellung der Anzeigedaten je Tabe
- Konfiguration des Tabsets innerhalb der JSP-Seite
1. Registrierung der Painterfactory
Zuerst erfolgt die Registrierung der Painterfactory. Sie legt fest, welches Design die Benutzeroberfläche erhält. Dies kann anwendungsweit in der init()-Methode des Frontcontroler-Servlets geschehen.1 Wir wählen hier das Standarddesign, welches uns der DefaultPainter bereitstellt.2
import javax.servlet.ServletExceptionimport org.apache.struts.action.ActionServlet;import com.cc.framework.ui.painter.PainterFactoryimport com.cc.framework.ui.painter.def.DefPainterFactory;import com.cc.framework.ui.painter.html.HtmlPainterFactory;public class MyFrontController extends ActionServlet { public void init() throws ServletException { super.init(); // Register all Painter Factories // with the preferred GUI-Layout // In this case we only use the Default-Layout. PainterFactory.registerApplicationPainter ( getServletContext(), DefPainterFactory.instance()); PainterFactory.registerApplicationPainter ( getServletContext(), HtmlPainterFactory.instance()); }}
*1) Wenn der einzelne Benutzer zwischen verschiedenen Oberflächendesigns wählen können soll, dann werden zusätzliche PainterFactorys in der Benutzersession registriert. Dies erfolgt meist in der LoginAction mit PainterFactory.registerSessionPainter() im Session Scope.
*2) Weitere Designs (PainterFactories) sind im Lieferumfang der Professional Edition enthalten, oder können selbst entwickelt werden.
2. Ableitung der Action Klasse für den Struts-Adapter
In unserem Beispiel wollen wir ein TabSet erstellen, dass drei Taben über JSP-Seiten inkludieren. Das TabSet soll ohne Server Roundtrips arbeiten. Dies bietet sich dann an, wenn die zu präsentierenden Daten zu einem Zeitpunkt vollständig bereitgestellt werden können und, wie in unserem Fall, logisch zusammen hängen. Bei komplexen Masken mit heterogenen Informationsinhalten ist es hingegen meist günstiger die Daten erst bei einem Wechsel auf die entsprechende Tabe zu laden.
Die Ermittlung der Anzeigedaten übernimmt bei uns die Aktionklasse "UserProfileEditAction". Sie ist von der Klasse FWAction abgeleitet, welche die Struts-Action Klasse kapselt und um Funktionalitäten des Präsentationsframeworks erweitert. Dabei wird anstelle der execute()-Methode die doExecute()-Methode aufgerufen. [FWAction ist von org.apache.struts.action.Action abgeleitet] Sie erhält beim Aufruf den ActionContext, über den der Zugriff auf weitere Objekte, wie das Session-, Request- und Response-Objekt gekapselt ist.
import java.io.IOException;import javax.servlet.ServletException;import com.cc.framework.adapter.struts.FWActionimport com.cc.framework.adapter.struts.ActionContextpublic class UserProfileEditAction extends FWAction { /** * @see com.cc.framework.adapter.struts.FWAction#doExecute(ActionContext) */ public void doExecute(ActionContext ctx) throws IOException, ServletException { // see next chapter }}
3. Bereitstellung der Anzeigedaten
Da unser TabSetControl clientseitig, d.h ohne Server Roundtrips, zwischen den Taben umschalten soll, müssen zu Begin alle Daten geladen werden. Zur Übergabe an die JSP-Seite verwenden wir dabei eine Formbean. Sie dient bietet den verschiedenen Taben den Zugriff auf die Anzeigedaten.
import java.io.IOException;import javax.servlet.ServletException;import com.cc.framework.adapter.struts.ActionContext;import com.cc.framework.adapter.struts.FWAction;import com.cc.framework.adapter.struts.FormActionContext;import com.cc.sampleapp.common.Messages;import com.cc.sampleapp.common.User;import com.cc.sampleapp.tabset.sample402.form.UserProfileEditForm;public class UserProfileEditAction extends FWAction { /** * @see com.cc.framework.adapter.struts.FWAction#doExecute(ActionContext) */ public void doExecute(ActionContext ctx) throws IOException, ServletException { try { // Generate a Default User for our Example User user = new User("FAS"); user.load(); initFormBean(ctx, user); } catch (Throwable t) { ctx.addGlobalError("Error while loading User Object", t); log.error("Error: ", t); } // Display the JSP ctx.forwardToInput(); } /** * Initializ the Form with the User-Data * @param ctx ActionContext * @param user User-Object * @exception java.lang.Exception */ private void initFormBean(ActionContext ctx, User user) throws Exception { UserProfileEditForm form = (UserProfileEditForm) ctx.form(); form.setUserId( user.getUserId()); form.setFirstName( user.getFirstName() ); form.setLastName( user.getLastName() ); form.setRole( user.getRole() ); form.setGuitype( user.getSettings().getGuitype() ); form.setDefprinter( user.getSettings().getDefprinter() ); }}
4. Konfiguration des TabSets innerhalb der JSP-Seite
Um das TabSet-Tag auf einer JSP Seite einzusetzen, muss am Anfang der Seite die entsprechende Tag Library deklariert werden. Anschließend können die Common-Controls mit dem Präfix <ctrl:tagname /> verwendet werden. [Zudem muss die Aufnahme der Tag Bibliothek im Deployment-Deskriptor, der WEB-INF/web.xml Datei, erfolgen].
<%@ taglib uri="/WEB-INF/tlds/struts-html.tld" prefix="html" %><%@ taglib uri="/WEB-INF/tlds/cc-controls.tld" prefix="ctrl" %><html:form action="/sample402/userprofilEdit" method="post"> <ctrl:tabset id="uptabset" property="tabset" tabs="3" labellength="20" width="450" runat="client"> <ctrl:tab id="tab1" title="User" content="Tab_Page1.jsp" tooltip="User Display"/> <ctrl:tab id="tab2" title="Settings" content="Tab_Page2.jsp" tooltip="User Settings"/> <ctrl:tab id="tab3" title="History" content="Tab_Page3.jsp" tooltip="History"/> </ctrl:tabset></html:form>
In unserem Beispiel haben wir der Übersichtlichkeit die einzelnen Taben als eigenständige JSP-Seiten inkludiert. Der ausführliche Source-Code ist mit der Demoversion erhältlich.
Alternativ kann der HTML-Code auch direkt innerhalb des Tag-Bodys einer Tabe angegeben werden:
<ctrl:tab id="tab3" title="History" tooltip="History"/> <b>Hello World!</b> </ctrl:tab>
Tour Ende
Das TabSetControl lässt sich schnell und einfach integrieren. Über die Konfiguration in der JSP-Seite lassen sich schnell neue Taben hinzufügen, die sich zusätzlich berechtigungsabhängig steuern lassen. Der HTML-Code wird über einen Painter erzeugt. Andere Designs lassen sich durch eine Anpassung der Painter realisieren. Dabei können verschiedene Designs auch parallel verwendet werden.
Features des TabSetControls:
- Umschalten der Taben über Serverroundtrip oder clientseitig (ohne serverroundtrip) konfigurierbar.
- Unterstützt clientseitiges scrolling durch die Taben.
- Erlaubt das Includieren beliebiger JSP-Seiten als Taben.
- Icons vor den Labels auf den Taben einsetzbar.
- Einzelne Taben deaktivierbar.
- Design durch Painterfactory an eigenen StyleGuide (Corporate Identity) anpassbar.
- Verschachtelte TabSets möglich.
- Optimierter HTML-Code.
- Gleiches Look and Feel in Microsoft InternetExplorer > 5.x und Netscape Navigator > 7.x
Fertige Konfigurationen zum Übernehmen
Screenshot, Konfiguration und der zugehörige JSP-Code.
Konfiguration
- TabSetControl mit 6 Taben, davon 6 sichtbar
- Die einzelnen Taben werden als separate JSP Seiten includiert
- Die dritte Tabe wurde disabled und kann nicht angewählt werden
- Das Attribute runat="server" besagt, dass bei einem Klick auf eine Tabe ein Serverroundtrip zum Aufbau der nächsten Tabe durchgeführt werden soll.
- Über eine ImageMap kann ein optionales Bild auf einer Tabe angezeigt werden.
<util:imagemap name="im_tabs"> <util:imagemapping rule="user" src="app/images/user/user.gif" width="16" height="16"/></util:imagemap><html:form action="/sample401/tabsetBrowse" method="post"><ctrl:tabset id="man" name="demots" action="sample401/tabsetBrowse" tabs="6" labellength="20" width="650" imagemap="im_tabs" runat="server"> <ctrl:tab id="tab1" title="Books" content="Tab_Page1.jsp" tooltip="Books"/> <ctrl:tab id="tab2" title="Movies & DvDs" content="Tab_Page2.jsp" tooltip="Movies"/> <ctrl:tab id="tab3" title="Musik CDs" content="Tab_Page3.jsp" tooltip="Disabled Tab" enable="false"/> <ctrl:tab id="tab4" title="Nested TabSet" content="Tab_Page4.jsp" tooltip="Demo of a nested TabSet"/> <ctrl:tab id="tab5" title="Simple SVG-Graphic" content="Tab_Page5.jsp" tooltip="SVG-Example"/> <ctrl:tab id="tab6" title="My Account" content="Tab_Page6.jsp" tooltip="My Account" imageref="user"/></ctrl:tabset></html:form>
Konfiguration
- TabSetControl mit 6 Taben, davon 4 sichtbar. Eingeblendete Buttons für clientseitiges scrollen
- Die einzelnen Taben werden als separate JSP Seiten includiert
- Die dritte Tabe wurde disabled und kann nicht angewählt werden
- Das Attribute runat="client" besagt, dass bei einem Klick auf eine Tabe kein Serverroundtrip zur Darstellung der nächsten Tabe durchgeführt wird. Die Taben wurden alle bei der ersten Anzeige des Tabsets zum Client übertragen. Über DHTML werden die Taben lediglich ein oder ausgeblendet.
- Das TabSet verwendet zur Integration von Bildern auf den einzelnen Taben eine ImageMap
<util:imagemap name="im_tabs"> <util:imagemapping rule="user" src="app/images/user/user.gif" width="16" height="16"/></util:imagemap><html:form action="/sample401/tabsetBrowse" method="post"><ctrl:tabset id="man" name="demots" action="sample401/tabsetBrowse" tabs="4" labellength="20" width="650" imagemap="im_tabs" runat="client"> <ctrl:tab id="tab1" title="Books" content="Tab_Page1.jsp" tooltip="Books"/> <ctrl:tab id="tab2" title="Movies & DvDs" content="Tab_Page2.jsp" tooltip="Movies"/> <ctrl:tab id="tab3" title="Musik CDs" content="Tab_Page3.jsp" tooltip="Disabled Tab" enable="false"/> <ctrl:tab id="tab4" title="Nested TabSet" content="Tab_Page4.jsp" tooltip="Demo of a nested TabSet"/> <ctrl:tab id="tab5" title="Simple SVG-Graphic" content="Tab_Page5.jsp" tooltip="SVG-Example"/> <ctrl:tab id="tab6" title="My Account" content="Tab_Page6.jsp" tooltip="My Account" imageref="user"/></ctrl:tabset></html:form>
Konfiguration
- Begrenzung der Länge der Labels auf den Taben auf 8 Stellen
- Sonstige Einstellungen wie im Konfigurationsbeispiel 2
<html:form action="/sample401/tabsetBrowse" method="post"><ctrl:tabset id="man" name="demots" action="sample401/tabsetBrowse" tabs="6" labellength="8" width="650" runat="server">// see Example 2