Transcript
Page 1: Integracja JSF + Facelets + Spring + JPA + Tomahawk

Integracja JSF + Facelets + Spring + JPA

+ Tomahawk

Wiktor Gworek

1

Page 2: Integracja JSF + Facelets + Spring + JPA + Tomahawk

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

Page 3: Integracja JSF + Facelets + Spring + JPA + Tomahawk

Agenda

• JavaServer Faces,

• Facelets,

• Tomahawk,

• Spring,

• JPA,

• czy to musi być tak uciążliwe?

3

Page 4: Integracja JSF + Facelets + Spring + JPA + Tomahawk

JavaServer Faces

[skip intro]

4

Page 5: Integracja JSF + Facelets + Spring + JPA + Tomahawk

Facelets

5

Page 6: Integracja JSF + Facelets + Spring + JPA + Tomahawk

Co dajeje nam Facelets?

6

Page 7: Integracja JSF + Facelets + Spring + JPA + Tomahawk

Facelets - odejście od JSP

7

Page 8: Integracja JSF + Facelets + Spring + JPA + Tomahawk

Facelets - odejście od JSP

• JSP zostało stworzone do generowania dynamicznej treści, a nie do tworzenia drzewa komponentów

7

Page 9: Integracja JSF + Facelets + Spring + JPA + Tomahawk

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

Page 10: Integracja JSF + Facelets + Spring + JPA + Tomahawk

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

Page 11: Integracja JSF + Facelets + Spring + JPA + Tomahawk

Facelets - odejście od JSP

8

Page 12: Integracja JSF + Facelets + Spring + JPA + Tomahawk

Facelets - odejście od JSP

• ViewHandler stworzony wyłącznie dla JSF

8

Page 13: Integracja JSF + Facelets + Spring + JPA + Tomahawk

Facelets - odejście od JSP

• ViewHandler stworzony wyłącznie dla JSF

• .xhtml zamiast .jsp

8

Page 14: Integracja JSF + Facelets + Spring + JPA + Tomahawk

Facelets - odejście od JSP

• ViewHandler stworzony wyłącznie dla JSF

• .xhtml zamiast .jsp

• Szybsze niż kombinacja JSF&JSP

8

Page 15: Integracja JSF + Facelets + Spring + JPA + Tomahawk

Facelets - lepsze wyświetlania błędów

9

Page 16: Integracja JSF + Facelets + Spring + JPA + Tomahawk

Facelets - lepsze wyświetlania błędów

9

Page 17: Integracja JSF + Facelets + Spring + JPA + Tomahawk

Facelets - lepsze wyświetlania błędów

9

Page 18: Integracja JSF + Facelets + Spring + JPA + Tomahawk

Facelets - nie powiedziałem o:

10

Page 19: Integracja JSF + Facelets + Spring + JPA + Tomahawk

• bardzo proste szablony,

Facelets - nie powiedziałem o:

10

Page 20: Integracja JSF + Facelets + Spring + JPA + Tomahawk

• bardzo proste szablony,

• widok można rozwijać na żywo,

Facelets - nie powiedziałem o:

10

Page 21: Integracja JSF + Facelets + Spring + JPA + Tomahawk

• bardzo proste szablony,

• widok można rozwijać na żywo,

• wsparcie dla JSTL,

Facelets - nie powiedziałem o:

10

Page 22: Integracja JSF + Facelets + Spring + JPA + Tomahawk

• bardzo proste szablony,

• widok można rozwijać na żywo,

• wsparcie dla JSTL,

• łatwiejsze dodawanie nowych komponentów,

Facelets - nie powiedziałem o:

10

Page 23: Integracja JSF + Facelets + Spring + JPA + Tomahawk

• 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

Page 24: Integracja JSF + Facelets + Spring + JPA + Tomahawk

Facelets - konfiguracja

11

Page 25: Integracja JSF + Facelets + Spring + JPA + Tomahawk

Delegacja ViewHandlerw faces-config.xml

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

12

Page 26: Integracja JSF + Facelets + Spring + JPA + Tomahawk

<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

Page 27: Integracja JSF + Facelets + Spring + JPA + Tomahawk

Tomahawk

14

Page 28: Integracja JSF + Facelets + Spring + JPA + Tomahawk

Tomahawk

15

Page 29: Integracja JSF + Facelets + Spring + JPA + Tomahawk

Tomahawk

15

Page 30: Integracja JSF + Facelets + Spring + JPA + Tomahawk

Tomahawk

• Zbiór komponentów dla JSF ze stajni Apache

15

Page 31: Integracja JSF + Facelets + Spring + JPA + Tomahawk

Tomahawk

• Zbiór komponentów dla JSF ze stajni Apache

• Dodatkowe walidatory

15

Page 32: Integracja JSF + Facelets + Spring + JPA + Tomahawk

Tomahawk

• Zbiór komponentów dla JSF ze stajni Apache

• Dodatkowe walidatory

• Wszystko to, co powinno być już dawno w JSF

15

Page 33: Integracja JSF + Facelets + Spring + JPA + Tomahawk

16

Page 34: Integracja JSF + Facelets + Spring + JPA + Tomahawk

16

Page 35: Integracja JSF + Facelets + Spring + JPA + Tomahawk

16

Page 36: Integracja JSF + Facelets + Spring + JPA + Tomahawk

16

Page 37: Integracja JSF + Facelets + Spring + JPA + Tomahawk

16

Page 38: Integracja JSF + Facelets + Spring + JPA + Tomahawk

16

Page 39: Integracja JSF + Facelets + Spring + JPA + Tomahawk

16

Page 40: Integracja JSF + Facelets + Spring + JPA + Tomahawk

Tomahawk - konfiguracja

17

Page 41: Integracja JSF + Facelets + Spring + JPA + Tomahawk

Tomahawk - konfiguracja

• Wystarczy dodać tomahawk.jar :)

17

Page 42: Integracja JSF + Facelets + Spring + JPA + Tomahawk

Spring Framework

18

Page 43: Integracja JSF + Facelets + Spring + JPA + Tomahawk

Spring

19

Page 44: Integracja JSF + Facelets + Spring + JPA + Tomahawk

Spring

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

19

Page 45: Integracja JSF + Facelets + Spring + JPA + Tomahawk

Spring

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

• Nie narzuca nam określonego modelu programowania,

19

Page 46: Integracja JSF + Facelets + Spring + JPA + Tomahawk

Spring

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

• Nie narzuca nam określonego modelu programowania,

• lekki i dobrze udokumentowany,

19

Page 47: Integracja JSF + Facelets + Spring + JPA + Tomahawk

Spring

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

• Nie narzuca nam określonego modelu programowania,

• lekki i dobrze udokumentowany,

• łatwość testowania, rozszerzania,

19

Page 48: Integracja JSF + Facelets + Spring + JPA + Tomahawk

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

Page 49: Integracja JSF + Facelets + Spring + JPA + Tomahawk

Na czym polega połączenie JSF i Spring?

20

Page 50: Integracja JSF + Facelets + Spring + JPA + Tomahawk

21

Page 51: Integracja JSF + Facelets + Spring + JPA + Tomahawk

#{ziarnoPrawdy}

21

Page 52: Integracja JSF + Facelets + Spring + JPA + Tomahawk

#{ziarnoPrawdy}

JSF standardowo sprawdza czy jestgdzieś w swoim kontekście.

21

Page 53: Integracja JSF + Facelets + Spring + JPA + Tomahawk

#{ziarnoPrawdy}

JSF standardowo sprawdza czy jestgdzieś w swoim kontekście.

jeśli nic nie znaleziono

JSF deleguje jego znalezienie do Springa

21

Page 54: Integracja JSF + Facelets + Spring + JPA + Tomahawk

#{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

Page 55: Integracja JSF + Facelets + Spring + JPA + Tomahawk

...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

Page 56: Integracja JSF + Facelets + Spring + JPA + Tomahawk

czas na JPA

23

Page 57: Integracja JSF + Facelets + Spring + JPA + Tomahawk

czas na konkrety

23

Page 58: Integracja JSF + Facelets + Spring + JPA + Tomahawk

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

Page 59: Integracja JSF + Facelets + Spring + JPA + Tomahawk

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

Page 60: Integracja JSF + Facelets + Spring + JPA + Tomahawk

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

Page 61: Integracja JSF + Facelets + Spring + JPA + Tomahawk

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

Page 62: Integracja JSF + Facelets + Spring + JPA + Tomahawk

czas na konfirgurację,czas na Springa

28

Page 63: Integracja JSF + Facelets + Spring + JPA + Tomahawk

Testowanie w Springu

29

Page 64: Integracja JSF + Facelets + Spring + JPA + Tomahawk

Testowanie w Springu

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

29

Page 65: Integracja JSF + Facelets + Spring + JPA + Tomahawk

Testowanie w Springu

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

• testy też podlegają wstrzyknięciu zależności,

29

Page 66: Integracja JSF + Facelets + Spring + JPA + Tomahawk

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

Page 67: Integracja JSF + Facelets + Spring + JPA + Tomahawk

CRUD

30

Page 68: Integracja JSF + Facelets + Spring + JPA + Tomahawk

CRUD

list

30

Page 69: Integracja JSF + Facelets + Spring + JPA + Tomahawk

#{userController.createSetup}create

CRUD

list

30

Page 70: Integracja JSF + Facelets + Spring + JPA + Tomahawk

#{userController.createSetup}create

CRUD

list

#{userController.create}

30

Page 71: Integracja JSF + Facelets + Spring + JPA + Tomahawk

#{userController.createSetup}create

#{userController.editSetup} update

CRUD

list

#{userController.create}

30

Page 72: Integracja JSF + Facelets + Spring + JPA + Tomahawk

#{userController.createSetup}create

#{userController.editSetup} update

CRUD

list

#{userController.create}

#{userController.update}

30

Page 73: Integracja JSF + Facelets + Spring + JPA + Tomahawk

#{userController.delete} delete

#{userController.createSetup}create

#{userController.editSetup} update

CRUD

list

#{userController.create}

#{userController.update}

30

Page 74: Integracja JSF + Facelets + Spring + JPA + Tomahawk

do dzieła

31

Page 75: Integracja JSF + Facelets + Spring + JPA + Tomahawk

Drobne słowo ot:selectManyCheckbox

32

Page 76: Integracja JSF + Facelets + Spring + JPA + Tomahawk

Drobne słowo ot:selectManyCheckbox

• Kiedy klasa nie jest standardowa to trzeba opakowywać w SelectItem,

32

Page 77: Integracja JSF + Facelets + Spring + JPA + Tomahawk

Drobne słowo ot:selectManyCheckbox

• Kiedy klasa nie jest standardowa to trzeba opakowywać w SelectItem,

• t:selectItem robi to za nas,

32

Page 78: Integracja JSF + Facelets + Spring + JPA + Tomahawk

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

Page 79: Integracja JSF + Facelets + Spring + JPA + Tomahawk

Jak można sobie pomóc?

33

Page 80: Integracja JSF + Facelets + Spring + JPA + Tomahawk

Jak można sobie pomóc?

• Wiele IDE ma wsparcie do konfigurowania projektu (NetBeans, IntelliJ Idea),

33

Page 81: Integracja JSF + Facelets + Spring + JPA + Tomahawk

Jak można sobie pomóc?

• Wiele IDE ma wsparcie do konfigurowania projektu (NetBeans, IntelliJ Idea),

• AppFuse,

33

Page 82: Integracja JSF + Facelets + Spring + JPA + Tomahawk

Jak można sobie pomóc?

• Wiele IDE ma wsparcie do konfigurowania projektu (NetBeans, IntelliJ Idea),

• AppFuse,

• generatory Seam,

33

Page 83: Integracja JSF + Facelets + Spring + JPA + Tomahawk

Jak można sobie pomóc?

• Wiele IDE ma wsparcie do konfigurowania projektu (NetBeans, IntelliJ Idea),

• AppFuse,

• generatory Seam,

• pisać własne generatory,

33

Page 84: Integracja JSF + Facelets + Spring + JPA + Tomahawk

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


Top Related