2. 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
8. Facelets - odejście od JSP
• JSP zostało stworzone do generowania
dynamicznej treści, a nie do tworzenia
drzewa komponentów
7
9. 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
10. 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
19. Facelets - nie
powiedziałem o:
• bardzo proste szablony,
10
20. Facelets - nie
powiedziałem o:
• bardzo proste szablony,
• widok można rozwijać na żywo,
10
21. Facelets - nie
powiedziałem o:
• bardzo proste szablony,
• widok można rozwijać na żywo,
• wsparcie dla JSTL,
10
22. Facelets - nie
powiedziałem o:
• bardzo proste szablony,
• widok można rozwijać na żywo,
• wsparcie dla JSTL,
• łatwiejsze dodawanie nowych
komponentów,
10
23. 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
45. Spring
• IoC, DI, AOP, Hollywood Principle,
JEE, MVC, JTA...
• Nie narzuca nam określonego
modelu programowania,
19
46. Spring
• IoC, DI, AOP, Hollywood Principle,
JEE, MVC, JTA...
• Nie narzuca nam określonego
modelu programowania,
• lekki i dobrze udokumentowany,
19
47. Spring
• IoC, DI, AOP, Hollywood Principle,
JEE, MVC, JTA...
• Nie narzuca nam określonego
modelu programowania,
• lekki i dobrze udokumentowany,
• łatwość testowania, rozszerzania,
19
48. 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
52. #{ziarnoPrawdy}
JSF standardowo sprawdza czy jest
gdzieś w swoim kontekście.
21
53. #{ziarnoPrawdy}
JSF standardowo sprawdza czy jest
gdzieś w swoim kontekście.
jeśli nic nie znaleziono
JSF deleguje jego znalezienie do Springa
21
54. #{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
58. 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
59. 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
60. 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
61. 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
65. Testowanie w Springu
• Możliwe różne konfiguracje w zależności
od potrzeb,
• testy też podlegają wstrzyknięciu
zależności,
29
66. 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
78. 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
80. Jak można sobie
pomóc?
• Wiele IDE ma wsparcie do konfigurowania
projektu (NetBeans, IntelliJ Idea),
33
81. Jak można sobie
pomóc?
• Wiele IDE ma wsparcie do konfigurowania
projektu (NetBeans, IntelliJ Idea),
• AppFuse,
33
82. Jak można sobie
pomóc?
• Wiele IDE ma wsparcie do konfigurowania
projektu (NetBeans, IntelliJ Idea),
• AppFuse,
• generatory Seam,
33
83. Jak można sobie
pomóc?
• Wiele IDE ma wsparcie do konfigurowania
projektu (NetBeans, IntelliJ Idea),
• AppFuse,
• generatory Seam,
• pisać własne generatory,
33
84. 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