0

我的应用程序具有以下模式:FrontController、Command、Service 和 DAO。

我遇到的问题是我想在我的主页上显示用户列表(及其头像)。如何让我的 jsp 页面ListMembersCommand在没有获取/发布请求的情况下自动调用页面加载?

4

1 回答 1

4

你没有。您所做的是调用控制器并将 if 转发到 JSP。您永远不会直接调用 JSP。

所以,你最终得到的是:

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

控制器可以在调用 JSP 之前获取任何必要的内容并适当地填充请求以呈现所有内容。

附录 -

这是一个简单的 Servlet,映射到 /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);
    }
}

这是一个位于 /WEB-INF/jsp/members.jsp 的关联 JSP:

<%@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>

在您的浏览器中,您点击:http://yourhost/yourapp/MyServlet

servlet 充当控制器,接受请求,对其进行操作(在这种情况下,使用简单的 DAO 模式从数据库中获取所有成员的列表),然后将结果放入带有标签的请求中“成员”(这样request.setAttribute("members", members)做)。

一个请求被适当地填充了有趣的信息,servlet 转发到 JSP。

请注意,在这种情况下,JSP 位于 WEB-INF 目录下。浏览器根本无法访问位于 WEB-INF 中的 JSP。因此,对http://yourhost/yourapp/WEB-INF/jsp/members.jsp的请求将失败。

但它们可以在内部访问。

因此,Servlet 转发到 members.jsp,然后 members.jsp 呈现,members从请求中定位值(JSTL c:forEach 标记中的 ${members}),然后 c:forEach 遍历该列表,填充member变量,并从那里填写表格中的行。

这是一个经典的“控制器优先”模式,它使 JSP 不受影响。它还有助于保持 JSP 仅存在于 MVC 的视图层中。在这个简单的示例中,Member 和 List 是模型,Controller 中的 Servlet,而 JSP 是视图。

于 2012-04-06T23:56:51.510 回答