一、从URL路径映射到处理处理器的映射
注释:@RequestMapping适用于对象以及方法,该注释实现了url路径到处理器和处理器方法的映射,
@GetMapping 适用于对象以及方法,该注释实现了url路径到处理器和处理器方法的映射,当http的请求方法为get时响应,同理还有:@PostMapping、@PutMapping、@DeleteMapping等常用注释
二、从URL参数到restful 访问方法参数
1、@PathVariable 注释: 表示 将url路径中的某一部分映射为接口参数;
restful接口开发中常常需要将url中的路径参数映射为接口方法的参数,如下示例代码中:
@GetMapping("/commodity/{id}")
@ResponceBody
public Commodity getCommodityDetail(@PathVariable String id)
{
return commodityServiceImpl.selectCommodity(id);
}
2、@RequestParam注释:表示将URL get请求中的参数映射为接口方法参数,该注释针对接口中的参数变量进行使用,注意如果http参数为空时,需要将@RequestParam的属性required设置为false,示例代码如下:
@GetMapping("query")
@ReponseBody
public User GetUsers(@RequestParam("userid") String userID,@RequestParam("born") String born,@RequestParam("old") int old)
{
return getUsers(userID,born,old);
}
3、@RequestBody注释,将页面表单中提交的json数据转化为为接口方法的对象 参数,示例如下:
js代码如下:
function post()
{
var params = {
userName : userName,
note : note
};
$.post({
url :" ./insert",
//此处需要告知传递参数类型为JSON ,不能缺少
contentType:"application/json",
//将JSON 转化为字符串,传递
data:JSON.stringify(params)',
//成功后的方法
success : function (result) {
if (result == null I I result . id == null) {
alert ( ”插入失败” );
return ;
alert ( ”插入成功”);
}});
}
java代码如下:
@PostMappin("/insert")
@ResponseBody
publibc User Insert(@RequestBody User user)
{
userService.insert(user);
return user;
}
三、在控制器中调用方法之前实现数据绑定和格式转换
注释@InitBinder表示初始化绑定,控制器中的方法若采用了@InitBinder进行注释,表示该方法是在调用控制器其它方法之前需要先执行调用的方法,该注释可以用来实现对接口方法进行格式转换和验证。
//=================验证类==========================
public class UserValidator implements Validator {
//该验证器只支持User 类验证
@Override
public boolean supports(Class<?> clazz ) {
return clazz.equals(User.class ) ;
}
//验证逻辑
@Override
public void validate (Object target,Errors errors ) {
//对象为空
if ( target == null) {
//直接在参数处报销,这样就不能进入控制器的方法
errors. rejectValue ( "", null ,"用户不能为空" ),
return ;
}
//强制转换
User user = (User) target ;
//用户名非空串
if ( StringUtils.isEmpty (user.getUserName ())) {
//增加错误,可以址入控制器方法
errors rejectValue("userName", null ," 用户名不能为空");
}
}
}
//================控制器中初始化绑定=======================
@InitBinder
publiC void initBinder (WebDataBinder binder)
{
//绑定验证器
binder.setValidator(new UserValidator()) ;
//定义参数格式,参数不再使用注解@DateTimeFormat , boolean 参数表示是否允许为空
binder.registerCustomEditor(Date.class),new CustomDateEditor (new SimpleDateFormat("yyyy-MM-dd"), false ));
}
接口方法示例如下:
@GetMapping ("/validator")
@ResponseBody
public Map<String, Object> validator(@Valid User user,Errors Errors , Date date)
{
Map<String, Object> map = new HashMap<> ();
map.put ( "user" , user);
map.put ("date" , date);
//判断是否存在错误
if (Errors.hasErrors ()) {
//获取全部错误
List<ObjectError> oes = Errors.getAllErrors();
for (ObjectError oe : oes)
{
//判定是否字段错误
if (oe instanceof FieldError) (
//字段错误
FieldError fe = (FieldError) oe;
map.put (fe.getField(), fe.getDefaultMessage ());
}
else
{
//对象错误
map.put (oe.getObjectName(),oe.getDefaultMessage()) ;
return map;
}
}
四、接口方法参数验证相关的注释
数据库进行表结构定义时,常常对字段内容是否为空,字段内容长度、格式类型有要求,在代码实现时,需要将数据表字段的验证规则映射为模型大的字段验证规则,若接口的方法参数为需要相应的模型类型,则在向接口方法传递参数时,也要求参数符合验证规则。
在模型定义时可用大的注释有:@NotNull,@Future,@DateFormat,@DecimalMax
public class ValadatorPojo
{
//非空判断
@NotNull(message="id不能为空")
private Long id ;
@Future(message =”需要一个将来日期刊)//只能是将来的日期
//@Past //只能是过去的日期
@DateTimeFormat(pattern = "yyyy-MM - dd") //日期格式化转换
@NotNull //不能为空
private Date date ;
@NotNull //不能为空
@DecimalMin(value ="O.l")//最小值0.l 元
@DecimalMax(value =" 10000")//最大值10000 元
private Double doubleValue = null ;
@Min(value = 1, message ="最小值为1")//最小值为1
@Max(value = 8, message=" 最大值为88")//最大值为88
@NotNull //不能为空
private Integer integer ;
@Range(min = 1 , max =88, message = " 范围为1 至88 日")// 限定范围
private Long range ;
}
java 服务端接口示例如下:
@RequestMapping (value = "/valid/validate")
@ResponseBody
public Map<String, Object> validate(@Valid @RequestBody ValidatorPojo vp, Errors errors) {
Map<String, Object> errMap= new HashMap<>() ;
//获取错误列表
List<ObjectError> oes = errors.getAllErrors() ;
for (Obj ectError oe : oes) {
String key = null ;
String msg = null;
//字段错误
if (oe instanceof FieldError )
{
FieldError fe = (FieldError) oe ;
key= fe.getField () ; //获取错误验证字段名
}
else
{
//非字段错误
key= oe.getObjectName();//获取验证对象名称
//错误信息
msg = oe.getDefaultMessage();
errMap.put(key, msg) ;
return errMap ;
}