[NetBeans]+[Hibernate]+[JSF] - wyświetlanie danych z bazy

0

Witam.
Próbuję wyświetlić dane z bazy w tabeli.

  1. Połączenie z bazą jest.
  2. W wybranej tabeli są dane (tabela <b>params</b>)
  3. Tworzę mapowanie tabeli bazy danych (plik Params.hbm.xml i klasa - Params.java)
  4. Tworzę w sessionBean1.java propertisa allParams typu Params[] wraz z geterem i seterem
  5. Wrzucam komponent Table, klikam prawym ->table layout i wybieram pola do wyświetlania
  6. Uruchamiam projekt i wyświetla mi, że "no items found"

co zgubiłem? Czy w Sessionbean1.java muszę wpisać jakiś kod, który będzie wypełniał moją tabelę allParams?

0

Doszedłem do tego, że jak w SessionBean1.java stworzę parametr:
protected Params[] allParams;
to powinienem stworzyć metodę typu

 private void updateAllParams(){
// jakiś kod
// jakiś kod

allParams = (Params[]) ...... ; // jakaś wartość 
}

Problem w tym, że nie mam pojęcia skąd brać wartości. Czy powinienem zrobić jakiegoś select-a?

0
  1. tworzysz baze
  2. robisz mapowanie na klasy, czy to w xml'u czy tez przez annotacje
  3. tworzysz klasę/klasy odpowiadającą twojej tabeli/tabelom
  4. wpisujesz jakieś przykładowe kilak rekordów do bazy, żeby mieć co wyświetlać
  5. tworzysz sobie jakąś klasę serwisową ( np PersistenceHelper ) w której implementujesz sobie metody, które zadają zapytania do bazy danych ( np.: findCostam() )
  6. W managedBeanie ( niekoniecznie SessionBean1, lepiej w tym stworzonym dla konkretnej strony jsp ) wywołujesz tą metodę findCostam i jej wynik przypisujesz do twojej tabeli na stronie JSP poprzez parametr value

poczytaj sobie najpierw jak w ogóle JSF działa, zanim zaczniesz coś pisać

0

Dzięki za radę. Bardzo mi pomogłeś - zacząłem myśleć i powoli chwytam o co w tym chodzi. Jakbyś mógł mi podesłać jakiś dobry link do poczytania o JSF, to byłbym wdzięczny. Na razie korzystam z tutoriali NetBeans'a, próbując przystosować je do moich potrzeb.

Zrobiłem coś takiego:
W bean-ie strona.java:

public class Strona extends AbstractPageBean {

//standardowy kod

    public Strona() {
    }
    
    
    protected Params[] allParams;

    public Params[] getAllParams() {
        return allParams;
    }

    public void setAllParams(Params[] allParams) {
        this.allParams = allParams;
    }

//standardowy kod

    @Override
    public void init() {
        //standardowy kod
        fillAllParams();
    }


    private void fillAllParams() {
        List<Params> listOfParams = null;
        try{
            Session session = HibernateUtil.getSessionFactory().getCurrentSession();
            Transaction tx = session.beginTransaction();
//            Params param = (Params)session.load(Params.class);
            Query q = session.createQuery("from Params");
            listOfParams = (List<Params>)q.list();
        }
        catch(Exception e) {
            e.printStackTrace();
        }
        allParams = (Params[]) listOfParams.toArray( new Params[0]);
    }
}

Niestety dalej nie działa, tabela wyświetla się pusta (tabela ma ustawiony Table Layout na pobieranie z obiektu allParams).

0
  1. czemu uzywasz tablicy a nie listy?
  2. jesli juz tablica to ma byc tak:
    allParams = (Params[]) listOfParams.toArray( new Params[listOfParams.size()]);
  3. nie uzywaj netbeansowej biblioteki znacznikow jsf, bo jest zje***a lekko, tylko standaowej

prosty przyklad:
http://balusc.blogspot.com/2006/06/using-datatables.html

polecam ksiazke 'JSF in action' wydawnictwa manning, wielka cegla, ale niezla

0

Masz rację, listą jest wygodniej.
Zrobiłem jakąś namiastkę tego co chcę, ale cały kod wsadzony mam w SessionBean, a w PageBean (Page1.java) tylko:

@Override
    public void prerender() {
//        getSessionBean1().
        try {
            getSessionBean1().buildAllParams();
        }
        catch (Exception ex) {
         log("Error Description", ex);
         error(ex.getMessage());
        }
    }

gdzie buildAllParams() to metoda wyciągająca dane z bazy w postaci:

protected void buildAllParams()
        try {
            Session session = HibernateUtil.getSessionFactory().getCurrentSession();
            Transaction tx = session.beginTransaction();
            Query q = session.createQuery("from Params");
            paramsList = (List<Params>) q.list();


        }
        catch(Exception e) {
            e.printStackTrace();
        }
    }

Nie wiem jak napisać buildAllParams() żeby wsadzić ją do PageBean i żeby działała.
Czy funkcję createQuery znajdę gdzieś indziej niż tylko w obiekcie klasy Session?

...i dodatkowe pytania - w jaki sposób page1.jsp jest połączona z page1.java? W żadnym pliku xml nie ma zapisanych informacji o tym, więc gdzie NetBeans zapisuje te informacje? Wiem, że jak przypiszę dane do tabeli z obiektu dane klasy SessionBean, to w jsp pojawi się
sourceData="#{SessionBean.dane}", ale przecież w edytorze plik jsp i java są ze sobą ściśle skojarzone.
Pytanie to przyszło mi do głowy przy okazji próby zrozumienia jak działa aplikacja web-owa. Wydaje mi się, że jest tak:

  1. Wywołanie requesta z przeglądarki skutkuje odpaleniem web.xml - ten przekierowuje mnie na plik strona1.jsp
  2. Odpala się plik strona1.java (nie wiem czemu nie strona1.jsp - to nigdzie nie jest zapisane w kodzie).
  3. Co dalej? Jaka jest kolejność wywołań, gdzie jest jakaś funkcja main? W tutorialu do hibernate dla NetBeans piszą:

To use Hibernate you need to create a helper class that handles startup and that accesses Hibernate's SessionFactory [...] The helper class first calls Configuration() to load the hibernate.properties file. The class then calls configure() and loads the hibernate.cfg.xml configuration file. Finally, the helper class builds the SessionFactory to obtain the Session object.

Nie widzę tego w praktyce, bo jak ustawiam breakpoint-a na tą klasę (nazwana HibernateUtil.java), to okazuje się, że program w ogóle nie przechodzi przez ten plik!

Byłbym wdzięczny za opisanie całego procesu (co jest inicjowane jako pierwsze, które metody są wywoływane zawsze i kiedy uruchamia się .java a kiedy .jsp)

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