一:
@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指定小数精度。*