Aplikacja webowa w Javie szybkie programowanie biznesowych aplikacji Spring Boot + Vaadin Czym jest Spring Boot? Spring Boot jest szkieletem aplikacji, opiera się o Spring Framework czyli Framework szeroko stosowany w aplikacjach webowych. Spring Boot ma w sobie wiele dodatkowych modułów, które umożliwiają programowanie aplikacji webowych. Aby uruchomić aplikację webową, należy wystawić serwer z którym aplikacja będzie się komunikować. Spring Boot m.in. ma zintegrowany serwera aplikacji np. Tomcat, czyli nie ma potrzeby dodatkowej instalacji na serwerze jakiejkolwiek usługi aby aplikacja mogła produkcyjnie funkcjonować. http://projects.spring.io/spring-boot/ Czy jest Vaadin? Framework umożliwiający projektowanie aplikacji webowych opartych o technologie Javascript w języku Java. Aplikacja zrealizowana o ten framework opiera się o architekturę kilent-serwer możliwość programowania zarówno po stronie klienta jak i serwera. Zaletą jest łatwy deployment oraz szeroki zasób komponentów graficznych. https://vaadin.com/home
1. Szablon projektu wraz z zależnościami https://start.spring.io/ Typ projektu o Maven Potrzebne zależności o Web o Vaadin o JPA o Apache Derby o Wersja Spring Boot 1.3.5
2. Import projektu Import wygenerowanego projektu do środowiska IDE Eclipse 3. Uruchomienie aplikacji Aplikacja jest wystawiona na domyślnym porcie tomcat a - 8080
4. Klasa UI Dodajemy klasę MyUI @Theme(ValoTheme.THEME_NAME) @SpringUI public class MyUI extends UI { @Override protected void init(vaadinrequest request) { setcontent(new Label("Moja pierwsza aplikacja")); Adnotacja @SpringUI, którą można umieszczać nad klasą automatycznie jest wykrywana i konfigurowana przez Springa. Klasa dziedzicząca po klasie UI jest reprezentacją okna przeglądarki albo jej części. W metodzie init(vaadinrequest request), można ustawić zawartość okna przeglądarki, wypełniając content różnymi komponentami. Metoda init wywoływana jest przy każdorazowym odświeżeniem strony i jest wywoływana po zainicjalizowaniu komponentów graficznych. W powyższym przykładzie ustawiona została zawartość okna przeglądarki na komponent typu Label z przykładowym tekstem. Spis dostępnych elementów z przykładowym zastosowanie i wykorzystaniem https://vaadin.com/elements Adnotacja @Theme definiuje styl aplikacji. W powyższym przykładzie użyto stylu wbudowanego o nazwie Valo https://vaadin.com/valo Klasa MyUI i jej reprezentacja w przeglądarce www 5. Konfiguracja bazy plikowej Derby application.properties spring.jpa.hibernate.ddl-auto=update # Uaktualnienie schematu bazy danych, w przypadku braku, tworzone są tabele spring.datasource.url=jdbc:derby:folderzbaza;create=true # wskazanie na dostęp plikowy do bazy, poprzez wskazanie folderu z bazą + w przypadku braku bazy danych baza utworzy się w zdefiniowanej strukturze katalogu http://docs.spring.io/spring-boot/docs/current/reference/html/howto-database-initialization.html
6. Stworzenie encji Stworzenie encji czyli obiektu bazodanowego @Entity public class Person { @Id @GeneratedValue(strategy = GenerationType.AUTO) private long id; @NotNull private String name; @NotNull private String email; public Person() { public long getid() { return id; public void setid(long id) { this.id = id; public String getname() { return name; public void setname(string name) { this.name = name; public String getemail() { return email; public void setemail(string email) { this.email = email; Klasę encji należy zaadnotować adnotacją @Entity Klucz główny ustawiony zostaje poprzez adnotację @Id @GeneratedValue(strategy = GenerationType.AUTO) autogenerowany id @NotNull contraint na nienullową zawartość kolumny 7. Stworzenie repozytorium JPA public interface PersonRepo extends JpaRepository<Person, Long> { Interfejs JpaRepository generykowany jest na typ obiektu encji oraz wskazanie na typ identyfikatora Interfejs udostępnia podstawowe metody dostępowe m.in. List<T> findall(); <S extends T> List<S> save(iterable<s> entities);
Aby zastosować bardziej złożone zapytania należy zdefiniować deklaracje metod w interfejsie, który dziedziczy po JpaRepository http://docs.spring.io/spring-data/jpa/docs/1.4.3.release/reference/html/repositories.html#repositories.querymethods 8. Połączenie komponentów graficznych z zasobem bazodanowym @Theme(ValoTheme.THEME_NAME) @SpringUI public class MyUI extends UI { @Autowired PersonRepo repo; BeanItemContainer<Person> container; HorizontalLayout layout; Grid persongrid; TextField nametextfield; TextField emailtextfield; Button submit; @Override protected void init(vaadinrequest request) { layout = new HorizontalLayout(); initgrid(); initform(); setcontent(layout); private void initform() { VerticalLayout verticallayout = new VerticalLayout(); verticallayout.setsizefull(); nametextfield = new TextField(); nametextfield.setcaption("name"); emailtextfield = new TextField(); emailtextfield.setcaption("email"); submit = new Button(); submit.setcaption("add/modify"); submit.addclicklistener(clickevent -> { Person newperson = new Person(); newperson.setemail(emailtextfield.getvalue()); newperson.setname(nametextfield.getvalue()); repo.save(newperson); repo.findall()); container = new BeanItemContainer<Person>(Person.class, persongrid.setcontainerdatasource(container); ); verticallayout.addcomponents(nametextfield, emailtextfield, submit); layout.addcomponent(verticallayout);
private void initgrid() { List<Person> people = repo.findall(); container = new BeanItemContainer<Person>(Person.class, people); persongrid = new Grid(container); persongrid.setsizefull(); layout.addcomponent(persongrid); Ponieważ repozytoria jpa są singletonami i spring automatycznie tworzy instancje obiektów typu Repository, można użyć adnotacji @Autowired, dzięki której będziemy mieli dostęp do obiektu typu PersonRepo @Autowired PersonRepo repo; Wszystkie zapytania do bazy danych wykonywane są na obiekcie typu PersonRepo Obiekt BeanItemContainer jest agregatorem wyników zapytania bazodanowego i służy do zasilania danymi obiektu Grid Vaadin dostarcza wiele komponentów graficznych, które umożliwiają elastyczne układanie komponentów. W powyższym przykładzie zastosowanie dwa typu layout u, VerticalLayout oraz HorizontalLayout 9. Zadanie Na podstawie powyższego przykładu dodać edycję i usuwanie rekordów 1. Edycja rekordu poprzez dostęp do zaznaczonego wiersza komponentu Grid. a. Przykładowa obsługa zaznaczonego wiersza dodanie listener a na zmianę zaznaczenia persongrid.addselectionlistener(selection->{ Person editperson =(Person) selection.getselected().iterator().next(); // - pierwszy element zaznaczenia System.out.println(editPerson.getEmail()); ); 2. Usuwanie rekordu a. Analogicznie do edycji należy pobrać zaznaczony element a następnie wywołać metodę delete na obiekcie repozytorium (repo) podając w argumencie zaznaczony obiekt.