1. 程式人生 > 其它 >常用註解(PathVariable中介紹restful程式設計風格)

常用註解(PathVariable中介紹restful程式設計風格)

RequestParam

作用:可以解決前臺傳值名稱與後臺名字不匹配導致無法接受的問題。
屬性:required——是否必須有該值,預設是true,若接受不到該值則會報錯400:Bad Request

    //必須傳一個為name的變數,否則會出現400:Bad Request,因為required為true設為false則不會
    @RequestMapping("/testRequestParam")
    public String testRequestParam(@RequestParam("name") String username){
        System.out.println(username);
        System.out.println("執行了...");
        return "success";
    }

RequestBody

作用:獲取請求體內容。直接使用得到是 key=value&key=value... 結構的資料(get請求方式不適用,get無請求體)
屬性:required——是否必須有請求體,預設值是:true。當取值為true,get請求方式會報錯。為false,get請求得到的是null

    //通過此註解body即可接受請求體
    @RequestMapping("/testRequestBody")
    public String testRequestBody(@RequestBody String body){
        System.out.println(body);
        return "success";
    }

PathVariable

前置知識:restful程式設計風格

註解介紹

作用:用於繫結url中的佔位符。例如:請求url中/delete/{id},這個id就是url的佔位符。
屬性:value——用於指定url中佔位符的名稱 required——是否必須提供佔位符

  //<a href="anno/testPathVariable/10">PathVariable</a>
    @RequestMapping("/testPathVariable/{id}")
    public String testPathVariable(@PathVariable("id") String id){
        System.out.println(id);
        return "success";
    }

RequestHeader

作用:用於獲取指定請求頭的值
屬性:value——請求頭的名稱 required——是否必須有此訊息頭

    @RequestMapping("/testRequestHeader")
    public String testRequestHeader(@RequestHeader("Accept") String header){
        System.out.println(header);
        return "success";
    }

CookieValue

作用:用於把指定cookie名稱的值傳入控制器方法引數
屬性:value——指定cookie名稱 required——是否必須有cookie

  //使用jsp必回生成一個session,瀏覽器用cookie儲存該session的id
    @RequestMapping("/testCookieValue")
    public String testCookieValue(@CookieValue("JSESSIONID") String cookieValue){
        System.out.println(cookieValue);
        return "success";
    }

ModelAttribute

作用:出現在方法上——當前方法會在控制器的方法執行之前,先執行。它可以修飾沒有返回值的方法,也可以修飾具有具體返回值的方法。 出現在引數上,獲取指定的資料給引數賦值。
屬性:value——用於獲取資料的key。key可以是POJO的屬性名稱,也可以是map結構的key。
應用場景:當表單提交資料不是完整的實體類資料時,保證沒有提交資料的欄位使用資料庫物件原來的資料。
例如:在編輯一個使用者時,使用者擁有一個建立資訊的欄位,該欄位的值不能被修改。在提交表單資料是肯定沒有該欄位的值,一旦更新會把該欄位設定為null,此時可以用此註解來解決問題。

前臺無date資料

    <form action="anno/testModelAttribute" method="post">
        使用者姓名: <input type="text" name="uname"><br>
        使用者年齡: <input type="text" name="age"><br>
        <input type="submit" value="提交">
    </form>

通過ModelAttribute將date賦予原來的值,不要為null
有返回值:

    @RequestMapping("/testModelAttribute")
    public String testModelAttribute(User user){
        System.out.println("testModelAttribute執行了");
        System.out.println(user);
        return "success";
    }

    /**
     * 該方法會先執行
     */
    @ModelAttribute
    public User showUser(String uname){
        System.out.println("showUser執行了");

        //通過使用者名稱查詢資料庫(模擬)
        User user = new User();
        user.setUname(uname);
        user.setAge(20);
        user.setDate(new Date());

        return user;
    }

無返回值:

    @RequestMapping("/testModelAttribute")
    public String testModelAttribute(@ModelAttribute("abc") User user){
        System.out.println("testModelAttribute執行了");
        System.out.println(user);
        return "success";
    }

    @ModelAttribute
    public void showUser(String uname, Map<String,User> map){
        //通過使用者名稱查詢資料庫(模擬)
        User user = new User();
        user.setUname(uname);
        user.setAge(20);
        user.setDate(new Date());

        //將資料存入map集合
        map.put("abc",user);
    }

SessionAttributes

作用:用於多次執行控制器方法間的引數共享(只能作用在類上)
屬性:value——用於指定存入的屬性名稱 type:用於指定存入的資料型別

@Controller
@RequestMapping("/anno")
@SessionAttributes(value = {"msg"}) //把msg=哈哈再存入session域物件中
public class ParamController{
  @RequestMapping("/testSessionAttributes")
    public String testSessionAttributes(Model model) {
        System.out.println("testSessionAttributes...");
        //底層會儲存到request域物件中
        model.addAttribute("msg", "哈哈哈");
        return "success";
    }

    /**
     * 從session中取值
     *
     * @param modelMap
     * @return
     */
    @RequestMapping("/getSessionAttributes")
    public String getSessionAttributes(ModelMap modelMap) {
        System.out.println("getSessionAttributes...");
        //從session中獲取
        System.out.println(modelMap.get("msg"));
        return "success";
    }


    @RequestMapping("/delSessionAttributes")
    public String dekSessionAttributes(SessionStatus status) {
        System.out.println("delSessionAttributes...");
        //清除session
        status.setComplete();
        return "success";
    }
}