1.1 请求映射
1.1.1 概述
@RequestMapping
注解用于将请求映射到控制器方法上。它具有通过 URL、HTTP 方法、请求参数、头和媒体类型进行匹配的各种属性。它可以在类级使用来表示共享映射,或者在方法级使用,以缩小到特定的端点映射。@RequestMapping
还有一些基于特定 HTTP 方法的快捷方式变体,包括 @GetMapping
、@PostMapping
、@PutMapping
、@DeleteMapping
和 @PatchMapping
。但是在类级别仍需要 @RequestMapping
来表示共享映射。
1.1.2 示例
/**
* Created with IntelliJ IDEA.
*
* @author Demo_Null
* @date 2020/8/26
* @description 控制器
*/
@Controller
@RequestMapping("/demo")
public class DemoController {
@GetMapping("/get")
public void get() {
System.out.println("get~~~~");
}
@PostMapping("/post")
public void post() {
System.out.println("get~~~~");
}
}
1.2 请求参数
1.2.1 概述
我们在 Servlet 中是自动传入 HttpServletRequest 然后从 request 中获取请求参数。在 Spring Web MVC 中有更加强大的功能,参数可以是基本类型、POJO 类型、数组类型、集合类型,Spring Web MVC 会自动将前端传入的参数转换为对应类型。但是要注意前端传入的名称要与后端接收的名称一致才会自动映射匹配,并自动做类型转换。
1.2.2 字符串类型
/**
* Created with IntelliJ IDEA.
*
* @author Demo_Null
* @date 2020/8/26
* @description 字符串类型参数
*/
@Controller
@RequestMapping("/demo")
public class DemoController {
@GetMapping("/get")
public void get(String str) {
System.out.println(str);
}
}
1.2.3 POJO 类型
/**
* Created with IntelliJ IDEA.
*
* @author Demo_Null
* @date 2020/8/26
* @description POJO 类型参数
*/
@Controller
@RequestMapping("/demo")
public class DemoController {
@GetMapping("/get")
public void get(Student student) {
System.out.println(student);
}
}
哎?怎么没有将参数封装到 POJO 呢?这是因为 Spring Web MVC 会将与 POJO 成员变量同名的参数映射进去,但是我们传参是写的是 student.name 他会将其映射到 POJO 中 student 对象的成员变量 name 中,但是 POJO 中没有 student 所以映射失败。
1.2.4 数组类型
/**
* Created with IntelliJ IDEA.
*
* @author Demo_Null
* @date 2020/8/26
* @description 数组类型参数
*/
@Controller
@RequestMapping("/demo")
public class DemoController {
@GetMapping("/get")
public void get(String[] strs) {
System.out.println(Arrays.asList(strs));
}
}
1.2.5 集合类型
获得集合参数时,要么将集合参数包装到一个 POJO 中作为成员变量,用该 POJO 作为参数,然后取出集合;要么提交时,指定 contentType 为 json 形式,那么在方法参数位置使用 @RequestBody 可以直接接收集合数据而无需使用 POJO 进行包装。
/**
* Created with IntelliJ IDEA.
*
* @author Demo_Null
* @date 2020/8/26
* @description 集合类型参数
*/
@Controller
@RequestMapping("/demo")
public class DemoController {
@PostMapping("/post")
public void post(@RequestBody ArrayList<Student> students) {
System.out.println(students);
}
}
1.3 RESTful
1.3.1 概述
RESTful 是一种网络应用程序的设计风格和开发方式,基于 HTTP,可以使用 XML 格式定义或 JSON 格式定义。RESTful 适用于移动互联网厂商作为业务使能接口的场景,实现第三方 OTT 调用移动网络资源的功能,动作类型为新增、变更、删除所调用资源。
1.3.2 特点
♞ 每一个 URI 代表 1 种资源;
♞ 通过操作资源的表现形式来操作资源;
♞ 资源的表现形式是 XML 或者 HTML;
♞ 客户端与服务端之间的交互在请求之间是无状态的,从客户端到服务端的请求都必须包含理解请求所必需的信息。
♞ 客户端使用 GET、POST、PUT、DELETE 4 个表示操作方式的动词对服务端资源进行操作: GET 用来获取资源,POST 用来新建资源(也可以用于更新资源),PUT 用来更新资源,DELETE 用来删除资源;
1.3.3 示例
/**
* Created with IntelliJ IDEA.
*
* @author Demo_Null
* @date 2020/8/26
* @description RESTful
*/
@Controller
@RequestMapping("/demo")
public class DemoController {
@GetMapping("/get/{id}")
public void get(@PathVariable("id") String id) {}
@PostMapping("/post/{id}")
public void post(@PathVariable("id") String id) {}
@PutMapping("/put/{id}")
public void put(@PathVariable("id") String id) {}
@DeleteMapping("/del/{id}")
public void del(@PathVariable("id") String id) {}
}
1.4 其他
1.4.1 静态资源访问
当有静态资源需要加载时,比如 js 文件,通过谷歌开发者工具抓包发现,没有加载到 js 文件,原因是 Spring Web MVC 的前端控制器 DispatcherServlet 的 url-pattern 配置的是 /,代表对所有的资源都进行拦截操作,我们需要在 spring-mvc.xml 中通过配置指定放行静态资源。
<!-- 手动放行静态资源 -->
<mvc:resources mapping="/js/**" location="/js/" />
<mvc:resources mapping="/img/**" location="/img/ "/>
<!-- 交由 Spring Web MVC 处理 -->
<mvc:default-servlet-handler/>
1.4.2 乱码过滤器
当进行 POST 请求的时候,可能由于使用的字符编码不一样导致中文乱码,我们可以在 web.xml 中通过过滤器统一设置字符编码。
<!-- 配置全局过滤的 filter -->
<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>
1.4.3 自定义类型转换器
Spring Web MVC 默认已经提供了一些常用的类型转换器,例如客户端提交的字符串转换成 int 型进行参数设置。但是不是所有的数据类型都提供了转换器,没有提供的就需要自定义转换器,例如:日期类型的数据就需要自定义转换器。自定义类型转换器需要实现 Converter 接口并指定转换类型。
public class StringToDateConverter implements Converter<String, Date> {
public Date convert(String dateStr) {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
Date date = null;
try {
date = format.parse(dateStr);
} catch (ParseException e) {
e.printStackTrace();
}
return date;
}
}
<!-- 注册自定义类型转换器 -->
<bean id="conversionService"
class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="com.software.utils.StringToDateConverter"/>
</set>
</property>
</bean>