项目结构:

controller包中是控制层代码:
- @Controller
- public class UserController {
- @RequestMapping("/save") //设置当前控制器方法请求访问路径
- @ResponseBody //设置返回值为响应内容
- public String save(){
- System.out.println("save running...");
- return "{'module':'springmvc'}";
- }
- }
config包中是SpringMVC的配置类,扫描SpringMVC容器注入的Bean。
- @Configuration
- @ComponentScan("controller")
- public class SpringMvcConfig {
- }
核心是一个Servlet容器配置类,该类可以继承自AbstractDispatcherServletInitializer类:
- public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {
- //加载SpringMVC容器配置
- @Override
- protected WebApplicationContext createServletApplicationContext() {
- AnnotationConfigWebApplicationContext context=new AnnotationConfigWebApplicationContext();
- context.register(SpringMvcConfig.class);
- return context;
- }
-
- //设置哪些请求归属SpringMVC处理,"/"表示处理所有请求
- @Override
- protected String[] getServletMappings() {
- return new String[]{"/"};
- }
-
- //加载Spring容器配置
- @Override
- protected WebApplicationContext createRootApplicationContext() {
- return null;
- }
- }
为了简便开发,推荐继承自其子类AbstractAnnotationConfigDispatcherServletInitializer:
- public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
-
- @Override
- protected Class>[] getRootConfigClasses() {
- return new Class[0];
- }
-
- @Override
- protected Class>[] getServletConfigClasses() {
- return new Class[]{SpringMvcConfig.class};
- }
-
- @Override
- protected String[] getServletMappings() {
- return new String[]{"/"};
- }
- }

WebApplicationInitializer是 Spring MVC 提供的一个接口,可确保检测到您的实现并自动用于初始化任何 Servlet 3 容器。AbstractAnnotationConfigDispatcherServletInitializer是WebApplicationInitializer的抽象实现类,该类将自动初始化Servlet容器。

@RequestMapping注解可以添加在方法定义上或者类定义上,如果设置在类定义上表示访问该类下的方法的路径都需要加此前缀。
- @Controller
- public class UserController {
- @RequestMapping("/request")
- public void request(@RequestParam("name") String UserName){
- System.out.println(UserName);
- }
- }
- @Controller
- public class UserController {
- @RequestMapping("/request")
- public void request(User user){
- System.out.println(user);
- }
- }

- @Controller
- public class UserController {
- @RequestMapping("/request")
- public void request(String[] hobbies){
- System.out.println(Arrays.toString(hobbies));
- }
- }

- @Controller
- public class UserController {
- @RequestMapping("/request")
- public void request(@RequestParam List
hobbies){ - System.out.println(hobbies);
- }
- }
step1: 导入Jackson坐标:
- <dependency>
- <groupId>com.fasterxml.jackson.core</groupId>
- <artifactId>jackson-databind</artifactId>
- <version>2.13.3</version>
- </dependency>
step2: 添加@EnableWebMvc开启自动转换json数据的支持
- @Configuration
- @ComponentScan("controller")
- @EnableWebMvc
- public class SpringMvcConfig {
- }

- @Controller
- public class UserController {
- @RequestMapping("/request")
- public void request(@RequestBody List
hobbies){ - System.out.println(hobbies);
- }
- }
- {
- "name":"张三",
- "age":18
- }
- @Controller
- public class UserController {
- @RequestMapping("/request")
- public void request(@RequestBody User user){
- System.out.println(user);
- }
- }
- [
- {"name":"张三","age":18},
- {"name":"李四","age":20}
- ]
- @Controller
- public class UserController {
- @RequestMapping("/request")
- public void request(@RequestBody List
list){ - System.out.println(list);
- }
- }

- @Controller
- public class UserController {
- @RequestMapping("/jsp")
- public String JSPJump(){
- return "page.jsp";
- }
-
- @RequestMapping("/text")
- @ResponseBody
- public String ResponseText(){
- return "
response text
"; - }
-
- @RequestMapping("/jsonPOJO")
- @ResponseBody
- public User ResponseJsonPOJO(){
- User user=new User("张三",18);
- return user;
- }
-
- @RequestMapping("/jsonList")
- @ResponseBody
- public List
ResponseJsonList(){ - List
list=new ArrayList<>(); - list.add(new User("张三",18));
- list.add(new User("李四",20));
- return list;
- }
- }
注:@ResponseBody设置当前控制器返回值作为响应体,由HttpMessageConverter接口完成类型转换
REST(Representational State Transfer),表现形式状态转换,它是一种软件架构风格,当我们想表示一个网络资源的时候,可以使用两种方式:
http://localhost/user/getById?id=1 查询id为1的用户信息http://localhost/user/saveUser 保存用户信息http://localhost/user/1http://localhost/user但是我们的问题也随之而来了,一个相同的url地址即可以是新增也可以是修改或者查询,那么到底我们该如何区分该请求到底是什么操作呢?
请求的方式比较多,但是比较常用的就4种,分别是GET,POST,PUT,DELETE。
- @Controller
- public class UserController {
- @RequestMapping(value="/users",method = RequestMethod.POST)
- public void save(@RequestBody User user){
- //代码逻辑
- }
-
- @RequestMapping(value="/users/{id}",method = RequestMethod.DELETE)
- public void delete(@PathVariable int id){
- //代码逻辑
- }
-
- @RequestMapping(value="/users",method=RequestMethod.PUT)
- public void update(@RequestBody User user){
- //代码逻辑
- }
-
- @RequestMapping(value="/users/{id}",method=RequestMethod.GET)
- public void getById(@PathVariable int id){
- //代码逻辑
- }
- }
- @RequestMapping(value="/users/{id}",method = RequestMethod.DELETE)
- public void delete(@PathVariable("id") int userId){
- //代码逻辑
- }
三个注解@RequestBody、@RequestParam、@PathVariable,这三个注解之间的区别和应用分别是什么?
- @Controller
- @RequestMapping("/users")
- public class UserController {
- @PostMapping
- public void save(User user){
- //代码逻辑
- }
-
- @DeleteMapping("/{id}")
- public void delete(@PathVariable("id") int userId){
- //代码逻辑
- }
-
- @PutMapping
- public void update(@RequestBody User user){
- //代码逻辑
- }
-
- @GetMapping("/{id}")
- public void getById(int id){
- //代码逻辑
- }
- }
@ResponseBody注解也可以直接放在类定义上,且@RestController等同于@Controller与@ResponseBody两个注解组合功能