尝试在我的servlet中传递使用HTML构建的表时:
response.setContentType("text/html" );
PrintWriter out = response.getWriter();
out.println("<html>" );
out.println("<head>" );
out.println("<title>Imput OPC</title>" );
out.println("</head>" );
out.println("<body>" );
...
然后
response.sendRedirect("/xxx.jsp" );
但是我没有在JSP中找到任何表格
一位朋友告诉我使用Bean但是如何在bean中捕获表单中的值(因为我在构造表之前对表单进行了处理)。我必须使用servlet。所以我想要的是在响应中构造一个表,然后将其发送给jsp,知道:.sendRedirect
和
getServletContext().getRequestDispatcher("/xxx.jsp").forward(request, response);
什么都没有。
答案 0 :(得分:4)
重定向让客户端触发新请求。它会破坏您正在处理的当前请求和响应。您在指定的URL上获得了新的请求和响应。每当要将请求范围的信息从servlet传递到JSP时,您都不希望发送重定向。改为使用转发。
在servlet中打印HTML是一个很大的禁忌。每当您想要稍后将请求转发给JSP时,您也不应该向响应主体写一些内容。您将在服务器日志中遇到IllegalStateException
(实际上是Webbrowser中的空白页)。打印HTML是一项由JSP完成的任务,而不是由servlet完成的。
在servlet中,你只需要做生意。例如。收集要在表格中显示的信息。首先创建一个Javabean类,它表示表的每个项目(行)。然后创建一个DAO类,它从数据存储区(数据库?)返回这些项的列表。然后在servlet中,只需使用HttpServletRequest#setAttribute()
将项列表放入请求范围,使用RequestDispatcher#forward()
将请求转发到JSP文件,并使用JSTL {{迭代项目列表3}}标记(要安装JSTL,只需在/WEB-INF/lib
中删除c:forEach
)。
基本启动示例:
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);
}
其中/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>
有关更多提示和示例,您可能会发现jstl-1.2.jar非常有用。为了更进一步,你还可以使用MVC框架,这样你基本上只得到一个Javabean类和一个JSP文件(即servlet的角色已被MVC框架接管),例如{{3 }}
答案 1 :(得分:1)
我不确定你想要什么,但你试过了吗?
request.getRequestDispatcher("/xxx.jsp").forward(request, response);
response.sendRedirect("/xxx.jsp" )
就是这样,它告诉浏览器去看别的地方(http 301的位置标题是“../xxx.jsp”)。此重定向中不传递任何信息。这就是RequestDispatcher的用途。