El rol de la clase HttpServletResponse:
La clase HttpServletResponse es la misma que la clase HttpServletRequest. Cada vez que ingresa una solicitud, el servidor Tomcat creará un objeto Response y lo pasará al programa Servlet para que lo use. HttpServletRequest representa la información solicitada, HttpServletResponse representa toda la información de respuesta, si necesitamos configurar la información devuelta al cliente, podemos configurarla a través del objeto HttpServletResponse
Descripción de los dos flujos de salida:
Flujo de bytes | getOutputStream (); | A menudo se usa para descargar (transferir datos binarios) |
---|---|---|
Flujo de caracteres | getWriter (); | A menudo se usa para devolver cadenas (de uso común) |
Solo se puede utilizar una de las dos corrientes al mismo tiempo.
Si se usa el flujo de bytes, el flujo de caracteres ya no se puede usar y viceversa; de lo contrario, se informará un error.
public class ResponseIOServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter();
resp.getOutputStream();
}
}
Cómo enviar datos al cliente:
Requisito: envíe los datos de la cadena al cliente.
public class ResponseIOServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// resp.getWriter();
// resp.getOutputStream();
// 要求:往客户端回传字符串数据。
PrintWriter writer = resp.getWriter(); //快捷键:alt + enter
writer.write("response's content!!!");
}
}
Para resolver la respuesta confusa:
public class ResponseIOServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// resp.getWriter();
// resp.getOutputStream();
// 要求:往客户端回传字符串数据。
PrintWriter writer = resp.getWriter(); //快捷键:alt + enter
// writer.write("response's content!!!");
writer.write("旭哥好帅");
}
}
Si la escritura está en chino, habrá problemas confusos.
Eche un vistazo al conjunto de caracteres correspondiente:
//获取响应的字符集
System.out.println(resp.getCharacterEncoding()); //默认ISO-8859-1
Podemos configurar el juego de caracteres del servidor:
//设置服务器字符集为UTF-8
resp.setCharacterEncoding("UTF-8");
En este momento, el problema aún no está resuelto, debido a que el navegador no sabe qué juego de caracteres usa el servidor, también necesitamos configurar el juego de caracteres del navegador.
El navegador usa GBK por defecto
Podemos configurar el navegador para que también use el juego de caracteres UTF-8 a través del encabezado de respuesta
//通过响应头,设置浏览器也使用UTF-8字符集
resp.setHeader("Content-Type","text/html; charset=UTF-8");
Código completo:
// 第一种方法
//设置服务器字符集为UTF-8
resp.setCharacterEncoding("UTF-8");
//通过响应头,设置浏览器也使用UTF-8字符集
resp.setHeader("Content-Type","text/html; charset=UTF-8");
Hay una forma más sencilla:
// 第二种方法
// 他会同时设置服务器和客户端都是用UTF-8字符集,还设置了响应头
// 注意:此方法一定要在获取流对象之前才有效
resp.setContentType("text/html; charset=UTF-8");
System.out.println(resp.getCharacterEncoding());
Solicitar redirección:
Solicitar redirección significa que el cliente envía una solicitud al servidor, y luego el servidor le dice al cliente que le daré algunas direcciones y usted va a una nueva dirección para visitar, que se llama solicitud de redirección (porque la dirección anterior puede haber sido abandonado).
public class Response1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("曾到此地一游 Response1");
//设置响应状态码302,表示重定向(已搬迁)
resp.setStatus(302);
resp.setHeader("Location","Http://localhost:8080/07_servlet/response2");
}
}
public class Response2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().write("response2's result!");
}
}
Características de la redirección de solicitudes:
- La barra de direcciones del navegador cambiará
http://localhost:8080/07_servlet/response1
变成了 ==>
http://localhost:8080/07_servlet/response2
- Dos solicitudes
-
No comparta datos en el campo Solicitud
Motivo: Tomcat analiza los datos solicitados cada vez que recibe una solicitud y los encapsula en un objeto de solicitud.
-
No se puede acceder a los recursos en WEB-INF
Ponga un form.html en el directorio WEB-INF
public class Response1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("曾到此地一游 Response1");
req.setAttribute("key1","value1");
//设置响应状态码302,表示重定向(已搬迁)
resp.setStatus(302);
// resp.setHeader("Location","Http://localhost:8080/07_servlet/response2");
resp.setHeader("Location","Http://localhost:8080/07_servlet/WEB-INF/form.html");
}
}
访问 http: // localhost: 8080 / 07_servlet / response1 :
Razón:
La segunda solicitud aún envía la solicitud desde el navegador al servidor, pero el directorio WEB-INF está protegido y el navegador no puede acceder directamente a él.
- Puede acceder a recursos fuera del proyecto.
resp.setHeader("Location","Http://www.baidu.com");
Se puede acceder normalmente:
El segundo método de redirección de solicitudes: (recomendado)
//请求重定向的第二种方法:
resp.sendRedirect("http://localhost:8080");
`
resp.setHeader("Location","Http://www.baidu.com");