2. Solicitud
Directorio de artículos
- 2. Solicitud
-
- 1.1 4 tipos de parámetros de solicitud
- 1.2 Obtención de parámetros de solicitud: tipos básicos
- 1.3 Obtención de parámetros de solicitud-tipo POJO
- 1.5 Obtener el tipo de matriz de parámetros de solicitud
- 1.6 Obtener tipo de colección de parámetros de solicitud
- 1.7 Obtener el tipo de colección de parámetros de solicitud (caso especial: parámetros de solicitud Ajax json)
- 2.1 El problema de no poder encontrar recursos que permitan el acceso a recursos estáticos
- 2.2 Problema confuso de datos chinos-filtro utf-8 global
- 2.5 Anotación de vinculación de nombres de parámetros incoherente @RequestParam
- 2.3 La dirección URL es la anotación de marcador de posición de problema de parámetro @PathVariable
- 2.4 Problema de formato de fecha-fábrica de conversión de tipo personalizado
- 2.5 Problemas de la API nativa escritos en los parámetros del método para la inyección automática
- 3. Obtén el encabezado de la 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.js
o 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=value
sigue 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 int
ser recibido String
.
Sin embargo, el formato de fecha difiere mucho de un país a otro. SpringMVC puede convertir yyyy/MM/dd
una cadena en un tipo de fecha, pero yyyy-MM-dd
no 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).
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);
}