Java Web学习笔记(四):HttpServletResponse

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 。

Java Web学习笔记(四):HttpServletResponse_第1张图片
forward-jsp.jpg

点击forward转发的链接,效果如下。可以发现url中的路径是转发前的forwardServlet,并且将属性传递了过去。

Java Web学习笔记(四):HttpServletResponse_第2张图片
forward.jpg

点击redirect重定向的链接,效果如下。可以发现url中的路径是重定向后的testServlet,并且未将属性传递过去。

Java Web学习笔记(四):HttpServletResponse_第3张图片
redirect.jpg

大概总结下重定向和转发的区别:

  1. 转发在服务器端完成的,request信息不会丢失;重定向是在客户端完成的,request信息会丢失。
  2. 请求转发是通过request,重定向是通过response。
  3. 转发的是同一次请求;重定向是两次不同请求。
  4. 转发地址栏没有变化;重定向地址栏有变化。
  5. 转发必须是在同一台服务器下完成;重定向可以在不同的服务器下完成。

你可能感兴趣的:(Java Web学习笔记(四):HttpServletResponse)