几天前,我开始学习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
标题之前停留。为什么呢?
P.S。对于术语我很抱歉,但我是网络开发的新手。
答案 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代替。