SpringMVC 接收数据

SpringMVC 接收数据

1.设置访问路径

@RequestMapping 将handler注册到 HandlerMapping中

  1. @RequestMapping 可以用到方法上也可以用到类上

    用到方法上,访问某个路径就直接执行这个方法。如果方法上都有某一个路径字段,就可以把他提取出来放到类上。需要注意的是放在类上,方法上也必须有这个注解,否则HandlerMapping找不到这个方法

    如果类上指定了路径,而方法上没有指定路径,那么访问类上的路径就会走这个方法

    @Controller
    @RequestMapping("user")
    public class UserController {
    ​
        @RequestMapping
        public String index(){
            return null;
        }
        @RequestMapping("login")
        public String login(){
            
            return null;
        }
    ​
    }

    当访问 user 路径时,会走index方法,访问 user/login 会走 login方法

  2. @RequestMapping 的地址可以有多个,传入地址的数组即可

  3. 支持模糊地址

    /user/* 表示user路径下任意一层地址

    /user/** 表示 user路径下的任意层地址

  4. 指定请求方式

    在 @RequestMapping 中默认是任何请求方式都能访问,可以使用 method=RequestMethod.POST 等指定请求方式,请求方式也可以传入数组

    @RequestMapping(method = RequestMethod.GET)
    public String index(){
        return null;
    }

    如果前端的请求方式不符合,会报405的错误

    除了@RequestMapping 注解之外,还有一些已经指定了请求方式的注解

    • GetMapping

    • PostMapping

    • PutMapping

    • DeleteMapping

    这几个注解只能用在 方法上,内部已经指定了响应的请求方式

 

2.param接收参数

  1. 直接接收

    直接在handler的形参列表上接收,要求是形参名和类型与传递的参数相同

    访问地址:localhost:8080/param/getter?name=hhh&age=18

    @Controller
    @RequestMapping("param")
    public class ParamController {
        @GetMapping("getter")
        @ResponseBody
        public String getParam(String name,int age){
            return "name: " + name + " age: "  + age;
        }
    }

    这种方式,不传递也不会报错

  2. 使用 @RequestParam

    @RequestParam 注解加在形参列表上。

    • 可以指定前端传递过来的参数名。

    • 可以要求传递参数不能是空。内部有一个required,默认值是true,也就是必须传递,不传会报400异常

    • 也可以给定一个默认值。,内部有一个 defaultValue,指定默认值

    访问地址:localhost:8080/param/data?account=lalala

    @GetMapping("data")
    @ResponseBody
    public String data(@RequestParam("account") String username,
                       @RequestParam(required = false, defaultValue = "1")int page){
        return "account:" + username + " page:" + page;
    }

    这里指定了第一个请求参数叫 account,并且使第二个请求参数可以不传递,如果不传递默认值是1

  1. 集合接值

    如果同一个key,对应了很多value,那么就可以用集合去接收请求参数

    访问地址:localhost:8080/param/data1?list=zhangsan&list=lisi

    @GetMapping("data1")
    @ResponseBody
    public String data1(@RequestParam List<String> list){
        System.out.println("list = " + list);
        return "ok";
    }

    这里的list形参列表也需要加上 @RequestParam

  2. 使用实体对象接值

    要求请求参数的名和实体类对象的属性相同

    如果没有传递对应的请求参数,那么就是该对象属性的默认值

    @GetMapping("data3")
    @ResponseBody
    public String data3(User user){
        return user.toString();
    }

 

3.路径接收参数

访问地址:localhost:8080/param/path/root/12345

@GetMapping("path/{account}/{password}")
@ResponseBody
public String pathData(@PathVariable String account, @PathVariable String password){
    return "username:" + account + "  password:" + password;
}

这里用的注解是 @PathVariable 他也可以指定传递参数名和传递的必须性

 

4.json 参数接收

接收前端传递的json数据也是需要一个实体类,实体类的名称和传递的参数要相同

并且请求方式必须是 Post请求

然后在handler的形参上使用 @RequestBody

@PostMapping("json")
@ResponseBody
public String jsonData(@RequestBody User user){
    return user.toString();
}

这样之后,还不能接收json数据,因为java 并不支持json格式,还要以下两个步骤

  • 导入json依赖

    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.17.2</version>
    </dependency>
  • 在配置类上加入 @EnableWebMvc 注解,给 HandlerAdapter配置json 转换器

    @Configuration
    @ComponentScan("com.ztone.param")
    @EnableWebMvc
    public class MvcConfig {
        @Bean
        public RequestMappingHandlerMapping handlerMapping(){
            return new RequestMappingHandlerMapping();
        }
    ​
        @Bean
        public RequestMappingHandlerAdapter handlerAdapter(){
            return new RequestMappingHandlerAdapter();
        }
    }

@EnableWebMvc 注解 会自动将 HanlderAdapter 和 HandlerMapping 添加到ioc 容器,并且会给 HandlerAdapter 添加 jacksonjson 处理器,不用自己注册这两个bean了

 

5.接收cookie 和请求头

  1. 接收cookie 需要在形参上使用 @CookieValue 来指定参数接收的是 cookie,可以指定cookie的名称

  2. 接收请求头 使用 @RequestHeader ,也可以指定请求头的名称

 

 

6.获取原生对象

想要接收原生对象 如HttpServletRequest 、HttpServletResponse、HttpSession等,直接在形参列表传入即可。

获取ServletContext(可以读取最大的配置文件、 是全局最大的共享域、核心api)

  • 方案一:request.getServletContext() / session.getServletContext()

  • 方案二:

    @Controller
    public void ApiController{
        @Autowired
        private ServletContext servletContext
    }

    程序启动后,ServletContext会自动装入到ioc容器,所以使用 @Autowired自动装配,就可以使用。

posted @ 2024-08-16 11:36  GrowthRoad  阅读(15)  评论(0编辑  收藏  举报