[SpringMVC] Solicitud correspondiente para obtener parámetros de solicitud + solución a problemas relacionados

2. Solicitud


 

1.1 4 tipos de parámetros de solicitud

El formato del parámetro de solicitud del lado del servicio al cliente es:...?username=Alice&age=12...

Cuando el marco SpringMVC recibe parámetros de solicitud, también puede encapsularlos: ①Tipo básico ②Tipo POJO ③Tipo de matriz ④Tipo de colección

 

1.2 Obtención de parámetros de solicitud: tipos básicos

Coincidencia automática basada en el nombre. Y puede escribir conversión automáticamente (String ->?)

@RequestMapping("/test1")
@ResponseBody
public void test10(String username, int age) throws IOException {
    
    
    System.out.println(username);
    System.out.println(age);
    // http://localhost:8080/test1?username=Alice&age=12
}

 

1.3 Obtención de parámetros de solicitud-tipo POJO

¡También se puede hacer coincidir automáticamente en función del nombre!

@RequestMapping("/test2")
@ResponseBody
public void test11(User user) throws IOException {
    
    
    System.out.println(user);
    // http://localhost:8080/test2?username=Alice&age=12
}

 

1.5 Obtener el tipo de matriz de parámetros de solicitud

Aún coincidencia automática.

@RequestMapping("/test3")
@ResponseBody
public void test3(String[] lolis) throws IOException {
    
    
    System.out.println(Arrays.toString(arr));
    // http://localhost:8080/test3?lolis=Alice&lolis=Cocoa&lolis=Hana
}

 

1.6 Obtener tipo de colección de parámetros de solicitud

Tenga en cuenta que no puede hacer coincidir automáticamente el nombre del parámetro de solicitud directamente aquí, pero debe usar el tipo POJO para realizar la transición.

¡Dificultades! ! ! ¡Descubre cómo hacer la transición y corresponder ! ! !

domain.VO过渡类 ----------------------------------------------------------------------------

public class VO {
    
    

    private List<User> userList;

    // generate...
}
<!-- form.jsp页面 -- 简单的get方式不好模拟请求参数,因此使用表格post方式模拟请求参数 -->
<html>
<head>
    <title>Title</title>
</head>
<body>
    <form action="${pageContext.request.contextPath}/test4" method="post">
        <input type="text" name="userList[0].username" />
        <input type="text" name="userList[0].age" />
        <br />
        <input type="text" name="userList[1].username" />
        <input type="text" name="userList[1].age" />
        <br />
        <input type="text" name="userList[2].username" />
        <input type="text" name="userList[2].age" />
        <br />
        <input type="submit" value="提交">
    </form>
</body>
</html>
@RequestMapping("/test4")
@ResponseBody
public void test4(VO vo) throws IOException {
    
    
    System.out.println(vo);
    // http://localhost:8080/form.jsp
}

 

1.7 Obtener el tipo de colección de parámetros de solicitud (caso especial: parámetros de solicitud Ajax json)

Cuando la solicitud es enviada por Ajax y contentType está en formato json, se puede obtener directamente con el tipo de colección anotado con @RequestBody .

<!-- ajax.jsp页面 -->
<html>
<head>
    <title>Title</title>
    <script src="${pageContext.request.contextPath}/js/jquery-3.3.1.js" />
    <script>
        var userList = new Array();
        userList.push({
     
     username:"Alice",age:12});
        userList.push({
     
     username:"Hana",age:10});
        $.ajax({
     
     
            type:"POST",
            url:"${pageContext.request.contextPath}/test5",
            data:JSON.stringify(userList),
            contentType:"application/json;charset=utf-8"
        });
    </script>
</head>
<body>

</body>
</html>
@RequestMapping("/test5")
@ResponseBody
public void test5(@RequestBody List<User> userList) throws IOException {
    
    
    System.out.println(userList);
    // http://localhost:8080/ajax.jsp
}

 
 
 
 

2.1 El problema de no poder encontrar recursos que permitan el acceso a recursos estáticos

Cuando visitamos como /js/jquery-3.3.1.jso en el marco SpringMVC /img/pic1.jpg, muestra que no se puede encontrar el directorio o recurso .

Esto se debe a que cuando configuramos el núcleo de todo el marco, el controlador frontal DispatcherServlet, escribimos esto:

<servlet>
     <servlet-name>DispatcherServlet</servlet-name>
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
	 <!-- ... -->
</servlet>
<servlet-mapping>
     <servlet-name>DispatcherServlet</servlet-name>
     <url-pattern>/</url-pattern>
</servlet-mapping>

Tenga en cuenta <url-pattern>/</url-pattern>el significado de esta oración : todos los recursos (recursos dinámicos / recursos estáticos) serán interceptados por DispatcherServlet.

Por tanto, lo que tenemos que hacer es "liberar" estos recursos estáticos. En otras palabras, abra sus derechos de acceso.

En spring-mvc.xml, existen los dos métodos de configuración siguientes:

<!-- 1.开放静态资源的访问权限 -->
<mvc:resources mapping="/js/**" location="/js/" />
<mvc:resources mapping="/img/**" location="/img/" />

<!-- 2.访问静态资源的工作交给Tomcat -->
<mvc:default-servlet-handler />

 
 

2.2 Problema confuso de datos chinos-filtro utf-8 global

Los datos de solicitud chinos en el modo POST provocarán caracteres confusos. Usamos un filtro global para solucionarlo.

<!-- 配置全局过滤器,解决中文乱码问题 -->
<filter>
    <filter-name>CharacterEncodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>utf-8</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

 
 

2.5 Anotación de vinculación de nombres de parámetros incoherente @RequestParam

El nombre del parámetro solicitado puede no coincidir con el nombre del parámetro recibido. En este momento, debe vincular estos dos nombres diferentes con la ayuda de la anotación @RequestParam .

@RequestMapping("/test6")
@ResponseBody
public void test6(@RequestParam("name") String username) throws IOException {
    
    
    System.out.println(username);
    // http://localhost:8080/test6?name=Alice
}

Esta anotación es muy poderosa:

-------------------------------------------------------------------------------------------
注解@RequestParam还可以配置的参数:
	- value: 请求参数的名称
	- required: 请求是否必须包含该参数(默认true)
	- defaultValue: 当请求不包含该参数时,则使用的默认值

-------------------------------------------------------------------------------------------

@RequestMapping("/test7")
    @ResponseBody
    public void test7(@RequestParam(value = "name", required = false, defaultValue = "Alice") String username) throws IOException {
    
    
        System.out.println(username);
        // http://localhost:8080/test7
    }

 
 

2.3 La dirección URL es la anotación de marcador de posición de problema de parámetro @PathVariable

Las solicitudes de estilo relajante usan "URL + método de solicitud (GET / POST / PUT / DELETE)" para indicar un propósito.

Y el parámetro de solicitud ya no ?key=valuesigue la cola de la URL en el formato de, sino como parte de la dirección URL (por ejemplo http://localhost:8080/test/Alice).

Por lo tanto, al obtener los parámetros de solicitud, se necesitan marcadores de posición y anotaciones @PathVariable .

@RequestMapping("/test8/{username}")
@ResponseBody
public void test8(@PathVariable("username") String username) throws IOException {
    
    
    System.out.println(username);
    // http://localhost:8080/test8/Alice
}

 
 

2.4 Problema de formato de fecha-fábrica de conversión de tipo personalizado

SpringMVC proporciona un convertidor de tipo predeterminado cuando usamos para intser recibido String.

Sin embargo, el formato de fecha difiere mucho de un país a otro. SpringMVC puede convertir yyyy/MM/dduna cadena en un tipo de fecha, pero yyyy-MM-ddno puede hacer nada con esa cadena.

Podemos escribir un convertidor de tipos que herede la interfaz Converter <S, T> a mano y agregarlo a la fábrica de conversión de tipos.

① Convertidor de tipo personalizado (converter.DateConverter.class)

public class DateConverter implements Converter<String, Date> {
    
    

    // 实现接口内部的convert方法
    public Date convert(String s) {
    
    
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        Date date = null;
        try {
    
    
            date = format.parse(s);
        } catch (ParseException e) {
    
    
            e.printStackTrace();
        }
        return date;
    }
}

② Haga declaraciones relevantes en el archivo de configuración (spring-mvc.xml)

<!-- 将自定义的转换器加到转换器工厂当中 -->
<bean id="conversionServiceFactoryBean" class="org.springframework.context.support.ConversionServiceFactoryBean">
    <property name="converters">
        <list>
            <bean class="com.samarua.converter.DateConverter" />
        </list>
    </property>
</bean>

<!-- 在配置注解驱动时声明转换器工厂 -->
<mvc:annotation-driven conversion-service="conversionServiceFactoryBean" />

③ Prueba

@RequestMapping("/test9")
@ResponseBody
public void test9(Date date) throws IOException {
    
    
    System.out.println(date);
    // http://localhost:8080/test9?data=2022-12-12
}

 
 

2.5 Problemas de la API nativa escritos en los parámetros del método para la inyección automática

Esta pregunta se ha mencionado anteriormente: en el entorno del marco SpringMVC, si desea utilizar la API nativa de WebServlet, puede escribir estos objetos nativos en los parámetros del método, y el llamador (es decir, el marco) lo inyectará automáticamente, por lo que podemos Úselo con confianza.

@RequestMapping("/test10")
@ResponseBody
public void test10(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws IOException {
    
    
    System.out.println(request);
    System.out.println(response);
    System.out.println(session);
}

 
 
 
 

3. Obtén el encabezado de la solicitud

Todo el contenido anterior es para obtener la información de la línea de solicitud . A continuación, intentamos obtener la información del encabezado de la solicitud .

En primer lugar, está claro que el formato de la línea de solicitud es [método de solicitud, URL de solicitud, protocolo de solicitud / versión], y el formato del encabezado de solicitud es [par clave-valor] (consulte la figura siguiente).

Inserte la descripción de la imagen aquí

Para obtener la información de cualquier par clave-valor en el encabezado de la solicitud, use la anotación @RequestHeader :

@RequestMapping("/test11")
@ResponseBody
public void test11(@RequestHeader(value = "User-Agent") String userAgent) throws IOException {
    
    
    System.out.println(userAgent);
}

En casos especiales, obtenga directamente la información de cualquier par clave-valor en la Cookie en el encabezado de la solicitud y use la anotación @CookieValue :

@RequestMapping("/test12")
@ResponseBody
public void test12(@CookieValue(value = "JSESSIONID") String JSESSIONID) throws IOException {
    
    
    System.out.println(JSESSIONID);
}

 
 
 
 

 
 
 
 

 
 
 
 

Más> _ <

Supongo que te gusta

Origin blog.csdn.net/m0_46202073/article/details/114321204
Recomendado
Clasificación