Przedstawię teraz mały projekcik w JAVA EE. Skorzystałem tu z technologii JavaServer Faces oraz frameworku PrimeFaces. Celem aplikacji jest przedstawienie w formie strony internetowej dynamicznego widoku typu master-detail. Master-detail  cechuje to, że za pomocą kliknięcia na pole z listy w okienku master, wyświetla się jego wartość powiązana w oknie detail. Dzięki takiemu rozwiązaniu w sposób przejrzysty można oglądać dużą liczbę rekordów w bazie. W tym konkretnym przykładzie pracuje co prawda nie na fizycznym silniku bazy danych (np. MySQL) tylko na danych zapisanych w tablicy, ale zasada jest podobna. Należy pamiętać jedynie, że relacja pomiędzy listą okna Master a danymi w oknie Detail wynosi jeden do wiele.


A teraz trochę szczegółów. Rozkład pakietów ma się następująco:


Controller ->zawiera klasę typu ManagedBean o nazwie TableBean
Model -> zawiera dwie klasy typu POJO o nazwie Klub i Zawodnik
Service -> posiada klasę FillData, obsługującą dane o zawodnikach i klubach


Zgodnie z zasadą Model-View-Control, należy oddzielić trójwarstwową architekturę aplikacji. Warstwa klas modelowych zawierają nic innego jak pola, konstruktory oraz właściwości pól. Centralną częścią kontrolera jest zarządca Beanów (ManagedBean), poprzez który będzie dokonywane mapowanie danych w widoku (czyli stronie xhtml).  Na samym końcu jest strona zaprogramowana w PrimeFaces, wyłapująca za ca pomocą języka EL odpowiednie struktury danych.  Aplikacja rozpoznaje, która klasa jest Zarządcą dzięki adnotacji @ManagedBean na klasie. Ponad to można ustawić odpowiedni zasięg działania Beana (patrz niżej). W tym przypadku ustawiłem na ViewScoped, z racji że miał to być przecież widok typu Master-Detail. Jak już wspominałem ideą tego projektu jest przeładowywanie jednego okna, a nie całej aplikacji. Framework PrimeFaces ułatwia programiście całą pracę umożliwiając wywołanie słuchaczy poprzez Ajax (asynchroniczne). Z tego też powodu, klasa ManagedBeana powinna być Serializable (dzięki czemu można odtworzyć stan obiektu).

 

Klasa zarządzająca treścią aplikacji:


@ManagedBean(name="tableBean")
   @ViewScoped
   public class TableBean implements Serializable{     
        private List listaKlubow;  
        private Klub selectedOne;      
        private FillData fillData = new FillData();
        
        public TableBean() {  
            listaKlubow = new ArrayList();
            fillData.populateRandom(listaKlubow, 50);
        }  
          
        public List getListaKlubow() {  
        return listaKlubow;  
    }
    
        public void setListaKlubow(List listaKlubow) {  
            this.listaKlubow= listaKlubow;  
        }
              
        public Klub getSelectedOne() {  
            return selectedOne;  
        }  
        
        public void setSelectedOne(Klub selectedOne) {  
            this.selectedOne = selectedOne;  
        }  

        public void onRowSelect(SelectEvent event) {  
            FacesMessage msg = new FacesMessage("Sklad zaznaczony", ((Klub) event.getObject()).getNazwaKlubu());
            FacesContext.getCurrentInstance().addMessage(null, msg);  
        }  
      
        public void onRowUnselect(UnselectEvent event) {  
            FacesMessage msg = new FacesMessage("Sklad odznaczony", ((Klub) event.getObject()).getNazwaKlubu());  
            FacesContext.getCurrentInstance().addMessage(null, msg);  
        }  
    }  

 

Klasa losowo wypełniająca danymi listę klubów:


public class FillData {
        
    public FillData() {}
    
    private final static String[] colors;
    private final static String[] title;
    private final static String[] firstName;
    private final static String[] sirName;
        
        static {  
            colors = new String[10];
            colors[0] = "Czarne";  
            [...]
            sirName[9] = "Sobiech";
        }   
 
        private int getRandomYear() {  
            return (int) (Math.random() * 50 + 1910);  
        }  

        private String getRandomColor() {  
            return colors[(int) (Math.random() * 10)];  
        }  

        private String getRandomTitle() {  
            return title[(int) (Math.random() * 10)];  
        }  
        
        private String getRandomFirstName() {  
            return firstName[(int) (Math.random() * 10)];  
        }
        
        private String getRandomSirName() {  
            return sirName[(int) (Math.random() * 10)];  
        }
        
        private String getRandomShort() {
            int randomInt = (int)(Math.random() * 10);
            return title[randomInt].toString().substring(0, 6);  
        }  
      
        public void populateRandom(List list, int size) [...]
}

 

Widok Master-Detail w NetBeansie

blog comments powered by Disqus