在service()中可以使用request来获取请求数据,还可以使用response向客户端响应,response有响应流。request和response是一次性的,即每次请求都要创建新的。
response是类型是javax.servlet.http.HttpServlet.Response
response对象和功能:
response有两个响应流,一个是字符流,一个是字节流
使用字符流有两个问题:
1、编码
在调用getWrite()方法之前使用setCharacterEncoding()来设置字符流编码,如果不设置默认是iso-8859-1。
//response.setCharacterEncoding("utf-8");//设置字符流的编码为utf-8,设置之后用字符流发送的字符串都是utf-8的。
response.setContentType("text/html;charset=utf-8");//设置字符流编码,而且还会添加content-Type响应头,这个头通知浏览器用utf-8解码。
response.getWriter("中国");
浏览器一般默认使用gbk来解码。
2、缓冲区:默认是8kb,就是说,在响应数据没输出8kb之前,数据都是存放在缓冲区中,而不会立刻发送到客户端,当servlet执行结束后,服务器才会去刷新流,使缓冲区的数据发送到客户端。
缓冲区刷新:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
for(int i=0; i < 1024; i++) {
response.getWriter().print("A");
}
///System.out.println(response.isCommitted());//检测是否发送
/*刷新缓冲区,这下面两句话的效果相同
*
*/
//response.getWriter().flush();//
//response.flushBuffer();
try {
Thread.sleep(5000);//休眠5秒钟
} catch (InterruptedException e) {
e.printStackTrace();
}
}
response.addHeader("a","A");
response.addHeader("a","AA");
response.addHeader("Content-type","text/html;charset=utf-8");
response.addHeader("Content-type","text/html;charset=gbk");
最后是gbk。response.setHeader("a","A");
response.setHeader("a","AA");
response.setHeader("Refresh","5;URL=www.baidu.com");
5秒后自动跳转到百度主页
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setHeader("Refresh","5;URL=/day05_1/index.jsp");
response.setContentType("text/html;charset=utf-8");
response.getWriter().print("一会儿会自动跳转到主页");
}
response.setStatus(int code);
response.sendError(int code , String msg);
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//response.setStatus(200);设置状态码
response.sendError(500,"您访问的资源找到了");//设置错误提示
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/*
* 重定向:
* 1、状态码为302
* 2、响应头Location
*/
response.setStatus(302);
response.setHeader("Location", "/day05_2/index.jsp");
}
response.sendRedirect(“重定向的URL”);
/**
* 自动重定向
*
* @author green
*所谓自动,其实就是response提供的简便方法,可以完成设置状态码和Location头。
*/
@WebServlet("/BServlet")
public class BServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/*下面sendRedirect()两个功能:
* 1、设置状态码为302
* 2、设置响应头Location
*/
response.sendRedirect("/day05_2/index.jsp");
}
}
注意:
response.getWriter().print("哈哈哈");
response.sendRedirect("/day05_2/index.jsp");