从Servlet到JSP

时间:2010-04-21 10:29:14

标签: jsp servlets

尝试在我的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); 

什么都没有。

2 个答案:

答案 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的用途。

相关问题