Integracja JSF + Facelets + Spring + JPA + Tomahawk

Preview:

Citation preview

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