我正在学习如何通过遵循这些1 2官方教程来编写servlet。 我找不到一个关于PrintWriter类与变量的奇怪行为的简单问题的解决方案。 代码如下:
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class ServletExample extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException
{
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head>");
out.println("<title>First example</title>");
out.println("</head>");
out.println("<h2>System information</h2>");
out.println("Host name: " + request.getRemoteHost() + "<br>");
out.println("Remote address: " + request.getRemoteAddr() + "<br>");
out.println("Port: " + request.getServerPort() + "<br>");
out.println("Encoding: " + request.getCharacterEncoding() + "<br>");
out.println("Method: " + request.getMethod() + "<br>");
out.println("Protocol: " + request.getProtocol() + "<br>");
out.println("Address: " + request.getRequestURI() + "<br>");
out.println("Path: " + request.getPathInfo() + "<br>");
out.println("</body>");
out.println("</html>");
out.close();
}
}
servlet容器上servlet的输出显示为
out.println("<h2>System information</h2>");
我无法弄清楚为什么,但我发现通过将以下行分成这些行可以起作用:
out.println("Host name: ");
out.println(request.getRemoteHost())
out.println("<br>");
我在网上搜索了很多,但我找不到并回答。
我在ubuntu mate 16.04 LTS下,从存储库安装了apache tomcat 8。
编辑 我通过在ubuntu配对16.04 LTS和不同操作系统窗口10下使用xampp和tomcat 7尝试不同的tomcat 7来进一步研究这种行为。结果是一样的。
所以我将Request Info官方示例呈现在与tomcat一起安装的examples文件夹中。 该示例的代码是:
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class RequestInfo extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException
{
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head>");
out.println("<title>Request Information Example</title>");
out.println("</head>");
out.println("<body>");
out.println("<h3>Request Information Example</h3>");
out.println("Method: " + request.getMethod());
out.println("Request URI: " + request.getRequestURI());
out.println("Protocol: " + request.getProtocol());
out.println("PathInfo: " + request.getPathInfo());
out.println("Remote Address: " + request.getRemoteAddr());
out.println("</body>");
out.println("</html>");
}
/**
* We are going to perform the same operations for POST requests
* as for GET methods, so this method just sends the request to
* the doGet method.
*/
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException
{
doGet(request, response);
}
}
正如所料,它不起作用,它的行为与之前的代码相同。但是,如果我在示例文件夹中打开预构建版本,则可以正常工作。
最后,通过将每一行分成几行,它如前所述工作。 这真是奇怪的行为。
答案 0 :(得分:0)
我建议你使用StringBuilder对象来生成结果。如果需要,您可以计算内容长度,这在某些情况下很有用。
StringBuilder sbText = new StringBuilder();
sbText.append("<html>")
.append("<head>")
.append(etc...);
String text = sbText.toString();
// Option A:
response.getWriter().print(text);
// Option B:
byte[] bytes = text.getBytes();
response.setContentLength(bytes.length);
response.getOutputStream().write(bytes);
答案 1 :(得分:0)
我找到了解决我奇怪问题的方法。我还尝试使用最新的tomcat v9.0.8,它使用jvm v1.8.0_171-b11,而我使用javac 1.9编译代码。 通过使用javac v1.8,它可以工作。