JAVAWEB-Response, problema de redireccionamiento de respuesta. Chino confuso para resolver el problema, configure el byte de respuesta (cargue una foto en el servidor)

1. Descripción general de HttpServletResponse

Cuando creamos un Servlet, service()anularemos los métodos, o doGet () / doPost (). Estos métodos tienen dos parámetros, uno es la solicitud que representa la solicitud y la respuesta que representa la respuesta. El tipo
del método de servicio responsees ServletResponse, y el tipo de respuesta del método doGet / doPost es HttpServletResponse. HttpServletResponse es una subinterfaz de ServletResponse con funciones y métodos más potentes.

2. Obtenga la respuesta Http a través de la herramienta de captura de paquetes

Inserte la descripción de la imagen aquíDebido a que la respuesta representa la respuesta, podemos establecer la respuesta Http a través de este objetoLínea de respuestaEncabezado de respuestaconCuerpo de respuesta

Tres, establezca la línea de respuesta a través de la respuesta

Establecer el código de estado de la línea de respuesta

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

No se usa mucho en desarrollo, generalmente Tomcat establecerá automáticamente el código de estado. Podemos código de estado de Baidu, el código de estado más común

Inserte la descripción de la imagen aquí

Cuatro, configure el encabezado de respuesta a través de la respuesta

Enumera los métodos más utilizados para configurar los encabezados de respuesta HTTP. Estos métodos los proporciona la clase HttpServletResponse.

  • addHeader(String name, String value) ——Añadir el encabezado de respuesta y el valor de cadena del nombre especificado
  • addIntHeader(String name, int value) ——Añadir el encabezado de la respuesta y el valor int del nombre especificado
  • addDateHeader(String name, long date) ——Añadir el encabezado de la respuesta y el valor de fecha del nombre especificado
  • setHeader(String name, String value) (重点)——Establezca el nombre y el contenido del encabezado de respuesta con el nombre y el valor especificados
  • setDateHeader(String name, long date) ——Utilice el nombre y el valor especificados para establecer el nombre y el contenido del encabezado de respuesta
  • setIntHeader(String name, int value)——Especifique el valor de tipo int en el encabezado del nombre

Análisis de métodos de agregar y configurar:

agregar significa agregar, y establecer significa establecer

Caso número uno:

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

Problema de redirección: establezca el código de estado y establezca el encabezado de respuesta

paso:

  • Establecer el código de estado 302
  • Establecer la ubicación del encabezado de respuesta

comprensión:

  • 302 significa redirección temporal. Cuando visita una URL, se le redirige a otra URL.
    A menudo se utiliza para saltos de página.

  • Agregue el parámetro Ubicación al encabezado de respuesta. Cuando el navegador recibe una respuesta con un encabezado de ubicación, saltará a la dirección correspondiente.

Caso 2:

El primer paso: escribir 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");
    }
}

Paso 2: escribir Servlet2 redirigido

@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");
    }
}

Cinco, establece el cuerpo de respuesta a través de la respuesta

1. Texto de la configuración del cuerpo de la respuesta

  • PrintWriter getWriter()
    Para obtener el flujo de caracteres, la cadena se puede establecer en el búfer de respuesta mediante el método de escritura (String s) del flujo de caracteres, y luego Tomcat ensamblará el contenido en el búfer de respuesta en una respuesta Http y la devolverá al navegador.
    La forma más común de escribir es
response.getWriter().write("我是response!!");

2. Respecto al problema de los caracteres chinos confusos

Motivo : la codificación predeterminada del búfer de respuesta esiso8859-1, No hay chino en esta tabla de códigos, puede setCharacterEncoding(String charset)configurar el código de respuesta a través de la respuesta

Pero descubrimos que el cliente todavía no puede mostrar el texto normalmente

Razón : configuramos la codificación del búfer de respuesta en UTF-8, pero la codificación predeterminada del navegador es la codificación del sistema local, porque todos somos sistemas chinos, así queLa codificación predeterminada del navegador del cliente es GBKPodemosModificación manualLa codificación del navegador es UTF-8.

También podemos especificar el método de codificación para que el navegador analice la página en el código, y especificar la codificación cuando
el response的setContentType(String type)método analiza la página para que sea UTF-8:
generalmente escrito como:

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

El código anterior no solo puede especificar la codificación cuando el navegador analiza la página, sino también setCharacterEncodinglas funciones que contiene ,Por lo que sólo escribimos en el desarrollo real: response.setContentType("text/html;charset=UTF-8");
podemos resolver el problema de los chinos ilegible página de salida.

Caso número uno:

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("中国");
    }

Una vez más, response.setContentType("text/html;charset=UTF-8");puede resolver el problema confuso simplemente escribiendo en el desarrollo . Si no se utiliza este método, primero debemos configurar el búfer de respuesta y configurar la codificación del navegador en utf-8.

3. Byte de configuración del encabezado de respuesta

  • ServletOutputStream getOutputStream()
    Obtenga el flujo de bytes, a través de la escritura (byte [] bytes) del flujo de bytes, los bytes se pueden escribir en el búfer de respuesta y el servidor Tomcat devolverá el contenido de bytes al navegador como una respuesta Http.

Esto está muy vacío, hagamos una pequeña demostración de subir una foto al servidor para entender los bytes.

Caso:

@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();
    }
}

Seis, detalles de la respuesta

  1. La secuencia obtenida por respuesta no necesita cerrarse manualmente, el contenedor Tomcat se cerrará automáticamente
  2. getWriter () y getOutputStream no se pueden llamar al mismo tiempo

Supongo que te gusta

Origin blog.csdn.net/Mr_GYF/article/details/109155105
Recomendado
Clasificación