Tutorial J2EE 6

0

Witam

Chciałem rozpocząć przygodę z j2ee.
Mam prawdopodobnie proste pytanie związane z tutorialem:

_http://netbeans.org/kb/docs/javaee/javaee-gettingstarted.html

W pliku theend.xhtml mamy:

<h:body>
    <h:outputLabel value="Thanks! There are "/>
    <h:outputText value="#{MessageView.numberOfMessages}"/>
    <h:outputLabel value=" messages!"/>
</h:body>

I tu pytanie, skąd wzięła się metoda numberOfMessages?
W pliku MassageView.java jej nie ma.

Pozdrawiam

0

Może jakis błąd przy aktualizacji tutoriala, bo widzę, że w klasie jest metoda getNumberOfMessages

0

Witam

Gdybym wpisał


 <h:body>
        Hello from Facelets
        <h:outputLabel value="Thanks! There are "/>
        <h:outputText value="#{MessageView.getNumberOfMessages}"/>             <!--numberOfMessages-->
        <h:outputLabel value=" messages!"/>
    </h:body>

To tutorial nie będzie działał.

Pozdrawiam

0

Wszystko jest jak powinno być. To jest podstawowa koncepcja beanów: w klasie są pola, np. numberOfMessages, są one (ono) prywatne. Pola mają metody dostępowe get... i set... utworzone tak, ze nazwa pola brana z wielkiej litery jest poprzedzona przedrostkiem. Dostęp jest tylko przez te metody i tak na prawdę nie ma znaczenia, czy pole istnieje. Tutaj jest podobnie zapis MessageView.numberOfMessages oznacze, że trzeba pobrać wartość z pola numberOfMessages przez metodę dostępową, a więc wywołać getNumberOfMessages(), która taką wartość zwróci. I nie ma znaczenia, że tego pola tam nie ma. Podobnie będzie przy zapisie wartości do pola: będzie wywoływana metoda set... niezależnie, czy pole istnieje, czy też nie.

0

Tylko czy w samym projekcie można gdzieś tą klasę znaleźć?
Czy ma ona domyślne zmienne?
Gdzie szukać?

Pozdrawiam i dziękuję za odpowiedź

0

A teraz to ja nie rozumiem: jaką klasę chcesz szukać? MessageView jest w pakiecie my.presentation w gałęzi Source Packages. Jakie zmienne domyślne? Szukaj w swoim projekcie w NB (bo zakładam, że używasz NetBeans).

0

Cała klasa MessageView

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package my.presentation;

import boundary.MessageFacade;
import entities.Message;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;

/**
 *
 * @author waldek
 */
@ManagedBean(name = "MessageView")
@RequestScoped
public class MessageView {
    //Creates a new field
    private Message message;
    
    /** Creates a new instance of MessageView */
    public MessageView() {
        this.message = new Message();
    }
    
    public Message getMessage(){
        return message;
    }
    
    public int getNumberOfMessages(){
        return messageFacade.findAll().size();
    }
    //test
    //public String showMessages(){
    //    return messageFacade.findAll().toString();
    //} nie działa MessageFacade doesn't have property
    //koniec test
    
    public String postMessage(){
        this.messageFacade.create(message);
        return "theend";
    }
    //Injects the MessageFacade
    @EJB
    private MessageFacade messageFacade;
    
}

Tutaj jest tylko metoda getNumberOfMessages().
Czy to jest to?

Szczerze mówiąc nigdzie nie znalazłem metody numberOfMessages().

0

#{MessageView.numberOfMessages} wywołuje metodę getNumberOfMessages() z klasy oznaczonej @ManagedBean(name = "MessageView").
Takiej metody nie ma: numberOfMessages().
Zajrzyj tutaj: http://pl.wikipedia.org/wiki/JavaBeans
Konkretnie chodzi o konwencję nr 2. Na dole jest kod, który to pokazuje. W klasie z tutka jest podobnie, ale nie ma tego pola, bo zgodnie z konwencjami trzeba się do niego odwoływać przez odpowiednią metodę (getter albo setter). Może to dziwne, ale nie wiem jak to jaśniej powiedzieć.

0

Jasne konwencja ustawiania i manipulowania zmienną "prywatną" przez getters & setters jest mi znana , ale skąd miałbym wiedzieć, gdybym nie korzystał z podpowiedzi, jak wywołać tą metodę w pliku MessageView.java czyli :

public int getNumberOfMessages(){
        return messageFacade.findAll().size();
    }

w pliku theend.xml

<h:outputText value="#{MessageView.numberOfMessages}"/>

Pozdrawiam i dziękuję za odpowiedź

0
chodnik napisał(a)

Wszystko jest jak powinno być. To jest podstawowa koncepcja beanów: w klasie są pola, np. numberOfMessages, są one (ono) prywatne. Pola mają metody dostępowe get... i set... utworzone tak, ze nazwa pola brana z wielkiej litery jest poprzedzona przedrostkiem. Dostęp jest tylko przez te metody i tak na prawdę nie ma znaczenia, czy pole istnieje. Tutaj jest podobnie zapis MessageView.numberOfMessages oznacze, że trzeba pobrać wartość z pola numberOfMessages przez metodę dostępową, a więc wywołać getNumberOfMessages(), która taką wartość zwróci. I nie ma znaczenia, że tego pola tam nie ma. Podobnie będzie przy zapisie wartości do pola: będzie wywoływana metoda set... niezależnie, czy pole istnieje, czy też nie.

Tak to działa ;-)

Pozdrawiam i dziękuję

1 użytkowników online, w tym zalogowanych: 0, gości: 1