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 Mo...
Agenda
• JavaServer Faces,
• Facelets,
• Tomahawk,
• Spring,
• JPA,
• czy to musi być tak uciążliwe?
                     ...
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 ko...
Facelets - odejście od JSP

 • JSP zostało stworzone do generowania
   dynamicznej treści, a nie do tworzenia
   drzewa ko...
Facelets - odejście od JSP

 • JSP zostało stworzone do generowania
   dynamicznej treści, a nie do tworzenia
   drzewa ko...
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



                         ...
Facelets - odejście od JSP

 • ViewHandler stworzony wyłącznie dla JSF
 • .xhtml zamiast .jsp
 • Szybsze niż kombinacja JS...
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,




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



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



                         11
Delegacja ViewHandler
 w faces-config.xml

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




         ...
Zmiany w web.xml
<context-param>
   <param-name> facelets.REFRESH_PERIOD </param-name>
   <param-value> 2 </param-value>
<...
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 ...
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,




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

• Nie narzuca nam określonego
  modelu programowania,
• le...
Spring
• IoC, DI, AOP, Hollywood Principle,
  JEE, MVC, JTA...

• Nie narzuca nam określonego
  modelu programowania,
• le...
Spring
• IoC, DI, AOP, Hollywood Principle,
  JEE, MVC, JTA...

• Nie narzuca nam określonego
  modelu programowania,
• le...
Na czym polega
połączenie JSF i Spring?


                           20
21
#{ziarnoPrawdy}




                  21
#{ziarnoPrawdy}


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




                              ...
#{ziarnoPrawdy}


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

                           jeśli ...
#{ziarnoPrawdy}


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

                     ...
...i jeszcze drobne
               zmiany w web.xml
<listener>
    <listener-class> org.springframework.web.context.Contex...
czas na JPA



              23
czas na konkrety



                   23
Model - Role
@NamedQueries({
@NamedQuery(name = quot;Role.findAllquot;, query = quot;SELECT role FROM Role rolequot;),
@Nam...
Model - User
@NamedQueries({
@NamedQuery(name = quot;User.findAllquot;, query = quot;SELECT user FROM User userquot;),
@Nam...
DAO
public interface RoleDao {
  public List<Role> findAll();
  public Role findById(Integer id);
  public Role findByRoleNam...
DAO à la Spring
public class JpaRoleDao extends JpaDaoSupport implements RoleDao {

    public List<Role> findAll() {
     ...
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,




                                         ...
Testowanie w Springu

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

• testy też podlegają wstrzyknięciu
  zależn...
Testowanie w Springu

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

• testy też podlegają wstrzyknięciu
  zależn...
CRUD




       30
CRUD



list




              30
CRUD
       #{userController.createSetup}
                                       create


list




                       ...
CRUD
                                                #{userController.create}
       #{userController.createSetup}
       ...
CRUD
                                                   #{userController.create}
       #{userController.createSetup}
    ...
CRUD
                                                   #{userController.create}
       #{userController.createSetup}
    ...
CRUD
                                                   #{userController.create}
       #{userController.createSetup}
    ...
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,




          ...
Drobne słowo o
t:selectManyCheckbox
• Kiedy klasa nie jest standardowa to trzeba
  opakowywać w SelectItem,
• t:selectItem...
Drobne słowo o
t:selectManyCheckbox
• Kiedy klasa nie jest standardowa to trzeba
  opakowywać w SelectItem,
• t:selectItem...
Jak można sobie
    pomóc?




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




       ...
Jak można sobie
         pomóc?
• Wiele IDE ma wsparcie do konfigurowania
  projektu (NetBeans, IntelliJ Idea),
• AppFuse,
...
Jak można sobie
         pomóc?
• Wiele IDE ma wsparcie do konfigurowania
  projektu (NetBeans, IntelliJ Idea),
• AppFuse,
...
Jak można sobie
         pomóc?
• Wiele IDE ma wsparcie do konfigurowania
  projektu (NetBeans, IntelliJ Idea),
• AppFuse,
...
Jak można sobie
         pomóc?
• Wiele IDE ma wsparcie do konfigurowania
  projektu (NetBeans, IntelliJ Idea),
• AppFuse,
...
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
Upcoming SlideShare
Loading in...5
×

Integracja JSF + Facelets + Spring + JPA + Tomahawk

4,326

Published on

Published in: Technology, Business
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
4,326
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
253
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Integracja JSF + Facelets + Spring + JPA + Tomahawk

  1. 1. Integracja JSF + Facelets + Spring + JPA + Tomahawk Wiktor Gworek 1
  2. 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. 3. Agenda • JavaServer Faces, • Facelets, • Tomahawk, • Spring, • JPA, • czy to musi być tak uciążliwe? 3
  4. 4. JavaServer Faces [skip intro] 4
  5. 5. Facelets 5
  6. 6. Co dajeje nam Facelets? 6
  7. 7. Facelets - odejście od JSP 7
  8. 8. Facelets - odejście od JSP • JSP zostało stworzone do generowania dynamicznej treści, a nie do tworzenia drzewa komponentów 7
  9. 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. 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
  11. 11. Facelets - odejście od JSP 8
  12. 12. Facelets - odejście od JSP • ViewHandler stworzony wyłącznie dla JSF 8
  13. 13. Facelets - odejście od JSP • ViewHandler stworzony wyłącznie dla JSF • .xhtml zamiast .jsp 8
  14. 14. Facelets - odejście od JSP • ViewHandler stworzony wyłącznie dla JSF • .xhtml zamiast .jsp • Szybsze niż kombinacja JSF&JSP 8
  15. 15. Facelets - lepsze wyświetlania błędów 9
  16. 16. Facelets - lepsze wyświetlania błędów 9
  17. 17. Facelets - lepsze wyświetlania błędów 9
  18. 18. Facelets - nie powiedziałem o: 10
  19. 19. Facelets - nie powiedziałem o: • bardzo proste szablony, 10
  20. 20. Facelets - nie powiedziałem o: • bardzo proste szablony, • widok można rozwijać na żywo, 10
  21. 21. Facelets - nie powiedziałem o: • bardzo proste szablony, • widok można rozwijać na żywo, • wsparcie dla JSTL, 10
  22. 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. 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
  24. 24. Facelets - konfiguracja 11
  25. 25. Delegacja ViewHandler w faces-config.xml <view-handler> com.sun.facelets.FaceletViewHandler </view-handler> 12
  26. 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. 27. Tomahawk 14
  28. 28. Tomahawk 15
  29. 29. Tomahawk 15
  30. 30. Tomahawk • Zbiór komponentów dla JSF ze stajni Apache 15
  31. 31. Tomahawk • Zbiór komponentów dla JSF ze stajni Apache • Dodatkowe walidatory 15
  32. 32. Tomahawk • Zbiór komponentów dla JSF ze stajni Apache • Dodatkowe walidatory • Wszystko to, co powinno być już dawno w JSF 15
  33. 33. 16
  34. 34. 16
  35. 35. 16
  36. 36. 16
  37. 37. 16
  38. 38. 16
  39. 39. 16
  40. 40. Tomahawk - konfiguracja 17
  41. 41. Tomahawk - konfiguracja • Wystarczy dodać tomahawk.jar :) 17
  42. 42. Spring Framework 18
  43. 43. Spring 19
  44. 44. Spring • IoC, DI, AOP, Hollywood Principle, JEE, MVC, JTA... 19
  45. 45. Spring • IoC, DI, AOP, Hollywood Principle, JEE, MVC, JTA... • Nie narzuca nam określonego modelu programowania, 19
  46. 46. Spring • IoC, DI, AOP, Hollywood Principle, JEE, MVC, JTA... • Nie narzuca nam określonego modelu programowania, • lekki i dobrze udokumentowany, 19
  47. 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. 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. 49. Na czym polega połączenie JSF i Spring? 20
  50. 50. 21
  51. 51. #{ziarnoPrawdy} 21
  52. 52. #{ziarnoPrawdy} JSF standardowo sprawdza czy jest gdzieś w swoim kontekście. 21
  53. 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. 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. 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
  56. 56. czas na JPA 23
  57. 57. czas na konkrety 23
  58. 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. 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. 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. 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. 62. czas na konfirgurację, czas na Springa 28
  63. 63. Testowanie w Springu 29
  64. 64. Testowanie w Springu • Możliwe różne konfiguracje w zależności od potrzeb, 29
  65. 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. 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. 67. CRUD 30
  68. 68. CRUD list 30
  69. 69. CRUD #{userController.createSetup} create list 30
  70. 70. CRUD #{userController.create} #{userController.createSetup} create list 30
  71. 71. CRUD #{userController.create} #{userController.createSetup} create #{userController.editSetup} list update 30
  72. 72. CRUD #{userController.create} #{userController.createSetup} create #{userController.update} #{userController.editSetup} list update 30
  73. 73. CRUD #{userController.create} #{userController.createSetup} create #{userController.update} #{userController.editSetup} list update delete #{userController.delete} 30
  74. 74. do dzieła 31
  75. 75. Drobne słowo o t:selectManyCheckbox 32
  76. 76. Drobne słowo o t:selectManyCheckbox • Kiedy klasa nie jest standardowa to trzeba opakowywać w SelectItem, 32
  77. 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. 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. 79. Jak można sobie pomóc? 33
  80. 80. Jak można sobie pomóc? • Wiele IDE ma wsparcie do konfigurowania projektu (NetBeans, IntelliJ Idea), 33
  81. 81. Jak można sobie pomóc? • Wiele IDE ma wsparcie do konfigurowania projektu (NetBeans, IntelliJ Idea), • AppFuse, 33
  82. 82. Jak można sobie pomóc? • Wiele IDE ma wsparcie do konfigurowania projektu (NetBeans, IntelliJ Idea), • AppFuse, • generatory Seam, 33
  83. 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. 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
  85. 85. Pyt ani a? wiktor.gworek@gmail.com http://blog.mocna-kawa.com 34
  86. 86. Pyt ani a? wiktor.gworek@gmail.com http://blog.mocna-kawa.com 34
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×