HttpServletResponse 类
1.HttpServletResponse 类的作用
HttpServletResponse 类和 HttpServletRequest 类一样。每次请求进来,Tomcat 服务器都会创建一个 Response 对象传递给 Servlet 程序去使用。HttpServletRequest 表示请求过来的信息,HttpServletResponse 表示所有响应的信息, 我们如果需要设置返回给客户端的信息,都可以通过 HttpServletResponse 对象来进行设置
2.字符流 与 字节流
字节流 getOutputStream(); 常用于下载(传递二进制数据)
字符流 getWriter(); 常用于回传字符串(常用)
两个流同时只能使用一个。 使用了字节流,就不能再使用字符流,反之亦然,否则就会报错。
package com.sammery.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class ResponseIOServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter();
response.getOutputStream();
}
}
本想测试下 getWriter() 与 getOutputStream() 方法的冲突,结果报错中出现 问号 ?乱码
package com.sammery.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class ResponseIOServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
response.getWriter();
response.getOutputStream();
}
}
加上response.setContentType(“text/html;charset=UTF-8”);后问号乱码消失
3. Servlet-response 解决中文响应乱码
package com.sammery.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
public class ResponseIOServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// System.out.println( response.getCharacterEncoding() ); 输出服务器字符集
//设置服务器字符集为UTF-8
response.setCharacterEncoding("UTF-8");
//通过响应头,设置浏览器也使用UTF-8
response.setHeader("Content-Type","text/html;charset=UTF-8");
//设置浏览器和服务器都使用UTF-8
//此方法一定要在获取流对象之前调用才有效
response.setContentType("text/html;charset=UTF-8");
PrintWriter writer = response.getWriter();
writer.write("hello!!!!!一二三四五六七八九十!!!");
}
}
浏览器输出:
4.请求重定向
概念:
请求重定向,是指客户端给服务器发送请求,然后服务器给客户端一个新的地址,让客户端访问这个新的地址。(之前的地址可能已经废弃)
创建两个servlet程序
Response1
package com.sammery.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class Response1 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("------Response1------");
//设置响应状态码码302,表示重定向
response.setStatus(302);
//设置响应头,说明新的地址在哪里
response.setHeader("Location","http://localhost:8080/HTTPServlet/response2");
}
}
方法二:
package com.sammery.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class Response1 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.sendRedirect("http://localhost:8080/HTTPServlet/response2");
}
}
Response2
package com.sammery.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class Response2 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("------Response2-----");
response.getWriter().write("Response2's result !!");
}
}
客户端浏览器地址栏输入http://localhost:8080/HTTPServlet/response1 跳转 http://localhost:8080/HTTPServlet/response2 结果:
请求重定向的特点:
- 浏览器地址栏会发生变化
- 浏览器发送两次请求
- 不共享 Request 域中的数据
- 不能访问 WEB-INF 目录下的资源
- 可以访问工程外的资源