2012-04-06 4 views
0

Meine Anwendung hat die folgenden Muster: FrontController, Command, Service und DAO.In einem JSP MVC-Design ist es möglich, einen Befehl beim Laden der Seite automatisch aufzurufen?

Das Problem ist, dass ich eine Liste der Benutzer (und ihrer Avatare) auf meiner Homepage anzeigen möchte. Wie erhalte ich meine JSP-Seite, um die ListMembersCommand beim Laden der Seite ohne eine Get/Post-Anfrage automatisch aufzurufen?

+0

Es gibt etwas namens onPageLoad() (Syntax kann falsch sein) in Javascript, dort müssen Sie möglicherweise Ihr Servlet mit Ajax aufrufen. – kosa

Antwort

4

Sie nicht. Was Sie tun, ist, rufen Sie den Controller und haben, wenn an die JSP weitergeleitet. Sie rufen die JSPs niemals direkt selbst auf.

Also, was Sie am Ende mit ist:

request --- invokes ---> Controller --- forwards to ---> JSP 

Der Controller kann holen, was notwendig ist und die Anforderung angemessen füllen, bevor die JSP aufgerufen, alles zu machen.

Addenda -

Hier ist ein einfaches Servlet, abzubildenden/myservlet:

public class MyServlet extends HttpServlet { 

    @Override 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
      throws ServletException, IOException { 
     MemberDAO dao = DAOFactory.getMemberDAO(); 
     List<Member> members = dao.getMembers(); 
     request.setAttribute("members", members); 
     RequestDispatcher rd = getServletContext().getRequestDispatcher("/WEB-INF/jsp/members.jsp"); 
     rd.forward(request, response); 
    } 
} 

Und hier ist ein assoziiertes JSP bei /WEB-INF/jsp/members.jsp gestellt:

<%@page contentType="text/html" pageEncoding="UTF-8"%> 
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
    "http://www.w3.org/TR/html4/loose.dtd"> 

<html> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
     <title>Members List</title> 
    </head> 
    <body> 
     <h1>Members List</h1> 
     <table> 
      <tr> 
       <td>Member ID</td> 
       <td>First Name</td> 
       <td>Last Name</td> 
      </tr> 
      <c:forEach items="${members}" var="member"> 
       <tr> 
        <td>${member.id}</td> 
        <td>${member.firstName}</td> 
        <td>${member.lastName}</td> 
       </tr> 
      </c:forEach> 
     </table> 
    </body> 
</html> 

in Ihrem Browser Sie treffen: http://yourhost/yourapp/MyServlet

Das Servlet, als contr handeln oller, nimmt die Anfrage, handelt darauf (in diesem Fall erhält man eine Liste aller Mitglieder aus der Datenbank mit einem einfachen DAO-Muster), und legt dann die Ergebnisse in die Anfrage mit dem Tag "members" (die request.setAttribute("members", members) tut Dies).

Eine der Anfrage ist richtig mit interessanten Informationen gefüllt, die Servlet an die JSP.

Hinweis: In diesem Fall befindet sich die JSP unter dem Verzeichnis WEB-INF. JSPs innerhalb von WEB-INF sind vom Browser aus NICHT zugänglich. So eine Anfrage an http://yourhost/yourapp/WEB-INF/jsp/members.jsp wird einfach fehlschlagen.

Aber sie sind intern zugänglich.

die Servlet vorwärts So members.jsp und members.jsp macht, von der Anforderung der members Wert Ortung ($ {} Mitglieder in der JSTL c: forEach Tag) und die c: forEach iteriert über diese Liste Befüllen der Variablen member und von dort Ausfüllen der Zeilen in der Tabelle.

Dies ist ein klassisches "Controller First" -Muster, das die JSP aus dem Weg hält. Es hilft auch sicherzustellen, dass die JSPs nur in der View-Ebene von MVC vorhanden sind. In diesem einfachen Beispiel ist Member und List das Modell, das Servlet im Controller und die JSP die View.

+0

Aber wie bekomme ich eine Anfrage zum Senden an den Controller beim Laden der Seite? Ist das nicht möglich? Wie kann ich sonst beim Laden der Seite Informationen aus der Datenbank abrufen? Zum Beispiel eine Homepage, die Mitglieder, Produkte und andere Dinge anzeigt. – Jonathan

Verwandte Themen