JSF Lösung einer Aufgabe im "Workshop Java EE7"

hjpsoft

Mitglied
Hallo,

ich habe mir das im Titel benannte Buch von Markus Schießer und Martin Schmollinger gekauft, um grundlegende Kenntnisse der JAVA EE 7, hauptsächlich Java Server Faces zu erlangen.
Bislang ein tolles Lehrbuch, aber beim Kapitel 4.10.4 bekomme ich die Aufgabe nicht gelöst.
Kennt jemand das Buch und hat bereits die Lösung für die Aufgabe "Auslagerung der Eigenschaften des Spendenformulars" ? Es würde mir weiterhelfen, denn derzeit habe ich einen Blackout !

Besten Dank.

Gruß Halo
 

stg

Top Contributor
Was ist denn genau deine Frage? Ich sehe da keine Aufgabe im eigentlich Sinne ... dort wird ja Schritt für Schritt exakt vorgekaut, was man machen soll. Was ist unklar?
 

hjpsoft

Mitglied
Hallo,
ich habe alles durchgeführt, wie gefordert und alles funktioniert. Jetzt kommt eine Aufgabe, zu Vereinfachungszwecken die Attribute textColor und bgColor in einer neuen Class FormConfig mit Setter- und Getter-Methoden zu erzeugen und in FormDonationController zu instanziieren.
Code:
package de.dpunkt.myaktion.controller;
import de.dpunkt.myaktion.data.CampaignProducer;
import javax.faces.view.ViewScoped;
import javax.inject.Inject;
import javax.inject.Named;
import javax.servlet.http.HttpServletRequest;
import java.io.Serializable;

@ViewScoped
@Named
public class EditDonationFormController implements Serializable {
    private static final long serialVersionUID = -4210085664588144340L;
    // private static final long serialVersionUID = 1L;
    private String textColor = "000000";
    private String bgColor = "ffffff";
    @Inject
    private CampaignProducer campaignProducer;
    @Inject
    private HttpServletRequest req;
    public String doOk() {
        return Pages.LIST_CAMPAIGNS;
    }

    private String getAppUrl() {
        String scheme = req.getScheme();
        String serverName = req.getServerName();
        int serverPort = req.getServerPort();
        String contextPath = req.getContextPath();

        return scheme + "://" + serverName + ":" + serverPort + contextPath;
    }

    public String getUrl() {
        return getAppUrl() + "/" + Pages.DONATE_MONEY + ".jsf" + "?bgColor=" + bgColor
                + "&textColor=" + textColor + "&campaignId=" + campaignProducer.getSelectedCampaign().getId();
    }
    public String getTextColor() {
        return textColor;
    }
    public void setTextColor(String textColor) {
        this.textColor = textColor;
    }
    public String getBgColor() {
        return bgColor;
    }
    public void setBgColor(String bgColor) {
        this.bgColor = bgColor;
    }
}
Das habe ich getan. Jetzt habe ich alles probiert, die Variablen mit formConfig.getBgColor und formConfig.getTextColor in der Methode getURL zu hinterlegen, um später mit dem Facelet editDonationForm.xhtml in den beiden ColorPickern zu bedienen.
Code:
<htmlxmlns="http://www.w3.org/1999/xhtml"
      xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
      xmlns:f="http://xmlns.jcp.org/jsf/core"
      xmlns:p="http://primefaces.org/ui"
      xmlns:h="http://xmlns.jcp.org/jsf/html">
<body>
<f:viewcontracts="#{view.locale.language}">
    <ui:compositiontemplate="/template.xhtml">
        <ui:define name="content">
            <h1>#{msg['editDonationForm.edit_donation_form']}</h1>
            <h:form>
                <h:panelGrid columns="2">
                    <h:outputLabelvalue="#{msg['editDonationForm.background_color']}:">
                    </h:outputLabel>
                    <p:colorPickerid="bgColor"value="# editDonationFormController.bgColor}"
                    widgetVar="bgPicker">
                    </p:colorPicker>
                    <h:outputLabelvalue="#{msg['editDonationForm.text_color']}:">
                    </h:outputLabel>
                    <p:colorPicker id="textColor"
                        value="#{editDonationFormController.textColor}"
                        widgetVar="textPicker">
                    </p:colorPicker>
                    <h:outputLabelvalue="#{msg['editDonationForm.form_url']}:">
                    </h:outputLabel>
                    <p:inputTextarea id="url" rows="6" cols="30" readonly="true"
                                    value="#{editDonationFormController.url}" />
                </h:panelGrid>
                <p:commandButton value="#{msg['editDonationForm.url_button']}"update="url"/>
                <p:commandButton value="OK"
                    action="#{editDonationFormController.doOk}"
                    ajax="false" />
            </h:form>
        </ui:define>
    </ui:composition>
</f:view>
</body>
</html>
Leider aktualisieren die ColorPicker nicht, wie gefordert, die TextArea url.
Meine konkrete Frage: Wie muss ich meine neue Klasse FormConfig in EditDonationFormController instanziieren und wie rufe ich die Inhalte der private String textColor und bgColor in dieser neuen Klasse so ab, dass sie über das Facelet bedient werden können?
Wie muss ich das Facelet editDonationForm.xhtml verändern.
Wenn ich einmal den Weg beschrieben bekomme, dann werde ich es wohl wieder verstehen.
Vielen Dank.
Gruß Halo
 

stg

Top Contributor
Jetzt kommt eine Aufgabe, zu Vereinfachungszwecken die Attribute textColor und bgColor in einer neuen Class FormConfig mit Setter- und Getter-Methoden zu erzeugen und in FormDonationController zu instanziieren.
(...)
Das habe ich getan.

Aber nicht in dem Code, den du gepostet hast...

Deine Klasse EditDonationFormController soll ein Attribut vom Typ FormConfig bekommen.

Leider aktualisieren die ColorPicker nicht, wie gefordert, die TextArea url.

Wieso sollte sich da auch irgendwas aktualisieren?

Meine konkrete Frage: Wie muss ich meine neue Klasse FormConfig in EditDonationFormController instanziieren
Da ist nichts magisches. Einfach per new. Du könntest auch per Dependency Injection mit Hilfe einer CDI Factory eine Instanz anfordern, aber das schießt hier übers Ziel hinaus.

und wie rufe ich die Inhalte der private String textColor und bgColor in dieser neuen Klasse so ab, dass sie über das Facelet bedient werden können?

Die EL bietet da mehrere Möglichkeiten. Der Zugriff könnte z.B. so aussehen: #{editDonationFormController.formConfig.textColor}
 

hjpsoft

Mitglied
Vielen Dank für die Antwort. Ich habe das Problem gelöst bekommen!
Es hing an dem new. Wenn man lange raus ist aus der Entwicklung, sollte man vielleicht nicht mit Java EE wieder starten.
Nach der Instanziierung der Klasse FormConfig habe ich den Code der Klasse editDonationFormController wie folgt verändert:
Code:
    public String getUrl() {
        return getAppUrl() + "/" + Pages.DONATE_MONEY + ".jsf" + "?bgColor=" + formConfig.getBgColor()
                + "&textColor=" + formConfig.getTextColor() + "&campaignId=" + campaignProducer.getSelectedCampaign().getId();
    }

   
    public String getTextColor() {
        return formConfig.getTextColor();
    }

    public void setTextColor(String textColor) {
        formConfig.setTextColor(textColor);
    }

    public String getBgColor() {
        return formConfig.getBgColor();
    }

    public void setBgColor(String bgColor) {
        formConfig.setBgColor(bgColor);
    }
Das Facelet editDonationForm.xhtml wurde überhaupt nicht verändert. Beim Drücken auf den Button URL aktualisieren wird die TextArea auch aktualisiert.
Dennoch habe ich eine Blockade! Woher weiß die EL, dass sich hinter '#{editDonationFormController.bgColor}" das private Attribut bgColor aus der Nachbarklasse FormConfig "gemeint" ist.
Code:
 <p:colorPicker id="bgColor" value="#{editDonationFormController.bgColor}"
                    widgetVar="bgPicker">
                    </p:colorPicker>
Aber nochmals vielen Dank für den Rat.
Gruß Halo
 

stg

Top Contributor
Woher weiß die EL, dass sich hinter '#{editDonationFormController.bgColor}" das private Attribut bgColor aus der Nachbarklasse FormConfig "gemeint" ist.

Gar nicht.
Es wird der getter public String getBgColor() {...} aus deiner Backing Bean EditDonationFormController aufgerufen. Das war so auch sicherlich nicht gefragt. Die getter und setter für die Felder, die nun in deiner Klasse FormConfig sind, sollten aus deiner Backing Bean verschwinden. Dort hast du dann nur öffentliche getter und setter für das Feld vom Typ FormConfig. Der Zugriff darauf in der EL sieht dann so aus, wie ich in Beitrag #4 ja schon geschrieben habe.

Das ist übrigens keine Verletzung von Demeters' Law, da FormCondig kein Objekt in diesem Sinne ist, sondern eine Datenstruktur.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
_basti Sinnvolle Bereitstellung mehrerer JRE in einer Unternehmensumgebung Allgemeines EE 2
F Bestandteile einer WSDL Datei verstehen. Allgemeines EE 1
M Zeitgesteuertes Ereignis in einer dynamic web module Anwendung (eclipse) Allgemeines EE 3
G Unit Test einer JavaEE Anwendung schlägt fehl. JNDI Name nicht gefunden. Allgemeines EE 3
O MVC was gehört ins Model bei einer relationalen DB Allgemeines EE 5
J Mit @Schedule annotierte Methode wird nach einer Weile nicht mehr ausgeführt (JBoss AS 7.2) Allgemeines EE 0
OnDemand GUI in einer JavaEE Anwendung Allgemeines EE 6
X Konsolenausgabe einer java klasse in eine jsp umleiten Allgemeines EE 7
C Fotoverwaltung in einer Multi-User Anwendung Allgemeines EE 4
S Aufruf eines EJBs aus einer nativen Java-Applikation Allgemeines EE 1
R Unterschied Instantiierung einer normalen und einer EJB-Klasse Allgemeines EE 1
R Test einer JEE-Anwendung Allgemeines EE 3
B Problem beim einbinden einer CSS in eine JSP Allgemeines EE 8
Y Zugriff auf Files aus einer EAR Anwendung Allgemeines EE 8
M Wegweiser für Projekt einer Katastrophen-Stab-SW gesucht! Allgemeines EE 2
G Exception beim versenden einer Mail Allgemeines EE 3
K Image Folder außerhalb einer EAR lagern? Allgemeines EE 7
M Wie erhällt eine MessageDrivenBean Nachrichten aus einer Queue ? Wer Pollt da gegen die DB? Allgemeines EE 3
MQue include einer jsp in eine andere Allgemeines EE 4
J von einer Standalone zur Web Applikation Allgemeines EE 6
A Timeout nach 30 Minuten Laufzeit einer entfernten Methode Allgemeines EE 3
V JSP BEAN Speichern von einer Zahl nach eingabe Allgemeines EE 2
T Privates Attribut in einer JPA Entitiy Class ohne DB-Spalte? Allgemeines EE 3
G Alternative zu static im Kontext einer SSB Allgemeines EE 4
A Aus einer JSP zugreifen auf ein Objekt einer anderen JSP Allgemeines EE 4
A Geschachtelte Schleifen in einer JSF View ? Allgemeines EE 4
S Permanentbetrieb einer Applikation - Anfängerfrage Allgemeines EE 10
T Cookie setzen in einer JSP Datei Allgemeines EE 4
J Direktaufruf einer jsp nicht zulassen Allgemeines EE 2
O Anzeigen mehrerer columns in einer DataTable Allgemeines EE 4
S In einer Bean-Methode an ndere Beans kommen Allgemeines EE 7
M Wie zeige ich Attribute eines Objekts innerhalb einer JSP an Allgemeines EE 2
N GWT - RPC String-Array in einer List Allgemeines EE 2
RaoulDuke EJB 3.0 - Exceptions aus Methoden einer Session Bean Allgemeines EE 2
F [JNDI] Holen einer EJB Allgemeines EE 3
S Löschen einer Entity kaskadiert nicht auf Collection (1:n) Allgemeines EE 2
N Seiten aufruf in einer JSP Allgemeines EE 4
W Enter in einer Form mit mehreren Submits Allgemeines EE 2
A Problem / Fehler beim Einbinden einer Klasse in ein JSP Allgemeines EE 20
S ResourceBunlde in einer WebApp Allgemeines EE 2
K Prozess-Handling einer Batch-Datei mittels JSP Allgemeines EE 3
E Methoden einer Bean aufrufen? Allgemeines EE 4
G Wurzelverzeichnis einer Webanwendung ermitteln Allgemeines EE 2
P String in ein Textfeld einer externen Seite uebergeben ! Allgemeines EE 2
F Frage zur guten Architektur einer WebApp Allgemeines EE 2
C Externe Bibliothek in einer Webapplikation Allgemeines EE 4
K Design einer J2EE applikation? Allgemeines EE 2
T Änderung des Wertes einer Variable beim Klick auf Link Allgemeines EE 7
C In JSP Befehl zum Laden einer Seite in anderem Frame Allgemeines EE 3
N Einbindung einer Bean in eine JSP (Tomcat-Server 5.5.x) Allgemeines EE 2
S Struts 1.1 download einer Datei Allgemeines EE 4
W Mehrere Applikationenen mit einer Anmeldung möglich? Allgemeines EE 11
K Datei schreiben in einer Web-Application Allgemeines EE 3
N Deployen einer EJB3.0 Bean Allgemeines EE 4
TRunKX Werteübergabe von einer *.jsp in eine *.java ohne struts Allgemeines EE 4
clemson [Struts] Einer Action Parameter übergeben Allgemeines EE 2
S IBM WebSphere - Hinzufügen einer Datei Allgemeines EE 4
T Filesystemzugriff von einer Bean? Allgemeines EE 6
G In einer JSP auf Struts-Elemente "reagieren" Allgemeines EE 4
C Mail von einer Session Bean aus senden Allgemeines EE 2
B mehrere submit-buttons in einer jsp Allgemeines EE 11
B Anstossen einer Methode durch link! Allgemeines EE 4
R HTML CODE EINER SITE AUSLESEN Allgemeines EE 2
R Problem beim hochladen einer Web Application Allgemeines EE 16
T Werte aus einer Auswahliste mit Mehrfachauswahl lesen Allgemeines EE 4
OnDemand Programm starten, wenn eine Aufgabe erledigt Allgemeines EE 1

Ähnliche Java Themen

Neue Themen


Oben