-
@Controller
註解一個類表示控制器,控制器Controller 負責處理由DispatcherServlet 分發的請求,它把使用者請求的資料經過業務處理層處理之後封裝成一個Model ,然後再把該Model 返回給對應的View,Spring MVC會自動掃描標註了這個註解的類
@Controller class Demo{...}
-
@RequestMapping
請求路徑對映,有六個屬性,下面我們把她分成三類進行說明,滿足請求條件才執行方法
1、 value, method;
value: 指定請求的實際地址,指定的地址可以是URI Template 模式
用於類上,表示類中的所有響應請求的方法都是以該地址作為父路徑 http://localhost:8080/專案名/hello/方法的mapping
用於方法上,表示響應請求方法的路徑對映 http://localhost:8080/專案名/方法的mapping
@Controller @RequestMapping(value = "/hello") // @RequestMapping("/hello") class Demo{}
method: 指定請求的method型別, GET、POST、PUT、DELETE等
@RequestMapping("/hello" , method=RequestMethod.GET) //指定請求方式
2、 consumes,produces;
consumes: 指定處理請求的提交內容型別(Content-Type),例如application/json, text/html
@RequestMapping(value="/test",consumes="application/json")
produces: 指定返回的內容型別,僅當request請求頭中的(Accept)型別中包含該指定型別才返回
@RequestMapping(value="/test",produces="application/json") //同時暗示了返回的內容型別為application/json
3、 params,headers;
params: 指定request中必須包含某些引數值是,才讓該方法處理
@RequestMapping(value="/test",params="name=tom")
headers: 指定request中必須包含某些指定的header值,才能讓該方法處理請求
@RequestMapping(value="/test",headers="Referer=http://www.clockin.com/")
-
@RequestParam
放在引數前面,只能接收引數 a=b 格式的資料,即Content-Type 為 application/x-www-form-urlencoded型別的內容
此時必須輸入 localhost:8080/login?id=? 帶引數才會呼叫該方法
public String login(@RequestParam int id){}
當設定 @RequestParam(required=false) 裡面的required為false(預設為true 代表必須帶引數) ,就可以不帶引數
當設定 @RequestParam(defaultValue=”0″) ,這樣在地址裡面也可以不帶引數,如果帶了引數會接收,不帶引數會預設為0
當設定 @RequestParam(value=”sid”) int id ,sid會代替id,id賦值給sid,URL為 sid = ?
-
@RequestBody
常用來處理content-type不是預設的application/x-www-form-urlcoded編碼的內容,比如說:application/json或者是application/xml
@requestMapping("/login") public void login(@requestBody String userName,@requestBody String pwd){ System.out.println(userName+" :"+pwd); }
{"userName":"admin","pwd","admin123"}
將JSON字串中的兩個變數的值分別賦予User類中的:String userName , String pwd 屬性
就將上述引數可以改為 @requestBody User user 這種形式會將JSON字串中的值賦予user中對應的屬性上
需要注意的是,JSON字串中的key必須對應user中的屬性名
-
@ResponseBody
此方法返回的資料放在request body裡面,而不是跳轉頁面,通常用來返回JSON資料或者是XML
在使用此註解之後不會再走試圖處理器,而是直接將資料寫入到輸入流中,他的效果等同於通過response物件輸出指定格式的資料
@RequestMapping("/login") @ResponseBody public User login(User user){ return user; }
User的屬性: userName,pwd
前臺接收到的資料: `{“userName”:”xxx”,”pwd”:”xxx”}`
-
@RestController
@RestController = @Controller + @ResponseBody 返回引數都在request body中,return “”無法返回指定頁面
-
@PathVariable
用於繫結restful路徑上的變數,對映 URL 繫結的佔位符
將 URL 中佔位符引數繫結到控制器處理方法的入參中:URL 中的 {xxx} 佔位符可以通過@PathVariable(“xxx“) 繫結到操作方法的入參中
@RequestMapping("/test/{id}") public String test(@PathVariable("id") String id){ System.out.println("test:"+id); return null; }
-
@RequestHeader
放在方法引數前,可以把Request請求header部分的值繫結到方法的引數上
1 Host localhost:8080 2 Accept text/html,application/xhtml+xml,application/xml;q=0.9 3 Accept-Language fr,en-gb;q=0.7,en;q=0.3 4 Accept-Encoding gzip,deflate 5 Accept-Charset ISO-8859-1,utf-8;q=0.7,*;q=0.7 6 Keep-Alive 300
@RequestMapping(“/header”) public void header(@RequestHeader(“Accept-Encoding”) String encoding,@RequestHeader(“Keep-Alive”) long keepAlive) { }
request header部分的 Accept-Encoding的值,繫結到引數encoding上, Keep-Alive header的值繫結到引數keepAlive上
-
@CookieValue
放在方法引數前,把Request header中關於cookie的值繫結到方法的引數上
JSESSIONID=415A4AC178C59DACE0B2C9CA727CDD84
@RequestMapping(“/cookie”) public void cookie(@CookieValue(“JSESSIONID”) String cookie) { }
JSESSIONID的值繫結到引數cookie上
-
@ModelAttribute
可標記在引數前
當 hello1 重定向到 hello2 時,hello2 的@ModelAttribute(“…”) 會根據”…”找到重定向中對應的鍵賦值給引數temp上
@RequestMapping("hello1") public String test(RedirectAttributes ra) { ra.addFlashAttribute("temps", "abcdef"); return "redirect:/hello2"; } @RequestMapping("helle2") public String test1(RedirectAttributes ra,@ModelAttribute("temps") String temp) { System.out.println(temp); return null; }
可標記在方法前
標有該註解的方法,會在目標方法前執行,用來封裝請求引數,告訴Spring MVC 封裝時不會再new User
Map 和 Model 同是:BindingAwareModelMap 物件,資料都儲存在該物件中,既是“隱含模型”
@ModelAttribute public void work(Map<String,Object> map) { //在功能test方法前執行 User user = new User(1,"tom",20); //模擬從資料庫查詢出的資料 map.put("user", user); //map儲存物件資料 } @RequestMapping("/test") public String test(@ModelAttribute("user") User user) { System.out.println(user.toString()); return null; }
標有該註解的方法,可以直接在前端頁面使用這個list物件
隱含模型是幽靈,無處不在
/** * jsp使用JSTL, ${list} 得到集合 */ @ModelAttribute("list") public List<String> hobbiesList(){ List<String> hobbise = new LinkedList<String>(); hobbise.add("basketball"); hobbise.add("football"); hobbise.add("tennis"); return hobbise; }
-
@SessionAttribute
只能作用在類上,將Model中的屬性同步到session當中
@Controller @SessionAttributes("name") public class SessionController { @RequestMapping("/hello") public String test(Model model){ model.addAttribute("name", "tom"); return null; }
上面的程式碼將Model中的name引數儲存到了session中(如果Model中沒有name引數,而session中存在一個name引數,那麼SessionAttribute會講這個引數塞進Model中)
SessionAttribute有兩個引數:
String[] value:要儲存到session中的引數名稱
Class[] typtes:要儲存的引數的型別,和value中順序要對應上
所以可以這樣寫:@SessionAttributes(types = {User.class,Dept.class},value={“attr1”,”attr2”})
如果想刪除session中共享的引數,可以通過SessionStatus.setComplete(),這句只會刪除通過@SessionAttribute儲存到session中的引數
@RequestMapping("/hello") public ModelAndView test(SessionStatus status) { ModelAndView model = new ModelAndView("success.jsp"); status.setComplete(); return model; }