springMVC获取参数的几种注解

本文介绍了SpringMVC中处理不同类型的HTTP请求参数的方法,包括@RequestBody、@RequestParam和@ModelAttribute注解的使用技巧,以及如何进行参数校验。

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

一:
@RequestBody 接受json方式发送的请求不可用于from表单提交方式

实例:

@RequestMapping(value= "/save",method=RequestMethod.POST)

@ResponseBody

public PageData saveLeave(@RequestBody Map<String,String> map){}

以什么类型接收随意包括实体类,但是实体类的变量名必须与前台的name名一致否则会匹配不上,当然方法名括号中的变量名也是得与前台的name一致 本人习惯与用Map<,>使用起来方便快捷 省去了写实体类的时间

二:
@RequestParam json/from都可以 springmvc会自动根据参数名字来注入,所以后台接收的参数名要与前台的(页面中的)name一致,不然不会注入

实例:

@RequestMapping("/unixtime")

@ResponseBody

public ApiCommand time(@RequestParam(required=false) String sn) throws Exception {}

(required=false)表示:允许sn 参数为空 默认不写则为true表示不允许为空

以上是当后台参数与前台参数一样时的接参方法 当不一样时可用以下方法

@RequestMapping("/")

public String Demo1(@RequestParam(value="lid") String id){}

1、通过前台传过来的name与括号中的相匹配 然后在赋值 也可以给id变量设置默认值(value=”lid”,defaultValue=”ste”) 这样id变量得到的值就是‘ste’

2、表示请求中可以没有名字为username的参数,如果没有默认为null,此处需要注意如下几点

public String queryUserName(@RequestParam(value="userName" ,required =false ) String userName)

3、可以通过required=false或者true来要求@RequestParam配置的前端参数是否一定要传

三:
@ModelAttribute 可以用来接收json方式和from方式,它的几个应用方法
1、使用在方法上
使用在方法上本Conteroller类中的 每一个Conteroller执行前都会被调用一次该方法 使用时记得注意

例:

@controller
@RequestMapping(“/modelTest”)
public class MOdelAttrbuteTestConroller{
@ModelAttribute
public Object loginApp(@RequestParam String id,Model model){

    model.addAttribute("attributeName",id);

}

@RequestMapping(value =”/test”)

public String test(){

    return "test";

}

}

注解:在请求/modelTest/test?id=123456后,会先执行logApp方法,然后再调用test方法参数 id的值被存入到model后也会被带到test方法中

2、应用在方法的参数上 而且方方法上使用了@RequestMapping

例:@RequestMapping(value=”login_app”,method=RequestMethod.POST)

@ResponseBody /@ModelAttribute User user/

public Object loginApp(@ModelAttribute User user){}

注解:这种方法比较常用而且方便 会把值匹配到User实体类中去 当然 前台name名和User实体类的变量名要一致才能匹配

外:使用@ModelAttribute和@ResponseBody注解可以配套@Valid 验证注解使用达到很好的效果 下面用实例说话:

    @RequestMapping(value="/attendanceRecord",method=RequestMethod.POST)
    @ResponseBody
    public PageData createAttendance(@RequestBody @Valid AttendanceRecord record,BindingResult result) {
        if (result.hasErrors()) {
            PageData resultPd = new PageData();
            resultPd.put("code", 400);
            resultPd.put("msg", result.getAllErrors().get(0).getDefaultMessage());
            resultPd.put("data", new ArrayList<Object>());
            return resultPd;
        }
        PageData pd = new PageData();
        pd.put("ccid", record.getCcid());
        pd.put("time", record.getTime() == null ? DateUtil.getTime() : record.getTime());
        pd.put("verify", record.getVerify());
        pd.put("pics", record.getPics());
        pd.put("lng", record.getLng());
        pd.put("lat", record.getLat());
        return this.postClockin(pd);
    }

当访问 。。。。/attendanceRecord接口时会先访问AttendanceRecord实体类 并且启动验证当ccid为空时返回到BindingResult record中再执行if然后把错误信息返回到前台

public class AttendanceRecord {
    @NotEmpty(message="用户编码ccid不能为空")
    private String ccid;

    @Pattern(regexp="^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}$",message="时间格式不正确")
    private String time;

    @NotNull(message="打卡方式verify不能为空")
    @Range(min=3,max=3,message="app打卡方式固定传3")
    private Integer verify;

    private List<String> pics;
    @Digits(integer=3,fraction=6,message="经度格式不正确")
    private BigDecimal lng;
    @Digits(integer=3,fraction=6,message="纬度格式不正确")
    private BigDecimal lat;

    public String getCcid() {
        return ccid;
    }

*Range(min=’最小值’,max=’最大值’,message=’返回提示信息’)

@Digits(integer=,fraction=) 验证字符串是否是符合指定格式的数字,interger指定整数精度,fraction指定小数精度。*

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值