[Servlet] Solicitud de análisis

 contenido

 reenvío de solicitudes

 Características del reenvío de solicitudes

etiqueta básica

El caso en el que el programa de demostración no puede retroceder

resultado de la operación:

Análisis en su lugar: 

Rutas relativas y absolutas en la web

camino relativo:

camino absoluto:

Diferentes significados de / barras en la web

Clase HttpServletResponse

El rol de la clase HttpServletResponse

Descripción de los dos flujos de salida

Enviar datos de vuelta al cliente

 Problema ilegible chino

La primera forma:

La segunda manera:

La tercera forma:

solicitar redirección

 la primera forma

 Características de la redirección de solicitudes

la segunda manera


 reenvío de solicitudes

El reenvío de solicitudes se refiere a la operación de saltar de un recurso a otro recurso, lo que se denomina reenvío de solicitudes

Crear dos clases servlet1 y servlet2 heredando HttpServlet

Bajo la clase Servlet1:

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class Servlet1 extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取请求的参数(办事的材料)查看
        String username=request.getParameter("username");
        System.out.println("在Servlet1(柜台1)查看参数(材料)"+username);
        //设置域数据(给材料盖个章,并传递到Servlet2(柜台2)中去查看)
        request.setAttribute("key1", "柜台1的章");
        //问路:Servlet2怎么走
        /**
         * 请求转发必须要以斜杆/开头,/ 斜杆表示地址为http://ip:port/工程名/   映射到idea中是web目录
         */
        RequestDispatcher requestDispatcher = request.getRequestDispatcher("/servlet2");

        //走向Servlet2(柜台2)
        requestDispatcher.forward(request, response);

    }
}

Bajo la clase servlet2:

public class Servlet2 extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取请求的参数(办事的材料)查看
        String username=request.getParameter("username");
        System.out.println("在Servlet2(柜台2)查看参数(材料)"+username);
        //查看柜台1是否有盖章
        Object key1 = request.getAttribute("key1");
        System.out.println("柜台1是否有章:"+key1);
        //处理自己的业务
        System.out.println("Servlet2处理自己的业务");
    }
}

Ejecute el acceso http://localhost:8080/03_servlet/servlet1

resultado de la operación:

 ¿Agregar parámetros a la barra de acceso? Todos los parámetros siguen

 Entra para obtener:

 Características del reenvío de solicitudes

1. La barra de direcciones del navegador no ha cambiado (siempre ha sido el nombre del proyecto/servlet1)

2. Intentan la petición

3. Los datos en el campo Solicitud se pueden compartir (se puede acceder a los datos del campo durante todo el proyecto)

4. Se puede reenviar al directorio WEB-INF (WEB-INF está protegido por el servidor y no se puede acceder directamente a través del cliente (navegador), pero se puede acceder indirectamente a través de los recursos del servidor)

5. No puede acceder a recursos fuera del proyecto (porque lo encontró desde el proyecto y no puede acceder a los recursos que no están bajo el proyecto)

 en la clase Servlet1

Acceso a la dirección:

   RequestDispatcher requestDispatcher = request.getRequestDispatcher("/WEB-INF/form.html");

etiqueta básica

El caso en el que el programa de demostración no puede retroceder

Cree una clase ForwardC que herede la clase HttpServlet


public class ForwardC extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("经过了Forward程序");
        req.getRequestDispatcher("/a/b/c.html").forward(req, resp);
    }
}

 Configurar en web.xml

  <servlet>
        <servlet-name>ForwardC</servlet-name>
        <servlet-class>com.servlet.ForwardC</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>ForwardC</servlet-name>
        <url-pattern>/forwardC</url-pattern>
    </servlet-mapping>

Crear en el directorio web como se muestra

 escribir en el directorio c

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>这是一个c页面</title>
  
</head>
<body>
<a href="../../index.html">返回首页</a>
</body>
</html>

Escribir bajo index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
这是web下的index.html<br>
<a href="a/b/c.html">a/b/c.html</a><br>
<a href="http://localhost:8080/03_servlet/forwardC">请求转发:a/b/c.html</a>
</body>
</html>

Despues de correr:

También dijimos anteriormente que solo el nombre del proyecto se escribe para acceder a la página de índice de forma predeterminada.

 Descubrimos que hacer clic tanto hacia arriba como hacia abajo puede saltar con éxito

 Aunque todos saltaron con éxito, la dirección obviamente es diferente, porque escribimos ../../index.html debajo de c.html,

resultado de la operación:

Análisis en su lugar: 

El primero (el primero) , localhost:8080/03_servlet/a/b/c.html, puede ir al proyecto web después del salto ../../ Sucede que hay index.html debajo de la web, por lo que el salto será un éxito.

El último (el segundo), localhost:8080/03_servlet/forwardC, saltará al directorio src después del salto ../../, y obviamente no hay una página index.html en el directorio src, por lo que fallará. (La estructura es: src/com/servlet/Forward)

Icono: 

 Cuando agregamos la etiqueta base, el navegador usará la etiqueta base como la dirección final.

La etiqueta base generalmente se agrega debajo del título

  <base href="http://localhost:8080/03_servlet/a/b/c.html">
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>这是一个c页面</title>
   <base href="http://localhost:8080/03_servlet/a/b/c.html">
</head>
<body>
<a href="../../index.html">返回首页</a>
</body>
</html>

Esto resuelve el problema de que este último no se puede transferir a la página de inicio. 

Rutas relativas y absolutas en la web

En javaWeb, las rutas se dividen en rutas relativas y rutas absolutas:

camino relativo:

.representa                       el directorio actual

..representa                      el directorio principal

El nombre del recurso             indica el directorio actual/nombre del recurso

camino absoluto:

http://ip:puerto/ruta del proyecto/ruta del recurso

Diferentes significados de / barras en la web

En la web / slash es una ruta absoluta.

/ Si el navegador analiza la barra inclinada, la dirección resultante es: http://ip:port/

                <a href="/">El significado de las barras</a>

/ Si el servidor analiza la barra inclinada, la dirección resultante es: http://ip:puerto/ruta del proyecto

           1、<patrón-url>/servlet1<patrón-url>

           2、ServletContext.getRealPath("/");

           3, solicitud.getRequestDispatcher("/")

Caso especial: response.sendRediect("/"); Envía la barra inclinada al navegador para analizar y obtener http://ip:port/

Clase HttpServletResponse

El rol de la clase HttpServletResponse

        La clase HttpServletResponse es la misma que la clase HttpServRequest. Cada vez que entra una solicitud, el servidor Tomcat creará un objeto de Respuesta y lo pasará al programa servlet para su uso. HttpServletRequest representa la información entrante, y HttpServletResponse representa toda la información de respuesta. Si necesitamos configurar la información devuelta al cliente , podemos configurarlo a través del objeto HttpServletResponse.

Descripción de los dos flujos de salida

Flujo de bytes getOutputStream(); comúnmente usado para descargar (pasar datos binarios)

Flujo de caracteres getWriter(); A menudo se usa para devolver cadenas (comúnmente usado)

Solo se puede usar uno de los dos flujos a la vez. De lo contrario informar de un error

Enviar datos de vuelta al cliente

Cree una clase ResponIOSServlet:


import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

public class ResponseIOServlet extends HttpServlet {

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

configuración web.xml, después de ejecutar:

 Problema ilegible chino

Configurar response.setCharacterEncoding("GBK"); puede resolver el problema de los caracteres chinos que muestran caracteres ilegibles en el navegador

La primera forma:

public class ResponseIOServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println(response.getCharacterEncoding());//默认是字符集是ISO-8859-1,不支持中文
      //设置字符集为GBK
       response.setCharacterEncoding("GBK");
        PrintWriter writer=response.getWriter();
        writer.write("爱情睡醒了");
    }

La segunda manera:

public class ResponseIOServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println(response.getCharacterEncoding());//默认是字符集是ISO-8859-1,不支持中文
     
       //设置字符集为UTF—8
        response.setCharacterEncoding("UTF-8");
        //告诉浏览器也设置UTF-8即可
        response.setHeader("Content-Type", "text/html;charset=UTF-8");
        PrintWriter writer=response.getWriter();
        writer.write("爱情睡醒了");
    }
}

La tercera forma:

public class ResponseIOServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println(response.getCharacterEncoding());//默认是字符集是ISO-8859-1,不支持中文
//一定得在获取流对象前使用,否则无效
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter writer=response.getWriter();
        writer.write("爱情睡醒了");
    }
}

solicitar redirección

 la primera forma

Crear dos clases respuesta1 y respuesta2

respuesta1

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class Response1 extends HttpServlet{
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置响应状态码302,表示重定向(已搬迁到新处)
        resp.setStatus(302);
        //设置响应头,说明新地址在哪
        resp.setHeader("Location","http://localhost:8080/03_servlet/response2");
    }
}

respuesta2


import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class Response2 extends HttpServlet{
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       resp.getWriter().write("hello response2");
    }
}

Configure la ruta de acceso en la configuración web.xml

    <servlet>
        <servlet-name>Response1</servlet-name>
        <servlet-class>com.servlet.Response1</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>Response1</servlet-name>
        <url-pattern>/response1</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>Response2</servlet-name>
        <servlet-class>com.servlet.Response2</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>Response2</servlet-name>
        <url-pattern>/response2</url-pattern>
    </servlet-mapping>

resultado de la operación:

 Características de la redirección de solicitudes

1. La barra de direcciones del navegador cambiará

2. Hay dos solicitudes (la primera es la dirección anterior y la segunda es para trasladarse a la nueva dirección)

3. Los datos en el campo Solicitud no se pueden compartir (porque Tomcat encapsulará cada solicitud en un objeto y las dos solicitudes son objetos diferentes)

4. No se puede acceder a los recursos bajo WEB-INF (porque también es una solicitud enviada por el navegador, el navegador no puede acceder directamente a WEB-INF)

5. Puede acceder a recursos fuera del proyecto, como www.baidu.com

la segunda manera

public class Response1 extends HttpServlet{
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        //第二种方法(括号内直接设置新的访问地址)
        resp.sendRedirect("http://www.baidu.com");
    }
}

Supongo que te gusta

Origin blog.csdn.net/weixin_60719453/article/details/122807412
Recomendado
Clasificación