Pytanie 1:
Witam. Dotąd pisałem w Netbeansie, ale postanowiłem się przesiąść na Eclipse. W Netbeansie żeby napisać aplikację w Javie EE tworzyłem po prostu projekt EAR i tworzył mi się projekt z podziałem na podprojekt EJB i WAR. Nie wiem jak to prawidłowo stworzyć w Eclipsie, ale chyba wg. tego tutorialu będzie ok? http://mkorwel.blogspot.com/2010/05/ejb-servlet-prosta-aplikacja-enterprise.html
Mam też pytanie do osób, które znają się bardziej na pisaniu tego typu apliakcaji. Z ilu modułów powinna się taka aplikacja składać? Z EJB i WAR tylko? Jeśli będę korzystał z Hibernate to gdzie umieścić jego pliki? Raczej w EJB?
Pytanie 2:
To już pytanie bardziej konkretne bo dotyczące realizacji projektu. Mianowicie mam system przychodni i planuję go trochę udoskonalić.
Przykładowo mam JSFowego ManagedBeana LoginMB, w którym jest metoda do logowania do systemu. Jeśli logowanie się powiedzie to zapisuję do sesji id tego użytkownika:
session.setAttribute("myId", user.getId());
Potem z tego ID korzystam w różnych sytuacjach np. podczas edycji swoich danych, jeśli lekarze jest zalogowany to podczas dodawania swoich wizyt, jeśli pacjent to do zapisu na wizytę itp. Czy jest to dobre rozwiązanie? Tak pomyślałem, że skoro bean jest i tak sesyjny więc żyje cały czas to po prostu mógłbym np. go wstrzyknąć do JSFowego beana z wizytami, w którym mi to ID jest potrzebne za pomocą
java napisał(a)
@Inject
zamiast pobierać go z sesji:
myId = (Integer) session.getAttribute("myId");
Która z opcji wydaje się być lepsza? Może są jeszcze jakieś inne?
Druga sprawa, dość podobna do powyższej. Przykładowo lekarz ma możliwość przejrzenia historii choroby pacjenta. Więc klikam wyświetl listę pacjentów i po najechaniu na któregoś z nich wywoływana jest metoda getUser z JSFowego ManagedBeana UserMB
public User getUser() {
if (user == null) {
user = new User();
}
session.setAttribute("userId", user.getId());
return user;
}
Zapisuję wtedy do sesji id tego użytkownika
session.setAttribute("userId", user.getId());
ponieważ UserMB ma zasięg request więc przy przejściu na dalszą stronę gdzie również jest mi potrzebna informacja o userze straciłbym ją. Czy to rozwiązanie również jest dobre?
I trzecia sprawa, również podobna do poprzednich. Mam sekretarkę, która może zapisać pacjenta na wizytę do wybranego lekarza, zanim dokonam zapisu w bazie to te ID gdzieś muszę przechowywać więc robię podobnie jak poprzednio. Wyświetlam listę pacjentów wybieram pacjenta i zapisuję jego ID przed przejściem do listy lekarzy za pomocą metody:
public String goDoctorVisitsList() {
session.setAttribute("patientId", user.getId()); //ustawienie id aktualnie przeglądanego pacjenta
return "visitList";
}
potem przy wyborze lekarza korzystam z wcześniejszego rozwiązania:
<code class="java"> public User getUser() {
if (user == null) {
user = new User();
}
session.setAttribute("userId", user.getId());
return user;
}
I w taki sposób mam oba ID i mogę dokonać zapisu w bazie wizyty z wybranym lekarzem i pacjentem:
```java
patientId = (Integer) session.getAttribute("patientId");
doctorId = (Integer) session.getAttribute("userId");
visit.setPatientId(userDao.find(patientId));
visit.setDoctorId(userDao.find(doctorId));
visitDao.update(visit);
Czy takie rozwiązania są dobre? Jak to inaczej zrealizować? Osobiście nic lepszego mi do głowy nie przychodzi.
Pytanie 3
Trzecie pytanie dotyczy zabezpieczenia strony. Dotąd realizowałem proces dostępu do poszczególnych paneli w taki sposób, że w sesyjnym LoginMB miałem metodę logującą, która przeszukiwała bazę w celu znalezienia użytkownika i zwracała jego rolę. Np. "admin". Co powodowało przejście na stronę AdminPanel, z której mogłem przechodzić na kolejne strony dostępne tylko dla admina. To zabezpieczenie jednak wydaję mi się niezbyt dobrym rozwiązaniem. Czytałem coś o JAAS. Czy jest to lepsza opcja? Czego powinno się używać do zabezpieczenia dostępu.
public String validate() {
user = userService.findUserAccount(login, password);
if (user != null) {
FacesContext facesContext = FacesContext.getCurrentInstance();
HttpSession session = (HttpSession) facesContext.getExternalContext().getSession(true);
session.setAttribute("myId", user.getId());
return user.getRole();
} else {
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Niepoprawny login lub hasło", "Sprawdź poprawność loginu oraz hasła"));
return null;
}
}
Pytanie 4
Ostatnie pytanie dotyczy nawigacji na stronach. Zrealizowałem to raczej w dość głupi sposób ponieważ do każdego nawet najgłupszego przejścia na inną stronę pisałem metodę np przejście na głupią stronę z galerią:
public String goGallery() {
return "gallery";
}
i na stronie kod:
<p:menuitem styleClass="navigation" value="#{msg.gallery}" action="#{userMB.goGallery()}" icon="ui-icon-star"/>
Przez co faces-config rozrósł mi się do niebotycznych rozmiarów i ma ponad 5000 linijek.
Słyszałem o metodzie dzięki, której nie będą potrzebne wpisy w faces-config jeśli w action wpiszę nazwę strony to wtedy nastąpi przekierowanie na nią np:
<p:menuitem styleClass="navigation" value="#{msg.gallery}" action="gallery" icon="ui-icon-star"/>
Czy to jest lepsze rozwiązanie aby zmniejszyć wielkość faces-config, w którym można się potem naprawdę pogubić.