我的应用程序具有以下模式:FrontController,Command,Service和DAO。
我遇到的问题是我想在我的主页上显示用户列表(及其头像)。如何在没有get / post请求的情况下让我的jsp页面在页面加载时自动调用ListMembersCommand
?
答案 0 :(得分:4)
你没有。你所做的就是调用控制器并转发到JSP。你永远不会直接调用JSP。
所以,你最终得到的是:
request --- invokes ---> Controller --- forwards to ---> JSP
Controller可以获取所需的任何内容,并在调用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模式从数据库中获取所有成员的列表),然后将结果放入请求中标签“members”(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的View层中。在这个简单的例子中,Member和List是模型,Controller中的Servlet和JSP是视图。