springBoot Web开发(二)-请求参数处理(注解)

本文介绍了SpringBoot中处理请求参数的各种注解,包括@PathVariable、@RequestHeader、@RequestParam、@CookieValue、@RequestBody和@RequestAttribute。详细讲解了如何使用这些注解从URL路径、请求头、请求参数、Cookie、请求体和请求域中获取数据,并提供了多个示例。同时,还特别提到了@MatrixVariable用于处理矩阵变量的情况及其开启方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、Rest请求映射

按照rest风格,比如:对一个用户的操作,访问路径都是相同的,通过请求方式的不同来访问不同的controller

示例如下:

@RestController
public class HelloController {

    @RequestMapping("/1.jpg")
    public String hello(){

        return "aaa";
    }
    
    //获取用户
    @RequestMapping(value = "/user",method = RequestMethod.GET)
    public String getUser(){
        return "GET-张三";
    }

    //保存用户
    @RequestMapping(value = "/user",method = RequestMethod.POST)
    public String saveUser(){
        return "POST-张三";
    }

	//修改用户
    @RequestMapping(value = "/user",method = RequestMethod.PUT)
    public String putUser(){
        return "PUT-张三";
    }

	//删除用户
    @RequestMapping(value = "/user",method = RequestMethod.DELETE)
    public String deleteUser(){
        return "DELETE- 张三";
    }

}

同时还需要在配置文件中开启rest风格的支持

spring:
  mvc:
    hiddenmethod:
      filter:
        enabled: true

并且在html的form表单中,需要写一项隐藏参数项,参数为method,值为需要提交的请求参数,form标签的method属性依然为post。

示例如下:

<form action="/user" method="get">
    <input value="REST-GET 提交" type="submit"/>
</form>

<form action="/user" method="post">
    <input value="REST-POST 提交" type="submit"/>
</form>

<form action="/user" method="post">
    <input name="_method" type="hidden" value="delete"/>
    <input value="REST-DELETE 提交" type="submit"/>
</form>

<form action="/user" method="post">
    <input name="_method" type="hidden" value="PUT"/>
    <input value="REST-PUT 提交" type="submit"/>
</form>

2、参数与基本注解

1)可以在参数上标注的注解

@PathVariable

​ 标注路径变量的参数

​ 如果有多个路径变量,会将所有路径变量的k,v都放进map里,所以也可以标注一个Map参数来获取到所有的路径变量的值

例如:

@RestController
public class ParameterTestController{

    @GetMapping("/stu/{id}/name/{stuName}")
	public Map<String,Object> gteStu(@PathVariable("id") Integer id,
                                     @PathVariable("stuName") String name,
                                     @PathVariable Map<String,String> pv){
        
        Integer id1=id;
        Integer id2=pv.get("id");
        String name1=name;
        String name2=pv.get("stuName");
    
    
	}

}
@RequestHeader 标注请求头参数

​ 如果想获取请求头里的参数值,则可以使用@RequestHeader 属性值就是想获取的请求头里的参数名

​ 如果想获取多个请求头参数,也可以标注在一个Map<String,String>上,会将所有的k,v都放入该map中

例如:

@RestController
public class ParameterTestController{

    @GetMapping("/stu/{id}/name/{stuName}")
	public Map<String,Object> gteStu(@RequestHeader("User-Agent") String userAgent,
                                     @RequestHeader Map<String,String> header){
        
        String userAgent1=header.get("User-Agent");
        
	}

}
@RequestParam

​ 获取请求参数

​ 也可以标注一个Map<String,String>,来获取所有的参数

例如:

请求路径为:locahost:8080/user?age=19&&inters=basketball&inters=soccer

@RestController
public class ParameterTestController{

    @GetMapping("/user")
	public Map<String,Object> gteStu(@RequestParam("age") Integer age,
                                     @RequestParam("inters") Lsit<String> inters,
                                     @RequestParam Map<String,String> params){
        
        Integer age1=age;
        List<String> interests1=inters;
        
        Integer age2==params.get("age");
        List<String> interests2=params.get("inters");
        
	}

}
@CookieValue

​ 获取一次请求中cookie的值

​ 可以直接标注在一个String类型的参数上,注解的属性写cookie的名字

​ 也可以标注一个Cookie类型的参数,直接拿到cookie

例如:

@RestController
public class ParameterTestController{

    @GetMapping("/user")
	public Map<String,Object> gteStu(@CookieValue("JSESSIONID") String jSessionId,
                                    @CookieValue("JSESSIONID") Cookie cookie){
        
       String cookieValue=cookie;
       String cookieName=cookie.getName();
       String cookieValue=cookie.getVAlue();
        
	}

}
@RequestBody

​ 获取请求体中的内容(post请求才有请求体)

​ 获取前端返回的json字符串的数据

例如:

<form action="/save" method="post">
    用户名:<input type="text" name="userName" /><br>
    邮箱: <input type="text" name"email" />
    <input type="submit" value="提交">
</form>

如userName=zhangsan

email=123456@qq.com

@RestController
public class ParameterTestController{

   @PostMapping("/save")
	public Map<String,Object> postMethodTest(@RequestBody() String content){
        
        System.out.printLn(content);
        
	}

}

输出结果是:

​ “userName=zhangsan&email=123456@qq.com”

@RequestAttribuite

如在请求转发过程中想要获取请求域中的参数值,可以使用@RequestAttribuite注解拿到数据

也可以直接通过HttpServletRequest 获取请求域中的值

例如:

@Controller
public class RequestController{
    
    @GetMapper("/goto")
    public String gotoPage(HttpServletRequest request){
        
        request.setAttribute("msg","将要进行请求转发");
        request.setAttribute("code","200");
        return "forward:/success";
    }
    
    @ResponseBody
    @GetMapping("/success")
    public String success(@RequestAttribute("msg") String msg,
                          @RequestAttribute("code") Integer code,
                         HttpServletRequest request){
       
        System.out.println(msg);
        System.out.println(code);
        return "success";
    }
}
@MatrixVariable(矩阵变量)

矩阵变量是绑定在路径变量中的,所以controller的访问路径必须要写路径变量

a、url只有一个路径变量

在MatrixVariable中,多个变量可以使用分号(;)分隔,如:

/car;brand=byd;price=200000

如果一个变量对应多个值,可以用逗号分隔(,)如

/car;brand=byd,benz,audi

也可以使用重复的变量名,如:

/car;brand=byd;brand=benz;brand=audi

controller里写法如下:

如url:localhost:8080/car/sell;price=200000;brand=byd,benz,audi

	@GetMapping("/car/{path}")
    public Map<String,Object> carsSell(@MatrixVariable("price") Integer price,
                                       @MatrixVariable("brand") List<String> brand,
                                       @PathVariable("path") String path){
        Map<String,Object> map=new HashMap<>();
        map.put("price",price);  
        map.put("brand",brand);
        map.put("path",path);

        return map;
    }

输出结果:

200000

[byd,benz,audi]

b、url有多个路径变量,且不同的路径变量中有相同的参数名

url如下:

/stu/1;name=zhangsan/3;name=lisi

controller如下:

@GetMapping("/stu/{stuId}/{teacherId}")
    public Map<String,Object> carsSell(@MatrixVariable(value="name",pathVal="stuId") String stuName,
                                       @MatrixVariable(value="name",pathVal="teacherId") String teacherName){
        Map<String,Object> map=new HashMap<>();
        map.put("stuName",stuName);  
        map.put("teacherName",teacherName);
        return map;
    }

输出结果:

zhangsan

lisi

c、开启矩阵变量功能

springBoot默认关闭矩阵变量功能,如果要使用,则需要手动开启

方法一:

写一个配置类,实现WebMvcAutoConfiguration接口

@Configuration(proxyBeanMethods = false)
public class WebConfig{
	@Override
    public void configurePathMatch(PathMatchConfigurer configurer) {
        UrlPathHelper urlPathHelper=new UrlPathHelper();
        //设置不移除分号后的内容,矩阵变量功能就可以生效
        urlPathHelper.setRemoveSemicolonContent(false);
        configurer.setUrlPathHelper(urlPathHelper);
    }
 }

方法二:
在容器中放入WebMvcConfiguration组件

@Configuration(proxyBeanMethods = false)
public class WebConfig{
    @Bean
    public WebMvcConfigurer webMvcConfigurer(){
        return new WebMvcConfigurer() {

            /**
             * 自定义使矩阵变量功能生效
             * @param configurer
             */
            @Override
            public void configurePathMatch(PathMatchConfigurer configurer) {
                UrlPathHelper urlPathHelper=new UrlPathHelper();
                //设置不移除分号后的内容,矩阵变量功能就可以生效
                urlPathHelper.setRemoveSemicolonContent(false);
                configurer.setUrlPathHelper(urlPathHelper);
            }
        }
     } 
}     
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值