Integracja JSF + Facelets + Spring + JPA + Tomahawk
Upcoming SlideShare
Loading in...5
×

Like this? Share it with your network

Share
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
8,503
On Slideshare
8,113
From Embeds
390
Number of Embeds
4

Actions

Shares
Downloads
251
Comments
0
Likes
1

Embeds 390

http://blog.mocna-kawa.com 358
http://www.slideshare.net 28
http://feeds.feedburner.com 3
http://209.85.129.104 1

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 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
  • 5. Facelets 5
  • 6. Co dajeje nam Facelets? 6
  • 7. Facelets - odejście od JSP 7
  • 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
  • 11. Facelets - odejście od JSP 8
  • 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
  • 15. Facelets - lepsze wyświetlania błędów 9
  • 16. Facelets - lepsze wyświetlania błędów 9
  • 17. Facelets - lepsze wyświetlania błędów 9
  • 18. Facelets - nie powiedziałem o: 10
  • 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
  • 24. Facelets - konfiguracja 11
  • 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
  • 40. Tomahawk - konfiguracja 17
  • 41. Tomahawk - konfiguracja • Wystarczy dodać tomahawk.jar :) 17
  • 42. Spring Framework 18
  • 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
  • 51. #{ziarnoPrawdy} 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
  • 56. czas na JPA 23
  • 57. czas na konkrety 23
  • 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
  • 63. Testowanie w Springu 29
  • 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
  • 68. CRUD list 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
  • 74. do dzieła 31
  • 75. Drobne słowo o t:selectManyCheckbox 32
  • 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
  • 85. Pyt ani a? wiktor.gworek@gmail.com http://blog.mocna-kawa.com 34
  • 86. Pyt ani a? wiktor.gworek@gmail.com http://blog.mocna-kawa.com 34