Forum Client - Spring in Swing Paweł Charkowski. 0. Cel projektu Celem projektu jest próba integracji Spring Framework z różnymi technologiami realizacji interfejsu użytkownika, oraz jej ocena. Niniejszy dokument dotyczy integracji Spring MVC z technologią Java Swing z wykorzystaniem wzorca projektowego MVC. Przykładową aplikacją dla realizacji celu projektu jest prosty klient forum. 1. Budowa Systemu 1.1. Architektura Klient łączy się za pośrednictwem RMI z dedykowanym serwerem (rys. 1). rys.1 Architektura systemu
1.1.1. Serwer forum Serwer forum udostępnia niżej opisany interfejs: Thread[] getthreads() Pobranie wszystkich wątków z serwera Forum Thread createthread(string username, String title) Stworzenie nowego wątku Message[] getmessages(int threadid) Pobranie wiadomości z danego wątku Message createmessage(int threadid, String username, String text) Stworzenie wiadomości w danym wątku boolean modifymessage(int messageid, String username, String text) Modyfikacja wybranej wiadomości 1.1.2. Klient forum Swingowy Aplikacja klienta została wykonana przy użyciu technologii Java Swing. Klient realizuje następującą funkcjonalność: przejrzenie istniejących wątków dodanie nowego wątku przejrzenie wiadomości dla danego wątku dodanie nowej wiadomości dla danego wątku zmodyfikowanie wybranej wiadomości 1.2. MVC Rys. 2. - wzorzec MVC
2. Budowa i zasada działania aplikacji 2.1. Diagram klas Rys.3 diagram klas
2.2. Opis klas Forum interfejs udostępniany przez serwer forum Thread klasa przechowująca informacje o wątku Message klasa przechowująca wiadomość ForumConnector łączy się z serwerem forum uniezależniając programistę od protokołu warstwy sieciowej (w naszym przypadku RMI) SwingClientController kontroler aplikacji, obsługujący zdarzenia przełączenia pomiędzy elementami graficznego interfejsu użytkownika SwingClientWindow reprezentuje okienko wyświetlające klienta forum CreateThreadPanel panel pozwalający na utworzenie nowego wątku forum ModifyMessagePanel pozwala na modyfikację wiadomości zamieszczonej na forum ThreadsPanel panel wyświetlający wątki dostępne na forum ThreadDetailsPanel panel wyświetlający wiadomości należące do danego wątku xxxxxxxlayout określa położenie elementów GUI w odpowiednim panelu ThreadsTableModel przechowuje informacje o wątkach pobranych z forum MessagesTableModel przechowuje informacje o wyświetlanych wiadomościach 2.3. Zasada działania 2.3.1. Przełączenia pomiędzy widokami (rys. 4 poniżej): W aplikacji możliwe są następujące przejścia pomiędzy wyświetlanymi panelami
rys. 4. - przejścia między panelami Przełączanie pomiędzy widokami odbywa się za pośrednictwem kontrolera, który po otrzymaniu żądania zmiany widoku, informuje odpowiedni widok o potrzebie aktualizacji zawartości a następnie podpina go do okna aplikacji. 3. Wzorzec projektowy MVC (Model-Widok-Kontroler) w SwingClient 3.1 Rola poszczególnych klas w modelu MVC 3.1.1 Model Reprezentowany jest przez klasę Model. Odpowiada on za komunikację z serwerem forum poprzez sieć ( z wykorzystaniem technologii RMI). Zasłania on także warstwę sieciową przed programistą udostępniając proste API do obsługi bazy danych. 3.1.2 Widok
Realizowany przez klasy graficznego interfejsu użytkownika 3.1.3 Kontroler Realizowany jest przez klasę SwingClientGUIController. 3.2 Reużywalność komponentów 3.2.1 Ponowne wykorzystanie modelu Moduł pełniący rolę modelu jest w pełni reużywalny. Reprezentuje on serwer forum po stronie localhost a i odpowiada za wysyłanie zapytań i odbieranie odpowiedzi od serwera z wykorzystaniem RMI. Dzięki czemu zwalnia on programistę od problemów związanych z komunikacją z serwerem i pozwala mu skupić się na rozwiązywanym problemie. 3.2.2 Ponowne wykorzystanie kontrolera Kontroler aplikacji (reprezentowany przez klasę SwingClientGUIController) jest ściśle związany z okienkową technologią JAVA Swing wykorzystaną przy realizacji modułu klienta. W związku z tym faktem po niewielkich modyfikacjach kodu mógłby on zostać użyty w innym kliencie okienkowym. Natomiast ze względu na swój charakter nie nadaje się on do zastosowania w jakimkolwiek kliencie opartym o technologie webowe. 4. Integracja klienta ze Springiem 4.1. Sposób integracji Ze względu na konsolowy charakter klienta forum opartego o Swing wykorzystanie wbudowanego w Spring a modelu Web MVC stało się niemożliwe, głównie ze względu na sposób komunikacji w aplikacjach webowych oparty o protokół http. Próba wykorzystanie Spring Web MVC sprowadziła by się do napisania komunikacji opartej o HttpRequest i HttpResponse co przyczyniło by się do dużo zwiększonego nakładu pracy potrzebnego do stworzenia działającego klienta okienkowego.
Wykorzystany został natomiast mechanizm pozwalający na zarządzanie instancjami poszczególnych klas do reprezentowania poszczególnych komponentów systemu, by zwolnić programistę od konieczności ustawiania referencji do poszczególnych obiektów a także celem zwiększenia wydajności aplikacji by nie tworzyć co chwilę nowych instancji komponentów z których w danym momencie wykorzystywany jest co najwyżej jeden. 4.2. Ocena integracji Zastosowanie reprezentowania poszczególnych komponentów aplikacji oraz elementów interfejsu graficznego jako beanów instancjonowanych przez framework Spring pozwala na uproszczenie procesu implementcaji aplikacji. Jednakże Spring wydaje się być bardziej dostosowany do ułatwiania tworzenia klientów opartych o technologie webowe. 5. Pliki źródłowe 5.1 Pliki konfiguracyjne pl/edu/agh/pp/swingclient/spring-swing-context.xml 5.2. Pliki źródłowe pl/edu/agh/pp/swingclient/forumconnector.java pl/edu/agh/pp/swingclient/swingclientcontroller.java pl/edu/agh/pp/swingclient/gui/createthreadpanel.java pl/edu/agh/pp/swingclient/gui/modifymessagepanel.java pl/edu/agh/pp/swingclient/gui/swingclientwindow.java pl/edu/agh/pp/swingclient/gui/threaddetailspanel.java pl/edu/agh/pp/swingclient/gui/threadspanel.java pl/edu/agh/pp/swingclient/gui/layouts/guiclientmessagelayout.java pl/edu/agh/pp/swingclient/gui/layouts/guiclientthreadlayout.java pl/edu/agh/pp/swingclient/gui/layouts/modifymessagelayout.java pl/edu/agh/pp/swingclient/gui/layouts/newthreadlayout.java pl/edu/agh/pp/swingclient/gui/listeners/threadstableselectionlistener.java pl/edu/agh/pp/swingclient/gui/tablemodels/messagestablemodel.java pl/edu/agh/pp/swingclient/gui/tablemodels/threadstablemodel.java