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
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
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\")
})
@Entity
public 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\")
})
@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(\"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
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
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
0 comments
Post a comment