Cuando el servidor web recibe la solicitud http del cliente, creará un objeto de solicitud que representa la solicitud y un objeto de respuesta que representa la respuesta para cada solicitud. Dado que los objetos de solicitud y respuesta representan solicitudes y respuestas, si queremos obtener los datos enviados por el cliente, solo necesitamos encontrar el objeto de solicitud. Para enviar datos al cliente, simplemente busque el objeto de respuesta.
Copie el código de código de la siguiente manera:
paquete com.yyz.response;
importar java.io.IOException;
importar java.io.OutputStream;
importar javax.servlet.ServletException;
importar javax.servlet.http.HttpServlet;
importar javax.servlet.http.HttpServletRequest;
importar javax.servlet.http.HttpServletResponse;
//Problema con la salida de chino
clase pública ResponseDemo extiende HttpServlet {
public void doGet (solicitud HttpServletRequest, respuesta HttpServletResponse)
lanza ServletException, IOException {
Datos de cadena = "China";
OutputStream fuera = respuesta.getOutputStream();
out.write(data.getBytes());
/**
* out.write(data.getBytes()); Este código implica verificar la tabla de códigos dos veces.
* Cuando "China" cambie de datos de caracteres a datos de bytes, se consultará la tabla de códigos gb2312.
* Cuando los datos se envían al navegador para su visualización, es necesario volver a consultar la tabla de códigos. La tabla de códigos consultada en este momento está relacionada con la configuración del navegador.
*/
}
public void doPost (solicitud HttpServletRequest, respuesta HttpServletResponse)
lanza ServletException, IOException {
doGet(solicitud,respuesta);
}
}
Resultados de la prueba cuando la codificación del navegador está configurada en GB2312:
Resultados de la prueba cuando la codificación del navegador está configurada en UTF-8:
Para que nuestro sitio web sea accesible para usuarios extranjeros, cuando convertimos datos de caracteres en datos de bytes, debemos especificar la tabla de códigos de conversión como UTF-8. Pero en este momento, si se abre el navegador con GB2312, volverán a aparecer caracteres confusos. Aunque este problema de código confuso se puede resolver cambiando la configuración del navegador, no contribuye a mejorar la experiencia del usuario. Por lo tanto, necesitamos utilizar un programa para indicarle al navegador qué tabla de códigos consultar para mostrar los datos.
Copie el código de código de la siguiente manera:
paquete com.yyz.response;
importar java.io.IOException;
importar java.io.OutputStream;
importar javax.servlet.ServletException;
importar javax.servlet.http.HttpServlet;
importar javax.servlet.http.HttpServletRequest;
importar javax.servlet.http.HttpServletResponse;
//Problema con la salida de chino
clase pública ResponseDemo extiende HttpServlet {
public void doGet (solicitud HttpServletRequest, respuesta HttpServletResponse)
lanza ServletException, IOException {
// En el lado del servidor, desde qué tabla de códigos se generan los datos, entonces es necesario controlar con qué tabla de códigos se abre el navegador.
Datos de cadena = "China";
respuesta.setHeader("tipo de contenido", "text/html;charset=UTF-8");
OutputStream fuera = respuesta.getOutputStream();
out.write(data.getBytes("UTF-8"));
}
public void doPost (solicitud HttpServletRequest, respuesta HttpServletResponse)
lanza ServletException, IOException {
doGet(solicitud,respuesta);
}
}
Aprende un truco más:
Utilice la etiqueta <meta> en lenguaje HTML para controlar el comportamiento del navegador.
<meta http-equiv="tipo de contenido'' content=''text/html;charset=UTF-8">
http-equiv simula el encabezado de respuesta HTTP y le indica al navegador que lo abra en la tabla de códigos UTF-8. Los encabezados de respuesta reales tienen prioridad sobre los encabezados de respuesta simulados con http-equiv.
En el desarrollo real, el servidor debería utilizar secuencias de caracteres para escribir datos de texto en el navegador. Sin embargo, la tabla de códigos predeterminada del flujo de caracteres obtenido a través del método de respuesta getWriter es ISO8859-1. No hay codificación china correspondiente en esta tabla de códigos, por lo que ¿se cambiará? La codificación correspondiente se envía al navegador y, cuando se abre, el navegador está lleno de signos de interrogación. La tabla de códigos consultada por el servidor al enviar datos se puede modificar mediante setCharacterEncoding de respuesta.
Copie el código de código de la siguiente manera:
paquete com.yyz.response;
importar java.io.IOException;
importar java.io.PrintWriter;
importar javax.servlet.ServletException;
importar javax.servlet.http.HttpServlet;
importar javax.servlet.http.HttpServletRequest;
importar javax.servlet.http.HttpServletResponse;
//Problema con la salida de chino
clase pública ResponseDemo extiende HttpServlet {
public void doGet (solicitud HttpServletRequest, respuesta HttpServletResponse)
lanza ServletException, IOException {
// En el lado del servidor, desde qué tabla de códigos se generan los datos, entonces es necesario controlar con qué tabla de códigos se abre el navegador.
Datos de cadena = "China";
respuesta.setHeader("tipo de contenido", "text/html;charset=UTF-8");
respuesta.setCharacterEncoding("UTF-8");
PrintWriter fuera = respuesta.getWriter();
out.write(datos);
}
public void doPost (solicitud HttpServletRequest, respuesta HttpServletResponse)
lanza ServletException, IOException {
doGet(solicitud,respuesta);
}
}
Hay algunos pequeños detalles a tener en cuenta aquí:
1. Response.setCharacterEncoding ("UTF-8"); debe escribirse delante de PrintWriter out = Response.getWriter();. Es inútil configurar la codificación después de obtener el flujo de caracteres.
2. Response.setHeader("content-type", "text/html;charset=UTF-8"); Hay una forma más sencilla de escribir Response.setContentType("text/html;charset=UTF-8");
3.response.setContentType("text/html;charset=UTF-8"); Este código en realidad tiene dos funciones: notificar la respuesta a la salida en UTF-8 y que el navegador se abra en UTF-8. Eso es equivalente a respuesta.setHeader("content-type", "text/html;charset=UTF-8"); y Response.setCharacterEncoding("UTF-8");.
4. A través de la lectura anterior, los lectores deberían poder comprender por qué la salida de Response.getOutputStream.write(1) en el navegador no es 1; Debido a que el navegador es un editor de texto, después de recibir los datos, será necesario 1 para buscar la tabla de códigos y luego mostrar los caracteres correspondientes. Si desea generar números en el navegador, debe convertir los números en cadenas, respuesta.getOutputStream.write((1+"").getBytes());.
Utilice OutputStream (flujo de bytes) para enviar datos:
1. Response.getOutputStream().write("China".getBytes());//Enviar datos en codificación predeterminada
2. Response.getOutputStream().write("China".getBytes("UTF-8"));// Envíe datos en codificación UTF-8, el navegador (GB2312 predeterminado) aparecerá confuso
Solución:
2.1 Cambiando el método de codificación del navegador: IE/"Ver"/"Codificación"/"UTF-8" (no recomendable)
2.2 Informar al cliente sobre el método de codificación configurando el encabezado de respuesta: respuesta.setHeader("Content-type", "text/html;charset=UTF-8");// Informar al navegador sobre el tipo de datos y la codificación
2.3 Simular encabezados de solicitud a través de metaetiquetas: out.write("<meta http-equiv='Content-Type' content='text/html; charset=utf-8' />".getBytes());
2.4 A través del siguiente método: respuesta.setContentType("text/html;charset=UTF-8");