• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
Integracja JSF + Facelets + Spring + JPA + Tomahawk
 

Integracja JSF + Facelets + Spring + JPA + Tomahawk

on

  • 8,255 views

 

Statistics

Views

Total Views
8,255
Views on SlideShare
7,865
Embed Views
390

Actions

Likes
1
Downloads
249
Comments
0

4 Embeds 390

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

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

CC Attribution-ShareAlike LicenseCC Attribution-ShareAlike License

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Integracja JSF + Facelets + Spring + JPA + Tomahawk Integracja JSF + Facelets + Spring + JPA + Tomahawk Presentation Transcript

    • 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