JAVAWEB——Response,response重定向问题。中文乱码解决问题,设置响应字节(在服务器上上传一张照片)

一、 HttpServletResponse概述

我们在创建Servlet时会覆盖service()方法,或doGet()/doPost(),这些方法都有两个参数,一个为代表请求的request和代表响应response。
service方法中的response的类型是ServletResponse,而doGet/doPost方法的response的类型是HttpServletResponse,HttpServletResponse是ServletResponse的子接口,功能和方法更加强大。

二、 通过抓包工具抓取Http响应

在这里插入图片描述因为response代表响应,所以我们可以通过该对象分别设置Http响应的响应行响应头响应体

三、 通过response设置响应行

设置响应行的状态码

  • setStatus(int sc)
response.setStatus(329);

开发中用的不多,一般Tomcat会自动设置状态码。我们可以百度状态码,最常见的状态码

在这里插入图片描述

四、 通过response设置响应头

列出了常用设置HTTP响应头的方法,这些方法由HttpServletResponse 类提供其中,

  • addHeader(String name, String value) ——添加指定名称的响应头和string值
  • addIntHeader(String name, int value) ——添加指定名称的响应头和int值
  • addDateHeader(String name, long date) ——添加指定名称的响应头和日期值
  • setHeader(String name, String value) (重点)——使用指定名称和值设置响应头的名称和内容
  • setDateHeader(String name, long date) ——使用指定名称和值设置响应头的名称和内容
  • setIntHeader(String name, int value)——指定 int 类型的值到 name 标头

add以及set方法解析:

add表示添加,而set表示设置

案例一:

//设置响应头
Date date = new Date();
response.addHeader("name","张三");
//response.addIntHeader("age",28);
//response.addDateHeader("birthday",date.getTime());
response.setHeader("age","50");

重定向问题:设置状态码 设置响应头

步骤:

  • 设置状态码302
  • 设置响应头Location

理解:

  • 302 表示临时性重定向。访问一个url时,被重定向到另一个url上。
    常用于页面跳转。

  • 在响应头中加入Location参数。浏览器接受到带有location头的响应时,就会跳转到相应的地址。

案例二:

第一步:书写Servlet1

@WebServlet("/Servlet1")
public class Servlet1 extends HttpServlet {
    
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        doGet(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
         //没有响应 告知客户端去重定向到Servlet2
        //1.设置状态码302
        response.setStatus(302);
        //2.设置响应头Location
        response.setHeader("Location","/WEB14/Servlet2");
    }
}

第二步:书写重定向的Servlet2

@WebServlet("/Servlet2")
public class Servlet2 extends HttpServlet {
    
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        doGet(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
            response.getWriter().write("hhh");
    }
}

五、 通过response设置响应体

1.响应体设置文本

  • PrintWriter getWriter()
    获得字符流,通过字符流的write(String s)方法可以将字符串设置到response缓冲区中,随后Tomcat会将response缓冲区中的内容组装成Http响应返回给浏览器端。
    最常见的写法就是
response.getWriter().write("我是response!!");

2.关于设置中文的乱码问题

原因:response缓冲区的默认编码是iso8859-1,此码表中没有中文,可以通过response的setCharacterEncoding(String charset)设置response的编码

但我们发现客户端还是不能正常显示文字

原因:我们将response缓冲区的编码设置成UTF-8,但浏览器的默认编码是本地系统的编码,因为我们都是中文系统,所以客户端浏览器的默认编码是GBK,我们可以手动修改浏览器的编码是UTF-8。

我们还可以在代码中指定浏览器解析页面的编码方式,
通过response的setContentType(String type)方法指定页面解析时的编码是UTF-8:
一般写成:

response.setContentType("text/html;charset=UTF-8");

上面的代码不仅可以指定浏览器解析页面时的编码,同时也内含setCharacterEncoding的功能,所以在实际开发中只要编写:response.setContentType("text/html;charset=UTF-8");
就可以解决页面输出中文乱码问题。

案例一:

public class TextServlet extends HttpServlet {
    
    
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        doGet(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        //设置response查询的码表
        response.setCharacterEncoding("UTF-8");
        //通过一个头Content-Type 告知客户端使用何种码表进行解码     
        response.setHeader("ContentType","text/html;charset=UTF-8");
		//该方法与上面方法等价,开发中常用
		response.setContentType("text/html;charset=UTF-8");
        PrintWriter writer =  response.getWriter();
        writer.write("hello response!!");
        writer.write("中国");
    }

再次强调,开发中只要写response.setContentType("text/html;charset=UTF-8");即可解决乱码问题。如果不采用该方法,那么我们必须先设置response缓冲区以及设置浏览器的编码均为utf-8。

3.响应头设置字节

  • ServletOutputStream getOutputStream()
    获得字节流,通过该字节流的write(byte[] bytes)可以向response缓冲区中写入字节,在由Tomcat服务器将字节内容组成Http响应返回给浏览器。

这样讲很空,还是做一个在服务器上上传一张照片的小demo来体会字节。

案例:

@WebServlet("/ByteServlet")
public class ByteServlet extends HttpServlet {
    
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        doGet(request,response);
    }

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
//使用responce获得字节输出流
ServletOutputStream out=response.getOutputStream();
 //获得服务器上的图片
String RealPath = this.getServletContext().getRealPath("a.jpg");
InputStream in = new FileInputStream(RealPath);
        int len = 0;
        //字节数组,详细可以常看io流的内容
        byte [] buffer = new byte[1024];
        while ((len = in.read(buffer))>0){
    
    
            out.write(buffer,0,len);
        }
        in.close();
        out.close();
    }
}

六、 response细节点

  1. response获得的流不需要手动关闭,Tomcat容器会自动关闭
  2. getWriter()和getOutputStream不能同时调用

猜你喜欢

转载自blog.csdn.net/Mr_GYF/article/details/109155105
今日推荐