A redirect让客户解雇new要求。它会破坏您当前正在处理的请求和响应。您会在指定的 URL 上收到全新的请求和响应。当您想要将请求范围的信息从 servlet 传递到 JSP 时,您不希望发送重定向。用一个forward反而。
在 servlet 中打印 HTML 是一个很大的禁忌。当您稍后想要将请求转发到 JSP 时,也不应该在响应主体中写入任何内容。你将面临一个IllegalStateException
在服务器日志中(实际上是网络浏览器中的空白页)。打印 HTML 是一项由 JSP 完成的任务,而不是由 servlet 完成。
在 servlet 中,您只需要处理业务即可。例如。收集要在表格中显示的信息。首先创建一个代表表中每个项目(行)的 Javabean 类。然后创建一个 DAO 类,它从数据存储(数据库?)返回这些项目的列表。然后在 servlet 中,只需使用以下命令将项目列表放入请求范围中HttpServletRequest#setAttribute() http://java.sun.com/javaee/5/docs/api/javax/servlet/ServletRequest.html#setAttribute%28java.lang.String,%20java.lang.Object%29,将请求转发到 JSP 文件,使用RequestDispatcher#forward() http://java.sun.com/javaee/5/docs/api/javax/servlet/RequestDispatcher.html#forward%28javax.servlet.ServletRequest,%20javax.servlet.ServletResponse%29并使用迭代项目列表JSTL http://java.sun.com/products/jsp/jstl/1.1/docs/tlddocs/ c:forEach http://java.sun.com/products/jsp/jstl/1.1/docs/tlddocs/c/forEach.html标签(要安装 JSTL,只需删除jstl-1.2.jar http://download.java.net/maven/1/jstl/jars/jstl-1.2.jar in /WEB-INF/lib
).
基本启动示例:
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
List<Item> items = itemDAO.list();
request.setAttribute("items", items); // It's now available as ${items} in EL.
request.getRequestDispatcher("/WEB-INF/result.jsp").forward(request, response);
}
where /WEB-INF/result.jsp
看起来像这样:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
...
<table>
<c:forEach items="${items}" var="item">
<tr>
<td>${item.someProperty}</td>
<td>${item.anotherProperty}</td>
</tr>
</c:forEach>
</table>
有关更多提示和示例,您可能会发现那些教程 http://courses.coreservlets.com/Course-Materials/csajsp2.html有用。更进一步,您还可以使用 MVC 框架,这样您基本上就只剩下一个 Javabean 类和一个 JSP 文件(即 servlet 的角色已由 MVC 框架接管),例如JSF http://www.coreservlets.com/JSF-Tutorial/jsf2/.