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
• bardzo proste szablony,
Facelets - nie powiedziałem o:
10
• bardzo proste szablony,
• widok można rozwijać na żywo,
Facelets - nie powiedziałem o:
10
• bardzo proste szablony,
• widok można rozwijać na żywo,
• wsparcie dla JSTL,
Facelets - nie powiedziałem o:
10
• bardzo proste szablony,
• widok można rozwijać na żywo,
• wsparcie dla JSTL,
• łatwiejsze dodawanie nowych komponentów,
Facelets - nie powiedziałem o:
10
• bardzo proste szablony,
• widok można rozwijać na żywo,
• wsparcie dla JSTL,
• łatwiejsze dodawanie nowych komponentów,
• komponenty kompozycyjne.
Facelets - nie powiedziałem o:
10
Facelets - konfiguracja
11
Delegacja ViewHandlerw faces-config.xml
<view-handler> com.sun.facelets.FaceletViewHandler </view-handler>
12
<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>
Zmiany w web.xml
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 jestgdzieś w swoim kontekście.
21
#{ziarnoPrawdy}
JSF standardowo sprawdza czy jestgdzieś w swoim kontekście.
jeśli nic nie znaleziono
JSF deleguje jego znalezienie do Springa
21
#{ziarnoPrawdy}
JSF standardowo sprawdza czy jestgdzieś 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 = "Role.findAll", query = "SELECT role FROM Role role"),@NamedQuery(name = "Role.findByRoleName", query = "SELECT role FROM Role role WHERE role.roleName = :roleName") })@Entitypublic class Role {
@Id @GeneratedValue private Integer id;
private String roleName; ...}
24
Model - User@NamedQueries({@NamedQuery(name = "User.findAll", query = "SELECT user FROM User user"),@NamedQuery(name = "User.findByLogin", query = "SELECT user FROM User user WHERE user.login = :login") })@Entitypublic 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 Springpublic class JpaRoleDao extends JpaDaoSupport implements RoleDao {
public List<Role> findAll() { return getJpaTemplate().findByNamedQuery("Role.findAll"); }
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
#{userController.createSetup}create
CRUD
list
30
#{userController.createSetup}create
CRUD
list
#{userController.create}
30
#{userController.createSetup}create
#{userController.editSetup} update
CRUD
list
#{userController.create}
30
#{userController.createSetup}create
#{userController.editSetup} update
CRUD
list
#{userController.create}
#{userController.update}
30
#{userController.delete} delete
#{userController.createSetup}create
#{userController.editSetup} update
CRUD
list
#{userController.create}
#{userController.update}
30
do dzieła
31
Drobne słowo ot:selectManyCheckbox
32
Drobne słowo ot:selectManyCheckbox
• Kiedy klasa nie jest standardowa to trzeba opakowywać w SelectItem,
32
Drobne słowo ot:selectManyCheckbox
• Kiedy klasa nie jest standardowa to trzeba opakowywać w SelectItem,
• t:selectItem robi to za nas,
32
Drobne słowo ot: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
Pytania?
http://blog.mocna-kawa.com
34
Pytania?
http://blog.mocna-kawa.com
34