JSP中元素顺序的问题

时间:2013-09-15 14:15:07

标签: java jsp tomcat servlets

几天前,我开始学习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”>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标题之前停留。为什么呢?

screenshot

P.S。对于术语我很抱歉,但我是网络开发的新手。

3 个答案:

答案 0 :(得分:5)

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

当您直接打印到PrintWriter时,在刷新JspWriter缓冲区之前,您基本上已经写入了流,因此您的List会在“Hello World”HTML之前打印出来。< / p>

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

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

顺便说一句,现在不推荐使用JSP中的 scriptlets <% %>。请查看JSP EL和JSTL标记。

答案 1 :(得分:2)

我认为你想使用out.println而不是response.getWriter()。println。见How to output HTML from JSP <%! … %> block?

答案 2 :(得分:2)

JSP被编译为Java servlet。执行以下scriplet代码时

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

您正在获取HttpServletResponse的{​​{1}},它直接写入PrintWriter,在编写任何HTML(来自jsp)之前执行操作。举个例子

OutputStream

您将收到的回复内容是

<%@ 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”>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”>Hello World with JSP</h1> <br> <br>try: asdaS <br>try: asdasdasda </body> </html> 在任何内容之前打印。 hellllooooooooo为您提供JSP类型为out的变量,该变量允许您按预期顺序输出。请参阅上面的示例,以便从请求属性JspWriter中编写元素。

重要这是不建议使用scriplet的原因之一。请考虑使用JSTL代替。