SlideShare uma empresa Scribd logo
1 de 86
Baixar para ler offline
Integracja JSF +
Facelets + Spring + JPA
     + Tomahawk

            Wiktor Gworek




                            1
O mnie

• Student V roku na MIMUWie
• Od dwóch lat związany z Javą
• Ciąglę się uczę nowych technologii
• Prowadzę blog Mocna Kawa (blog.mocna-
  kawa.com)



                                          2
Agenda
• JavaServer Faces,
• Facelets,
• Tomahawk,
• Spring,
• JPA,
• czy to musi być tak uciążliwe?
                                   3
JavaServer Faces




               [skip intro]
                              4
Facelets



           5
Co dajeje nam Facelets?



                          6
Facelets - odejście od JSP




                             7
Facelets - odejście od JSP

 • JSP zostało stworzone do generowania
   dynamicznej treści, a nie do tworzenia
   drzewa komponentów




                                            7
Facelets - odejście od JSP

 • JSP zostało stworzone do generowania
   dynamicznej treści, a nie do tworzenia
   drzewa komponentów

 • Dwa różne cykle życia


                                            7
Facelets - odejście od JSP

 • JSP zostało stworzone do generowania
   dynamicznej treści, a nie do tworzenia
   drzewa komponentów

 • Dwa różne cykle życia
 • Content Interweaving issues

                                            7
Facelets - odejście od JSP




                             8
Facelets - odejście od JSP

 • ViewHandler stworzony wyłącznie dla JSF




                                             8
Facelets - odejście od JSP

 • ViewHandler stworzony wyłącznie dla JSF
 • .xhtml zamiast .jsp



                                             8
Facelets - odejście od JSP

 • ViewHandler stworzony wyłącznie dla JSF
 • .xhtml zamiast .jsp
 • Szybsze niż kombinacja JSF&JSP


                                             8
Facelets - lepsze
wyświetlania błędów




                      9
Facelets - lepsze
wyświetlania błędów




                      9
Facelets - lepsze
wyświetlania błędów




                      9
Facelets - nie
powiedziałem o:




                  10
Facelets - nie
     powiedziałem o:
• bardzo proste szablony,




                            10
Facelets - nie
     powiedziałem o:
• bardzo proste szablony,
• widok można rozwijać na żywo,




                                  10
Facelets - nie
     powiedziałem o:
• bardzo proste szablony,
• widok można rozwijać na żywo,
• wsparcie dla JSTL,



                                  10
Facelets - nie
     powiedziałem o:
• bardzo proste szablony,
• widok można rozwijać na żywo,
• wsparcie dla JSTL,
• łatwiejsze dodawanie nowych
  komponentów,



                                  10
Facelets - nie
     powiedziałem o:
• bardzo proste szablony,
• widok można rozwijać na żywo,
• wsparcie dla JSTL,
• łatwiejsze dodawanie nowych
  komponentów,
• komponenty kompozycyjne.
                                  10
Facelets - konfiguracja



                         11
Delegacja ViewHandler
 w faces-config.xml

<view-handler> com.sun.facelets.FaceletViewHandler </view-handler>




                                                                     12
Zmiany w web.xml
<context-param>
   <param-name> facelets.REFRESH_PERIOD </param-name>
   <param-value> 2 </param-value>
</context-param>

<context-param>
   <param-name> facelets.DEVELOPMENT </param-name>
   <param-value> true </param-value>
</context-param>

<context-param>
   <param-name> javax.faces.DEFAULT_SUFFIX </param-name>
   <param-value> .xhtml </param-value>
</context-param>




                                                           13
Tomahawk



           14
Tomahawk




           15
Tomahawk




           15
Tomahawk

• Zbiór komponentów dla JSF ze
  stajni Apache




                             15
Tomahawk

• Zbiór komponentów dla JSF ze
  stajni Apache
• Dodatkowe walidatory


                             15
Tomahawk

• Zbiór komponentów dla JSF ze
  stajni Apache
• Dodatkowe walidatory
• Wszystko to, co powinno być
  już dawno w JSF


                                15
16
16
16
16
16
16
16
Tomahawk - konfiguracja




                         17
Tomahawk - konfiguracja


• Wystarczy dodać tomahawk.jar :)



                                    17
Spring Framework



                   18
Spring




         19
Spring
• IoC, DI, AOP, Hollywood Principle,
  JEE, MVC, JTA...




                                       19
Spring
• IoC, DI, AOP, Hollywood Principle,
  JEE, MVC, JTA...

• Nie narzuca nam określonego
  modelu programowania,




                                       19
Spring
• IoC, DI, AOP, Hollywood Principle,
  JEE, MVC, JTA...

• Nie narzuca nam określonego
  modelu programowania,
• lekki i dobrze udokumentowany,


                                       19
Spring
• IoC, DI, AOP, Hollywood Principle,
  JEE, MVC, JTA...

• Nie narzuca nam określonego
  modelu programowania,
• lekki i dobrze udokumentowany,
• łatwość testowania, rozszerzania,

                                       19
Spring
• IoC, DI, AOP, Hollywood Principle,
  JEE, MVC, JTA...

• Nie narzuca nam określonego
  modelu programowania,
• lekki i dobrze udokumentowany,
• łatwość testowania, rozszerzania,
• daje dość dużą radość.
                                       19
Na czym polega
połączenie JSF i Spring?


                           20
21
#{ziarnoPrawdy}




                  21
#{ziarnoPrawdy}


   JSF standardowo sprawdza czy jest
      gdzieś w swoim kontekście.




                                       21
#{ziarnoPrawdy}


   JSF standardowo sprawdza czy jest
      gdzieś w swoim kontekście.

                           jeśli nic nie znaleziono



                  JSF deleguje jego znalezienie do Springa




                                                             21
#{ziarnoPrawdy}


         JSF standardowo sprawdza czy jest
            gdzieś w swoim kontekście.

                                        jeśli nic nie znaleziono



                            JSF deleguje jego znalezienie do Springa




<variable-resolver> org.springframework.web.jsf.DelegatingVariableResolver </variable-resolver>




                                                                                              21
...i jeszcze drobne
               zmiany w web.xml
<listener>
    <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class>
</listener>

<context-param>
   <param-name> contextConfigLocation </param-name>
   <param-value> /WEB-INF/applicationContext*.xml </param-value>
</context-param>

<filter>
   <filter-name> RequestContextFilter </filter-name>
   <filter-class> org.springframework.web.filter.RequestContextFilter </filter-class>
</filter>

<filter-mapping>
   <filter-name> RequestContextFilter </filter-name>
   <url-pattern> *.jsf </url-pattern>
</filter-mapping>


                                                                                               22
czas na JPA



              23
czas na konkrety



                   23
Model - Role
@NamedQueries({
@NamedQuery(name = quot;Role.findAllquot;, query = quot;SELECT role FROM Role rolequot;),
@NamedQuery(name = quot;Role.findByRoleNamequot;, query = quot;SELECT role FROM Role
role WHERE role.roleName = :roleNamequot;)
      })
@Entity
public class Role {

    @Id
    @GeneratedValue
    private Integer id;

    private String roleName;
    ...
}



                                                                           24
Model - User
@NamedQueries({
@NamedQuery(name = quot;User.findAllquot;, query = quot;SELECT user FROM User userquot;),
@NamedQuery(name = quot;User.findByLoginquot;, query = quot;SELECT user FROM User user WHERE user.login
= :loginquot;)
      })
@Entity
public class User {

    @Id
    @GeneratedValue
    private Integer id;

    private String login;
    private String password;

    @OneToMany(cascade = {CascadeType.MERGE, CascadeType.PERSIST}, fetch = FetchType.EAGER)
    private List<Role> roles;
    ...
}

                                                                                              25
DAO
public interface RoleDao {
  public List<Role> findAll();
  public Role findById(Integer id);
  public Role findByRoleName(String roleName);
  public void save(Role role);
  public void delete(Role role);
}



                                                26
DAO à la Spring
public class JpaRoleDao extends JpaDaoSupport implements RoleDao {

    public List<Role> findAll() {
      return getJpaTemplate().findByNamedQuery(quot;Role.findAllquot;);
    }

    public Role findById(Integer id) {
      return getJpaTemplate().find(Role.class, id);
    }

    public void save(Role role) {
      getJpaTemplate().merge(role);
    }

    public void delete(Role role) {
      getJpaTemplate().remove(getJpaTemplate().merge(role));
    }
}
                                                                     27
czas na konfirgurację,
   czas na Springa


                        28
Testowanie w Springu




                       29
Testowanie w Springu

• Możliwe różne konfiguracje w zależności
  od potrzeb,




                                           29
Testowanie w Springu

• Możliwe różne konfiguracje w zależności
  od potrzeb,

• testy też podlegają wstrzyknięciu
  zależności,




                                           29
Testowanie w Springu

• Możliwe różne konfiguracje w zależności
  od potrzeb,

• testy też podlegają wstrzyknięciu
  zależności,

• dla JPA mamy użyteczną klasę
  AbstractJpaTests.



                                           29
CRUD




       30
CRUD



list




              30
CRUD
       #{userController.createSetup}
                                       create


list




                                                30
CRUD
                                                #{userController.create}
       #{userController.createSetup}
                                       create


list




                                                                           30
CRUD
                                                   #{userController.create}
       #{userController.createSetup}
                                          create


            #{userController.editSetup}
list                                      update




                                                                              30
CRUD
                                                   #{userController.create}
       #{userController.createSetup}
                                          create

                                                   #{userController.update}
            #{userController.editSetup}
list                                      update




                                                                              30
CRUD
                                                   #{userController.create}
       #{userController.createSetup}
                                          create

                                                   #{userController.update}
            #{userController.editSetup}
list                                      update


                                          delete
          #{userController.delete}




                                                                              30
do dzieła



            31
Drobne słowo o
t:selectManyCheckbox




                       32
Drobne słowo o
t:selectManyCheckbox
• Kiedy klasa nie jest standardowa to trzeba
  opakowywać w SelectItem,




                                               32
Drobne słowo o
t:selectManyCheckbox
• Kiedy klasa nie jest standardowa to trzeba
  opakowywać w SelectItem,
• t:selectItem robi to za nas,



                                               32
Drobne słowo o
t:selectManyCheckbox
• Kiedy klasa nie jest standardowa to trzeba
  opakowywać w SelectItem,
• t:selectItem robi to za nas,
• ale i tak trzeba napisać konwerter.

                                               32
Jak można sobie
    pomóc?




                  33
Jak można sobie
         pomóc?
• Wiele IDE ma wsparcie do konfigurowania
  projektu (NetBeans, IntelliJ Idea),




                                           33
Jak można sobie
         pomóc?
• Wiele IDE ma wsparcie do konfigurowania
  projektu (NetBeans, IntelliJ Idea),
• AppFuse,




                                           33
Jak można sobie
         pomóc?
• Wiele IDE ma wsparcie do konfigurowania
  projektu (NetBeans, IntelliJ Idea),
• AppFuse,
• generatory Seam,



                                           33
Jak można sobie
         pomóc?
• Wiele IDE ma wsparcie do konfigurowania
  projektu (NetBeans, IntelliJ Idea),
• AppFuse,
• generatory Seam,
• pisać własne generatory,


                                           33
Jak można sobie
         pomóc?
• Wiele IDE ma wsparcie do konfigurowania
  projektu (NetBeans, IntelliJ Idea),
• AppFuse,
• generatory Seam,
• pisać własne generatory,
• “Great frameworks are extracted, not
  created”.


                                           33
Pyt ani a?

wiktor.gworek@gmail.com

http://blog.mocna-kawa.com


                             34
Pyt ani a?

wiktor.gworek@gmail.com

http://blog.mocna-kawa.com


                             34

Mais conteúdo relacionado

Semelhante a Integracja JSF + Facelets + Spring + JPA + Tomahawk

Patronage 2016 Windows 10 Warsztaty
Patronage 2016 Windows 10 WarsztatyPatronage 2016 Windows 10 Warsztaty
Patronage 2016 Windows 10 Warsztatyintive
 
Using Red Gate SQL Doc for database documentation
Using Red Gate SQL Doc for database documentationUsing Red Gate SQL Doc for database documentation
Using Red Gate SQL Doc for database documentationMariusz Koprowski
 
J2EE. Vademecum profesjonalisty. Wydanie II
J2EE. Vademecum profesjonalisty. Wydanie IIJ2EE. Vademecum profesjonalisty. Wydanie II
J2EE. Vademecum profesjonalisty. Wydanie IIWydawnictwo Helion
 
WordUp Trójmiasto - Sage 9 w praktyce
WordUp Trójmiasto - Sage 9 w praktyceWordUp Trójmiasto - Sage 9 w praktyce
WordUp Trójmiasto - Sage 9 w praktyceDawid Urbański
 
Tworzenie, zaciemnianie i analiza złośliwego kodu JavaScript
Tworzenie, zaciemnianie i analiza złośliwego kodu JavaScriptTworzenie, zaciemnianie i analiza złośliwego kodu JavaScript
Tworzenie, zaciemnianie i analiza złośliwego kodu JavaScriptKrzysztof Kotowicz
 
Nowości w Javie 8 okiem programisty
Nowości w Javie 8 okiem programistyNowości w Javie 8 okiem programisty
Nowości w Javie 8 okiem programistyMarcinStachniuk
 
WJUG #257 Just-In-Time compiler - ukryty "przyjaciel" - Krzysztof Ślusarski
WJUG #257 Just-In-Time compiler - ukryty "przyjaciel" - Krzysztof ŚlusarskiWJUG #257 Just-In-Time compiler - ukryty "przyjaciel" - Krzysztof Ślusarski
WJUG #257 Just-In-Time compiler - ukryty "przyjaciel" - Krzysztof ŚlusarskiKrzysztof Ślusarski
 
Spring Framework. Profesjonalne tworzenie oprogramowania w Javie
Spring Framework. Profesjonalne tworzenie oprogramowania w JavieSpring Framework. Profesjonalne tworzenie oprogramowania w Javie
Spring Framework. Profesjonalne tworzenie oprogramowania w JavieWydawnictwo Helion
 
Podstawy Asp.Net Mvc 1.0 W 3600 Sekund
Podstawy Asp.Net Mvc 1.0 W 3600 SekundPodstawy Asp.Net Mvc 1.0 W 3600 Sekund
Podstawy Asp.Net Mvc 1.0 W 3600 Sekundemdzej
 
Java. Obsługa wyjątków, usuwanie błędów i testowanie kodu
Java. Obsługa wyjątków, usuwanie błędów i testowanie koduJava. Obsługa wyjątków, usuwanie błędów i testowanie kodu
Java. Obsługa wyjątków, usuwanie błędów i testowanie koduWydawnictwo Helion
 
How to be Awesome at a Java Developer Job Interview (Confitura 2012, Polish)
How to be Awesome at a Java Developer Job Interview (Confitura 2012, Polish)How to be Awesome at a Java Developer Job Interview (Confitura 2012, Polish)
How to be Awesome at a Java Developer Job Interview (Confitura 2012, Polish)Wojciech Seliga
 
Mvc frontend-trug-02-2011
Mvc frontend-trug-02-2011Mvc frontend-trug-02-2011
Mvc frontend-trug-02-2011Rafal Piekarski
 
Konrad Kokosa - Pamięć w .NET - od ogólu do szczegółu- 4developers2016
Konrad Kokosa - Pamięć w .NET - od ogólu do szczegółu- 4developers2016Konrad Kokosa - Pamięć w .NET - od ogólu do szczegółu- 4developers2016
Konrad Kokosa - Pamięć w .NET - od ogólu do szczegółu- 4developers2016PROIDEA
 
PHPUnit - jak zacząć pisać testy automatyczne [PL]
PHPUnit - jak zacząć pisać testy automatyczne [PL]PHPUnit - jak zacząć pisać testy automatyczne [PL]
PHPUnit - jak zacząć pisać testy automatyczne [PL]Droptica
 
[WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro
[WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro[WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro
[WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegroallegro.tech
 

Semelhante a Integracja JSF + Facelets + Spring + JPA + Tomahawk (20)

Iron Python I Dlr
Iron Python I DlrIron Python I Dlr
Iron Python I Dlr
 
Patronage 2016 Windows 10 Warsztaty
Patronage 2016 Windows 10 WarsztatyPatronage 2016 Windows 10 Warsztaty
Patronage 2016 Windows 10 Warsztaty
 
Wszystko o Laravel Livewire
Wszystko o Laravel Livewire Wszystko o Laravel Livewire
Wszystko o Laravel Livewire
 
Using Red Gate SQL Doc for database documentation
Using Red Gate SQL Doc for database documentationUsing Red Gate SQL Doc for database documentation
Using Red Gate SQL Doc for database documentation
 
J2EE. Vademecum profesjonalisty. Wydanie II
J2EE. Vademecum profesjonalisty. Wydanie IIJ2EE. Vademecum profesjonalisty. Wydanie II
J2EE. Vademecum profesjonalisty. Wydanie II
 
WordUp Trójmiasto - Sage 9 w praktyce
WordUp Trójmiasto - Sage 9 w praktyceWordUp Trójmiasto - Sage 9 w praktyce
WordUp Trójmiasto - Sage 9 w praktyce
 
Tworzenie, zaciemnianie i analiza złośliwego kodu JavaScript
Tworzenie, zaciemnianie i analiza złośliwego kodu JavaScriptTworzenie, zaciemnianie i analiza złośliwego kodu JavaScript
Tworzenie, zaciemnianie i analiza złośliwego kodu JavaScript
 
Nowości w Javie 8 okiem programisty
Nowości w Javie 8 okiem programistyNowości w Javie 8 okiem programisty
Nowości w Javie 8 okiem programisty
 
WJUG #257 Just-In-Time compiler - ukryty "przyjaciel" - Krzysztof Ślusarski
WJUG #257 Just-In-Time compiler - ukryty "przyjaciel" - Krzysztof ŚlusarskiWJUG #257 Just-In-Time compiler - ukryty "przyjaciel" - Krzysztof Ślusarski
WJUG #257 Just-In-Time compiler - ukryty "przyjaciel" - Krzysztof Ślusarski
 
Spring Framework. Profesjonalne tworzenie oprogramowania w Javie
Spring Framework. Profesjonalne tworzenie oprogramowania w JavieSpring Framework. Profesjonalne tworzenie oprogramowania w Javie
Spring Framework. Profesjonalne tworzenie oprogramowania w Javie
 
Podstawy Asp.Net Mvc 1.0 W 3600 Sekund
Podstawy Asp.Net Mvc 1.0 W 3600 SekundPodstawy Asp.Net Mvc 1.0 W 3600 Sekund
Podstawy Asp.Net Mvc 1.0 W 3600 Sekund
 
Java. Obsługa wyjątków, usuwanie błędów i testowanie kodu
Java. Obsługa wyjątków, usuwanie błędów i testowanie koduJava. Obsługa wyjątków, usuwanie błędów i testowanie kodu
Java. Obsługa wyjątków, usuwanie błędów i testowanie kodu
 
How to be Awesome at a Java Developer Job Interview (Confitura 2012, Polish)
How to be Awesome at a Java Developer Job Interview (Confitura 2012, Polish)How to be Awesome at a Java Developer Job Interview (Confitura 2012, Polish)
How to be Awesome at a Java Developer Job Interview (Confitura 2012, Polish)
 
university day 1
university day 1university day 1
university day 1
 
Mvc frontend-trug-02-2011
Mvc frontend-trug-02-2011Mvc frontend-trug-02-2011
Mvc frontend-trug-02-2011
 
Prezentacja o X11
Prezentacja o X11Prezentacja o X11
Prezentacja o X11
 
Konrad Kokosa - Pamięć w .NET - od ogólu do szczegółu- 4developers2016
Konrad Kokosa - Pamięć w .NET - od ogólu do szczegółu- 4developers2016Konrad Kokosa - Pamięć w .NET - od ogólu do szczegółu- 4developers2016
Konrad Kokosa - Pamięć w .NET - od ogólu do szczegółu- 4developers2016
 
PHPUnit - jak zacząć pisać testy automatyczne [PL]
PHPUnit - jak zacząć pisać testy automatyczne [PL]PHPUnit - jak zacząć pisać testy automatyczne [PL]
PHPUnit - jak zacząć pisać testy automatyczne [PL]
 
Elm jako inspiracja
Elm jako inspiracjaElm jako inspiracja
Elm jako inspiracja
 
[WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro
[WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro[WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro
[WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro
 

Integracja JSF + Facelets + Spring + JPA + Tomahawk

  • 1. Integracja JSF + Facelets + Spring + JPA + Tomahawk Wiktor Gworek 1
  • 2. O mnie • Student V roku na MIMUWie • Od dwóch lat związany z Javą • Ciąglę się uczę nowych technologii • Prowadzę blog Mocna Kawa (blog.mocna- kawa.com) 2
  • 3. Agenda • JavaServer Faces, • Facelets, • Tomahawk, • Spring, • JPA, • czy to musi być tak uciążliwe? 3
  • 4. JavaServer Faces [skip intro] 4
  • 6. Co dajeje nam Facelets? 6
  • 8. Facelets - odejście od JSP • JSP zostało stworzone do generowania dynamicznej treści, a nie do tworzenia drzewa komponentów 7
  • 9. Facelets - odejście od JSP • JSP zostało stworzone do generowania dynamicznej treści, a nie do tworzenia drzewa komponentów • Dwa różne cykle życia 7
  • 10. Facelets - odejście od JSP • JSP zostało stworzone do generowania dynamicznej treści, a nie do tworzenia drzewa komponentów • Dwa różne cykle życia • Content Interweaving issues 7
  • 12. Facelets - odejście od JSP • ViewHandler stworzony wyłącznie dla JSF 8
  • 13. Facelets - odejście od JSP • ViewHandler stworzony wyłącznie dla JSF • .xhtml zamiast .jsp 8
  • 14. Facelets - odejście od JSP • ViewHandler stworzony wyłącznie dla JSF • .xhtml zamiast .jsp • Szybsze niż kombinacja JSF&JSP 8
  • 19. Facelets - nie powiedziałem o: • bardzo proste szablony, 10
  • 20. Facelets - nie powiedziałem o: • bardzo proste szablony, • widok można rozwijać na żywo, 10
  • 21. Facelets - nie powiedziałem o: • bardzo proste szablony, • widok można rozwijać na żywo, • wsparcie dla JSTL, 10
  • 22. Facelets - nie powiedziałem o: • bardzo proste szablony, • widok można rozwijać na żywo, • wsparcie dla JSTL, • łatwiejsze dodawanie nowych komponentów, 10
  • 23. Facelets - nie powiedziałem o: • bardzo proste szablony, • widok można rozwijać na żywo, • wsparcie dla JSTL, • łatwiejsze dodawanie nowych komponentów, • komponenty kompozycyjne. 10
  • 25. Delegacja ViewHandler w faces-config.xml <view-handler> com.sun.facelets.FaceletViewHandler </view-handler> 12
  • 26. Zmiany w web.xml <context-param> <param-name> facelets.REFRESH_PERIOD </param-name> <param-value> 2 </param-value> </context-param> <context-param> <param-name> facelets.DEVELOPMENT </param-name> <param-value> true </param-value> </context-param> <context-param> <param-name> javax.faces.DEFAULT_SUFFIX </param-name> <param-value> .xhtml </param-value> </context-param> 13
  • 27. Tomahawk 14
  • 28. Tomahawk 15
  • 29. Tomahawk 15
  • 30. Tomahawk • Zbiór komponentów dla JSF ze stajni Apache 15
  • 31. Tomahawk • Zbiór komponentów dla JSF ze stajni Apache • Dodatkowe walidatory 15
  • 32. Tomahawk • Zbiór komponentów dla JSF ze stajni Apache • Dodatkowe walidatory • Wszystko to, co powinno być już dawno w JSF 15
  • 33. 16
  • 34. 16
  • 35. 16
  • 36. 16
  • 37. 16
  • 38. 16
  • 39. 16
  • 41. Tomahawk - konfiguracja • Wystarczy dodać tomahawk.jar :) 17
  • 43. Spring 19
  • 44. Spring • IoC, DI, AOP, Hollywood Principle, JEE, MVC, JTA... 19
  • 45. Spring • IoC, DI, AOP, Hollywood Principle, JEE, MVC, JTA... • Nie narzuca nam określonego modelu programowania, 19
  • 46. Spring • IoC, DI, AOP, Hollywood Principle, JEE, MVC, JTA... • Nie narzuca nam określonego modelu programowania, • lekki i dobrze udokumentowany, 19
  • 47. Spring • IoC, DI, AOP, Hollywood Principle, JEE, MVC, JTA... • Nie narzuca nam określonego modelu programowania, • lekki i dobrze udokumentowany, • łatwość testowania, rozszerzania, 19
  • 48. Spring • IoC, DI, AOP, Hollywood Principle, JEE, MVC, JTA... • Nie narzuca nam określonego modelu programowania, • lekki i dobrze udokumentowany, • łatwość testowania, rozszerzania, • daje dość dużą radość. 19
  • 49. Na czym polega połączenie JSF i Spring? 20
  • 50. 21
  • 52. #{ziarnoPrawdy} JSF standardowo sprawdza czy jest gdzieś w swoim kontekście. 21
  • 53. #{ziarnoPrawdy} JSF standardowo sprawdza czy jest gdzieś w swoim kontekście. jeśli nic nie znaleziono JSF deleguje jego znalezienie do Springa 21
  • 54. #{ziarnoPrawdy} JSF standardowo sprawdza czy jest gdzieś w swoim kontekście. jeśli nic nie znaleziono JSF deleguje jego znalezienie do Springa <variable-resolver> org.springframework.web.jsf.DelegatingVariableResolver </variable-resolver> 21
  • 55. ...i jeszcze drobne zmiany w web.xml <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener> <context-param> <param-name> contextConfigLocation </param-name> <param-value> /WEB-INF/applicationContext*.xml </param-value> </context-param> <filter> <filter-name> RequestContextFilter </filter-name> <filter-class> org.springframework.web.filter.RequestContextFilter </filter-class> </filter> <filter-mapping> <filter-name> RequestContextFilter </filter-name> <url-pattern> *.jsf </url-pattern> </filter-mapping> 22
  • 58. Model - Role @NamedQueries({ @NamedQuery(name = quot;Role.findAllquot;, query = quot;SELECT role FROM Role rolequot;), @NamedQuery(name = quot;Role.findByRoleNamequot;, query = quot;SELECT role FROM Role role WHERE role.roleName = :roleNamequot;) }) @Entity public class Role { @Id @GeneratedValue private Integer id; private String roleName; ... } 24
  • 59. Model - User @NamedQueries({ @NamedQuery(name = quot;User.findAllquot;, query = quot;SELECT user FROM User userquot;), @NamedQuery(name = quot;User.findByLoginquot;, query = quot;SELECT user FROM User user WHERE user.login = :loginquot;) }) @Entity public class User { @Id @GeneratedValue private Integer id; private String login; private String password; @OneToMany(cascade = {CascadeType.MERGE, CascadeType.PERSIST}, fetch = FetchType.EAGER) private List<Role> roles; ... } 25
  • 60. DAO public interface RoleDao { public List<Role> findAll(); public Role findById(Integer id); public Role findByRoleName(String roleName); public void save(Role role); public void delete(Role role); } 26
  • 61. DAO à la Spring public class JpaRoleDao extends JpaDaoSupport implements RoleDao { public List<Role> findAll() { return getJpaTemplate().findByNamedQuery(quot;Role.findAllquot;); } public Role findById(Integer id) { return getJpaTemplate().find(Role.class, id); } public void save(Role role) { getJpaTemplate().merge(role); } public void delete(Role role) { getJpaTemplate().remove(getJpaTemplate().merge(role)); } } 27
  • 62. czas na konfirgurację, czas na Springa 28
  • 64. Testowanie w Springu • Możliwe różne konfiguracje w zależności od potrzeb, 29
  • 65. Testowanie w Springu • Możliwe różne konfiguracje w zależności od potrzeb, • testy też podlegają wstrzyknięciu zależności, 29
  • 66. Testowanie w Springu • Możliwe różne konfiguracje w zależności od potrzeb, • testy też podlegają wstrzyknięciu zależności, • dla JPA mamy użyteczną klasę AbstractJpaTests. 29
  • 67. CRUD 30
  • 69. CRUD #{userController.createSetup} create list 30
  • 70. CRUD #{userController.create} #{userController.createSetup} create list 30
  • 71. CRUD #{userController.create} #{userController.createSetup} create #{userController.editSetup} list update 30
  • 72. CRUD #{userController.create} #{userController.createSetup} create #{userController.update} #{userController.editSetup} list update 30
  • 73. CRUD #{userController.create} #{userController.createSetup} create #{userController.update} #{userController.editSetup} list update delete #{userController.delete} 30
  • 76. Drobne słowo o t:selectManyCheckbox • Kiedy klasa nie jest standardowa to trzeba opakowywać w SelectItem, 32
  • 77. Drobne słowo o t:selectManyCheckbox • Kiedy klasa nie jest standardowa to trzeba opakowywać w SelectItem, • t:selectItem robi to za nas, 32
  • 78. Drobne słowo o t:selectManyCheckbox • Kiedy klasa nie jest standardowa to trzeba opakowywać w SelectItem, • t:selectItem robi to za nas, • ale i tak trzeba napisać konwerter. 32
  • 79. Jak można sobie pomóc? 33
  • 80. Jak można sobie pomóc? • Wiele IDE ma wsparcie do konfigurowania projektu (NetBeans, IntelliJ Idea), 33
  • 81. Jak można sobie pomóc? • Wiele IDE ma wsparcie do konfigurowania projektu (NetBeans, IntelliJ Idea), • AppFuse, 33
  • 82. Jak można sobie pomóc? • Wiele IDE ma wsparcie do konfigurowania projektu (NetBeans, IntelliJ Idea), • AppFuse, • generatory Seam, 33
  • 83. Jak można sobie pomóc? • Wiele IDE ma wsparcie do konfigurowania projektu (NetBeans, IntelliJ Idea), • AppFuse, • generatory Seam, • pisać własne generatory, 33
  • 84. Jak można sobie pomóc? • Wiele IDE ma wsparcie do konfigurowania projektu (NetBeans, IntelliJ Idea), • AppFuse, • generatory Seam, • pisać własne generatory, • “Great frameworks are extracted, not created”. 33