1. 程式人生 > 實用技巧 >spring-boot-learning-Web開發-深入理解springMVC

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;
    }