1. 响应正文是在浏览器上真正显示的内容。
响应正文是通过IO流操作的。
在servlet中要想操作响应正文,需要通过response对象获取输出流来操作。
getWriter(); 字符流
getOutputStream(); 字节流
package com.it.servlet.response;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 通过输出流来设置响应信息
*/
public class Demo4Servlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//字符流
//response.getWriter().write("helloworld");
//字节流
response.getOutputStream().write("helloworld".getBytes());
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
问题1:什么时候使用字节流,什么时候使用字符流?
如果是纯文本使用字符流,如果二进制文件,使用字节流。
如果只是得到信息,原样不动,不进行修改操作,例如文件上传和下载,这时就使用字节流。文件上传:在服务器端把浏览器端信息提取出来。文件下载:把服务器端内容写给浏览器端。
如果要操作的是自定义信息,这时使用字符流。
问题2:通过response获取的输出流它的真实类型时什么?
ServletOutputStream response.getOutputStream();
PrintWriter response.getWriter();
ServletOutputStream由于使用字节流多数是原样复制,所以使用write方法,而不是print方法。
PrintWriter:打印流,两个特点:1.可以设置自动刷新。2.可以将信息原样输出。
package com.it.servlet.response;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 通过输出流来设置响应信息
*/
public class Demo4Servlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().write(97);
response.getWriter().println(97);
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
关于输出流的简单应用:servlet是可以完成显示操作的。在java最初的时候,都是把HTML代码写回给浏览器,浏览器解析展示。
package com.it.servlet.response;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Demo5Servlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//response.setCharacterEncoding("utf-8");
response.setHeader("Content-Type", "text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.write("");
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
关系响应信息乱码问题:
response.setCharacterEncoding("utf-8"); 这句话只是设置了响应正文的编码格式是utf-8,而并没有通知浏览器以utf-8的编码格式解析响应正文,浏览器还是按照自己之前的编码格式处理正文,故而会出现乱码。
response.setHeader("Content-Type","text/html;charset=utf-8"); 这句话不仅设置了响应正文的编码格式为utf-8,并且通知浏览器以utf-8编码格式解析。
最通常用的是:response.setContentType("text/html;charset=utf-8"); 这句话不仅设置了响应正文的编码格式为utf-8,并且通知浏览器以utf-8编码格式解析。
注意事项:response生成响应注意事项