Servlet 旨在控制、预处理和/或后处理请求,而不是呈现数据。 JSP 作为一种视图技术,提供了编写 HTML/CSS/JS 的模板。您可以借助 JSTL 等标记库控制页面流程,并使用 EL 访问任何范围属性。
首先创建一个SearchServlet 并将其映射到/search 的一个url-pattern 上并实现doGet() 和doPost(),如下所示:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// Preprocess request here and finally send request to JSP for display.
request.getRequestDispatcher("/WEB-INF/search.jsp").forward(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// Postprocess request here. Get results from your DAO and store in request scope.
String search = request.getParameter("search");
List<Result> results = searchDAO.find(search);
request.setAttribute("results", results);
request.getRequestDispatcher("/WEB-INF/search.jsp").forward(request, response);
}
这是 JSP /WEB-INF/search.jsp 的样子,它利用 JSTL(只需将 JAR 放入 /WEB-INF/lib)来控制页面流。
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
...
<form action="search" method="post">
<input type="text" name="search">
<input type="submit" value="search">
</form>
<c:if test="${not empty results}">
<p>There are ${fn:length(results)} results.</p>
<table>
<c:forEach items="${results}" var="result">
<tr>
<td>${result.id}</td>
<td>${result.name}</td>
<td>${result.value}</td>
</tr>
</c:forEach>
</table>
</c:if>
注意JSP放在/WEB-INF中,防止用户通过URL直接访问。他们被http://example.com/contextname/search强制使用servlet。
要了解更多关于 JSP/Servlets,我可以推荐Marty Hall's Coreservlets.com tutorials。想了解更多searchDAO背后的逻辑,我可以推荐这个basic DAO tutorial。
更进一步,您可以随时考虑使用构建在 Servlet API 之上的 MVC 框架,例如 Sun JSF、Apache Struts、Spring MVC 等,这样您就基本结束了只有 Javabeans 和 JSP/XHTML 文件。一般的 MVC 框架将负责收集请求参数、验证/转换它们、使用这些值更新 Javabean、调用一些 Javabean 操作方法来处理它们等等。这使得 servlet “多余”(不过它仍被用作框架的核心处理器)。