spring-boot-learning-Web开发-深入理解springMVC
处理器映射
11spring启动阶段就会将@RequestMapping所配置的内容保存到处理器映射HandlerMapping机制中去
22等待请求,通过拦截器拦截请求信息与HandlerMapping进行匹配并找到对应的处理器
33将处理器和按揭器保存到HandlerExecutionChain中,返回给DisopatherServlet。
因此:
@Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented @Mapping public @interface RequestMapping { String name() default "";//配置请求映射名称 @AliasFor("path")//通过路径映射 String[] value() default {}; @AliasFor("value")//通过路径映射会path配置项 String[] path() default {}; //限定只响应http请求,如get post head options put trache,默认是所有的响应请求。 RequestMethod[] method() default {}; //存在对应的http参数时才响应 String[] params() default {}; //限定请求头存在对应的参数时才响应 String[] headers() default {}; //限定http请求提交类型 “text/html” String[] consumes() default {}; //限定返回的内容类型,仅http请求中的Accept类型中包含该指定类型事才返回 String[] produces() default {}; }
注意路径是必配项目
获取控制器参数
无注解获取参数:
要求:参数名称和http参数名称保持一致,默认规则里面参数值可以为null,
@Controller @RequestMapping("/my") public class MyController { @GetMapping("/no/annotation") @ResponseBody public Map<String,Object> noAnnotation(Integer intVal,Long longVal,String str){ Map<String,Object> paramsMap = new HashMap<>(); paramsMap.put("intVal",intVal); paramsMap.put("longVal",longVal); paramsMap.put("str",str); return paramsMap; } }
通过@RequestParam注解获取参数
/** * 通过注解@RequestParam * 目的:指定http请求参数和方法参数的映射关系,处理器按照映射关系得到参数,调用控制器方法 * 注意:默认情况下,@RequestParam标注的参数不能为空,为空会报错 * 可以通过属性required配置为false解决 * @param intVal * @param longVal * @param str * @return */ @GetMapping("/annotation") @ResponseBody public Map<String,Object> Annotation( @RequestParam("int_Val") Integer intVal, @RequestParam("long_Val") Long longVal, @RequestParam("str_Val") String str){ Map<String,Object> paramsMap = new HashMap<>(); paramsMap.put("intVal",intVal); paramsMap.put("longVal",longVal); paramsMap.put("str",str); return paramsMap; }
请求为:http://localhost:8867/my/annotation?int_Val=123&long_Val=1&str=str
结果
可以设置允许为空;@RequestParam(value = "str_Val",required = false) String str)
传递数组
/** * 处理传递简单的值,还可以传递数组 * 支持用逗号分隔的数组参数 * 一旦方法中定义了数组,那么前端就需要依照一定的规则传递给这个方法,每个参数的数组元素需要逗号分隔 * @param intArr * @param longArr * @param strArr * @return */ @GetMapping("/requestArray") @ResponseBody public Map<String,Object> requestArray(int[] intArr,Long[] longArr,String[] strArr){ Map<String,Object> paramsMap = new HashMap<>(); paramsMap.put("intArr",intArr); paramsMap.put("longArr",longArr); paramsMap.put("strArr",strArr); return paramsMap; }
传递JSON格式
通过URL传递参数
/** * 一些网站中,提出了REST风格,这些参数大多数都是通过URL进行传递的, * 例如:你要获取1号员工的信息,URL:/user/1 其中1代表的就是用户编号 * * 可以通过处理器映射和注解@PathVariable组合获取URL中的参数。 * 流程:1先通过处理器映射可以定位参数的位置和名称, * 2使用注解@PathVariable通过名称来获取参数 * @param id */ @GetMapping("/{id}") @ResponseBody public String getId(@PathVariable("id") Long id){ return id.toString(); }
/** * 上面使用了@GetMapping指定一个URL,用{参数名称}来标明位置和名称,这里名称是id * 所以在方法使用@PathVariable的时候配置的字符串为id,和上面URL参数声明对应 */
获取格式化参数:
@RequestMapping("/format/form") public String showFormat(){ System.out.println("from"); return "formatter"; } @PostMapping("/format/commit") public Map<String,Object> format( @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) Date date, @NumberFormat(pattern = "x,xxx.xx") Double number ){ Map<String,Object> paramsMap = new HashMap<>(); paramsMap.put("date",date); paramsMap.put("number",number); return paramsMap; }