关于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("<form action='#' method='post'>");
		out.write("用户名:");
		out.write("<input type='text' name='username'><br/>");
		out.write("密码:");
		out.write("<input type='password' name='password'><br/>");
		out.write("<input type='submit' value='login'>");
		out.write("</form>");
	}


	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会自动关闭,但是会有一个延时。
  • 4
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值