关于response获取输出流操作(七)

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("
"); out.write("用户名:"); out.write("
"); out.write("密码:"); out.write("
"); out.write(""); 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生成响应注意事项

  • getOutputStream和getWriter方法分别用于得到输出二进制数据、输出文本数据的ServletOutputStream、PrintWriter对象。
  • getOutputStream和getWriter这两个方法互相排斥,调用了其中的任何一个方法后,就不能再调用另一个方法。
  • Servlet程序向ServletOutputStream或PrintWriter对象中写入的数据将被Servlet引擎从response里面获取,Servlet引擎将这些数据当做响应消息的正文,然后再与响应状态行和各响应头组合后输出到客户端。
  • Servlet的service方法结束后,Servlet引擎将检查getWriter或getOutputStream方法返回的输出流对象是否已经调用过close方法,如果没有,servlet引擎Tomcat将调用close方法关闭该输出流对象。调用close的时候,应该会调用flushBuffer。
  • 通过response获取输出流时,可以不关闭,Tomcat会自动关闭,但是会有一个延时。

你可能感兴趣的:(JavaWeb)