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
 
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?
 
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
 
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}
 
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
 
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.
 

Zurück
Oben