4

几天前我开始学习Java EE和Web开发(首先:Tomcat、Servlets、JSP)

所以现在我有了这个 JSP 页面代码。如您所见,标头Hello World with JSP停留在<% ... %>块之前:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="java.util.*" %>

<html>
<body>
<h1 align=”center”&gt;Hello World with JSP</h1>
<br>
<%
    List styles = (List)request.getAttribute("styles");
    for(Object style: styles){
    response.getWriter().println("<br>try: " + style);
    }
%>

</body>
</html>

但是在结果网页中,结果是<% ... %>停留在Hello World with JSP标题之前。为什么?

截屏

PS对不起术语,但我在网络开发方面真的很新。

4

3 回答 3

5

JSP 使用JspWriter调用的隐式实例out来写入输出流。PrintWriter它与您接收的实例并不完全相同,response.getWriter()因为它在实际写入流之前会进行一些额外的缓冲。

当您直接打印时,PrintWriter您基本上是在JspWriter刷新缓冲区之前写入流,因此您List在“Hello World”HTML 之前打印。

你需要的是使用隐式JspWriter实例out作为

<%
    List styles = (List)request.getAttribute("styles");
    for(Object style: styles){
        out.println("<br>try: " + style);
    }
%>

顺便说一句, JSP 中的scriptlet <% %>现在已被弃用。请查看 JSP EL 和 JSTL 标签。

于 2013-09-15T14:34:40.643 回答
2

我认为您想使用 out.println 而不是 response.getWriter().println。请参阅如何从 JSP <%! ... %> 阻塞?

于 2013-09-15T14:29:42.117 回答
2

一个 JSP 被编译成一个 Java servlet。当您执行以下脚本代码时

response.getWriter().println(...);

你得到的HttpServletResponse'sPrintWriter直接写入OutputStream, 在任何 HTML(来自 jsp)被写入之前执行。举这个例子

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="java.util.*" %>

<html>
<head>

</head>
<body>
<%
    response.getWriter().println("hellllooooooooo"); // using response.getWriter().println()
%>
the time is now
<h1 align=”center”&gt;Hello World with JSP</h1>
<br>
<%
    List styles = (List)request.getAttribute("styles");
    for(Object style: styles){
        out.println("<br>try: " + style); // using out.println()
    }
%>

</body>
</html>

您将收到的响应内容是

hellllooooooooo



<html>
<head>

</head>
<body>

the time is now
<h1 align=”center”&gt;Hello World with JSP</h1>
<br>
<br>try: asdaS
<br>try: asdasdasda


</body>
</html>

注意hellllooooooooo在任何东西之前打印。JSPs 给你一个out类型的变量,JspWriter它允许你按预期的顺序输出。请参阅上面的示例以从 request 属性中编写元素styles

重要这是不推荐使用脚本的原因之一。考虑改用JSTL

于 2013-09-15T14:37:17.687 回答