Dostęp do komponentu EJB z poziomu JSP

0

Witam,

tworzę aplikację webową (serwis ogłoszeniowy) w oparciu o JPA, EJB, JSP i Servlety.

Mam dylemat, w jaki sposób pobierać dane z bazy. Do tej pory przetestowałem kilka wariantów - każdy działa, ale nie wiem który jest najbardziej "elegancki".
Wstrzykiwane beany są typu Stateless.

Rozwiązanie 1 - Servlet + JSP
Servlet ListUsersServlet

...
    @EJB
    protected UserDTOFacadeLocal userDao;

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        List<UserDTO> users = userDao.findAll();
        request.setAttribute("userList", users);
        request.getRequestDispatcher("ListUsers.jsp").forward(request, response);
    }
...

ListUsers.jsp

...
<table id="userListTable" border="3">
    <tr >
        <th bgcolor=>ID</th>
        <th bgcolor=>FirstName</th>
        <th bgcolor=>LastName</th>
        <th bgcolor=>Login</th>
        <th bgcolor=>Password</th>        
        <th bgcolor=>Level</th>
        <th bgcolor=>Since</th>
    </tr>
    <c:forEach var="user" begin="0" items="${requestScope.userList}">
        <tr>
            <td>${user.id}</td> 
            <td>${user.firstName}</td> 
            <td>${user.lastName}</td> 
            <td>${user.login}</td> 
            <td>${user.password}</td> 
            <td>${user.level}</td> 
            <td>${user.since}</td> 
        </tr> 

    </c:forEach>

</table>
...

Rozwiązanie 2 - tylko JSP
ListUsers.jsp

...
<%        
    Context ctx = new InitialContext();
    UserDTOFacadeLocal userDao = (UserDTOFacadeLocal) ctx.lookup("java:global/Ads-ear/Ads-ejb-3.0-SNAPSHOT/UserDTOFacade!dao.UserDTOFacadeLocal");
    List<UserDTO> userList = userDao.findAll();
    request.setAttribute("userList", userList);
%>
    
<table id="userListTable" border="3">
    <tr >
        <th bgcolor=>ID</th>
        <th bgcolor=>FirstName</th>
        <th bgcolor=>LastName</th>
        <th bgcolor=>Login</th>
        <th bgcolor=>Password</th>        
        <th bgcolor=>Level</th>
        <th bgcolor=>Since</th>
    </tr>
    <c:forEach var="user" begin="0" items="${requestScope.userList}">
        <tr>
            <td>${user.id}</td> 
            <td>${user.firstName}</td> 
            <td>${user.lastName}</td> 
            <td>${user.login}</td> 
            <td>${user.password}</td> 
            <td>${user.level}</td> 
            <td>${user.since}</td> 
        </tr> 

    </c:forEach>

</table>
...

Myślałem jeszcze nad wstrzyknięciem beana przy logowaniu użytkownika, wyciągnięciu z niego listy userów i umieszczenie jej w ServletContext lub w sesji, ale nie wiem czy to dobre rozwiązanie.
Proszę o nakierowanie, które (jeśli którekolwiek w ogóle) najbardziej nadaje się do tego celu.

Pozdrawiam.

1

Rozwiązanie pierwsze jest najlepsze. Z drugim to się nie spotkałem. Co do trzeciego to raczej nie najlepszy pomysł trzymać całą listę userów przez całą sesję. Jak będziesz potrzebował jeszcze jakichś innych danych do wyświetlania to też to upchniesz do sesji? Pierwsze rozwiązanie jest najlepsze, otrzymujesz dane kiedy potrzebujesz, czyli w momencie gdy chcesz wyświetlić tę listę.

0

ja również jestem przekonana do pierwszego rozwiązania . Czemu, rozdzielasz kontroler od widoku Dostosowujesz się do procedury modelowania kodu . Dostosowując się do wzorca

0

Dzięki, mnie też te rozwiązanie pasuje, ale: wchodząc na /ListUsersServlet pobiera listę i forwarduje do /ListUsers.jsp - wszytko jest ok.
Natomiast mały problem pojawia się, gdy wchodzę bezpośrednio na /ListUsers.jsp - naturalnie lista jest pusta, bo nie wykonuje się wcześniej serwlet.
Czy jest jakiś sposób, aby zawsze przy wejściu na /ListUsers.jsp najpierw wykonał się serwlet? Albo zabronić bezpośredniego dostępu do /ListUsers.jsp przez URL, jednocześnie zezwalając dostęp serwletowi (aby na ten adres zrobił forward)?

1 użytkowników online, w tym zalogowanych: 0, gości: 1