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

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Saving this for later?

Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime - even offline.

Text the download link to your phone

Standard text messaging rates apply

Integracja JSF + Facelets + Spring + JPA + Tomahawk

4,269
views

Published on

Published in: Technology, Business

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

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

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