HttpServletResponse
HttpServletResponse对象代表服务器的响应。这个对象中封装了向客户端发送数据、发送响应头,发送响应状态码的方法。
HttpServletResponse常用功能
向客户端发送数据
向客户端(浏览器)发送数据的相关方法有:
- getOutputStream(),该方法用于返回Servlet引擎创建的字节输出流对象,Servlet程序可以按字节形式输出响应正文。
- getWriter() 该方法用于返回Servlet引擎创建的字符输出流对象,Servlet程序可以按字符形式输出响应正文。
需要注意,getOutputStream()和getWriter()这两个方法互相排斥,调用了其中的任何一个方法后,就不能再调用另一方法。
向客户端发送响应首部
可以通过以下方法向客户端(浏览器)发送响应首部:
方法 | 说明 |
---|---|
addDateHeader(String name ,long date) | 该方法是设置只有一个值且值的类型为long类型的响应首部。 |
addHeader(String name,String value) | 该方法是设置有多个值的响应首部,参数name表示响应首部名称,参数value表示响应首部的值。 |
addIntHeader(String name,int value) | 该方法是设置有多个值且值的类型为int类型的响应首部。 |
setHeader(String name,String value) | 该方法是设置只有一个值的响应首部 |
setDateHeader(String name,long value) | 该方法是设置只有一个值且值的类型为long类型的响应首部。 |
setIntHeader(String name,int value) | 该方法是设置只有一个值且值的类型为int类型的响应首部。 |
向客户端发送响应状态码
通过setStatus(int value)方法设置发送到客户端的响应状态码。
文件下载
使用HttpServletResponse对象就可以实现文件的下载。
public class DownloadServlet extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
// 获取文件路径
String path = request.getServletContext().getRealPath("/风景图片.jpg");
// 获取文件名
String filename = path.substring(path.lastIndexOf("\\")) + 1;
// 设置响应首部
response.setHeader("content-disposition","attachment;filename="
+ URLEncoder.encode(filename, "UTF-8"));
// 获取下载的文件流
InputStream in = new FileInputStream(path);
int len = 0;
byte[] buffer = new byte[1024];
// 通过response获取输出流
ServletOutputStream out = response.getOutputStream();
// 将FileInputStream流写入到buffer缓冲区
while((len = in.read(buffer)) > 0) {
out.write(buffer, 0, len);
}
in.close();
}
public void doGett(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
doPost(request, response);
}
}
重定向
当客户端向服务端(Servlet)发送请求,如果服务端通知浏览器,让后浏览器在去访问服务端的定向的资源,就是重定向。
为了区分重定向和前面讲过的转发,这里看一个一起的例子。
新建一个JSP页面,在其中创建两个链接。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
请求转发实例
Forward测试页面
foward请求
send重定向
创建两个链接指向的Servlet。
public class ForwardServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
request.setAttribute("forward_name","forward");
String path = "testServlet";
RequestDispatcher dispatcher = request.getRequestDispatcher("/" + path);
dispatcher.forward(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
doGet(request, response);
}
}
public class RedirectServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setAttribute("redirect_name", "redirect");
String path = "testServlet";
response.sendRedirect(path);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
创建重定向和转发后的servlet。
public class testServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
PrintWriter writer = response.getWriter();
writer.println("测试请求转发获取的属性:" + request.getAttribute("forward_name"));
writer.println("测试重定向获取的属性:" + request.getAttribute("redirect_name"));
}
}
在web.xml中对servlet进行配置,然后启动程序,访问 http://localhost:8080/servletdemo/forward.jsp 。
点击forward转发的链接,效果如下。可以发现url中的路径是转发前的forwardServlet,并且将属性传递了过去。
点击redirect重定向的链接,效果如下。可以发现url中的路径是重定向后的testServlet,并且未将属性传递过去。
大概总结下重定向和转发的区别:
- 转发在服务器端完成的,request信息不会丢失;重定向是在客户端完成的,request信息会丢失。
- 请求转发是通过request,重定向是通过response。
- 转发的是同一次请求;重定向是两次不同请求。
- 转发地址栏没有变化;重定向地址栏有变化。
- 转发必须是在同一台服务器下完成;重定向可以在不同的服务器下完成。