SpringMVC基礎配置(二)
上一張:ofollow,noindex">SpringMVC環境搭建(一)
今天我們來說說SpringMVC的基礎配置。目前越來越多的主流框架都支援註解,同時我們無敵的Spring也支援基於註解的"零配置"。
註解相比XML的優勢:它可以充分利用Java的反射機制獲取類中的結構資訊,這些資訊可以有效減少配置的工作,註釋和Java程式碼位於一個檔案中,更加利於維護。
注意:必須要在Spring2.5版本之後才可以使用註解方式。
註解方式將Bean的定義資訊和Bean的實現類結合在一起,Spring提供的註解有。
@Component:宣告一個普通的Bean類
@Repository:宣告一個持久層Dao類
@Service:宣告一個業務層類
@Controller:宣告一個控制器類
這4個註解相信小夥伴們已經非常的熟悉了,廢話就少說了。我們使用註解千萬不要忘了在類中掃描!!!
@RequestMapping(非常核心的一個註解),這個註解是用來指定控制器的請求URL。
在控制器的類定義:提供初步的對映資訊,為該類下所有請求方法新增一個字首。
在控制器類中的方法定義:提供進一步的對映資訊,提供方法的請求路徑
DispacherServlet截獲請求後,就通過 控制器上的@RequestMapping提供的對映資訊確認請求所對應的處理方法。
@Controller @RequestMapping("user") public class UserController { @RequestMapping("/hello") public String hello(){ return "hello"; } }
這個時候我們請求的路徑是http://localhost:8080/SpringMvcDemo2/user/hello
@RequestMapping除了對映請求URL請求,還可以使用請求方法,請求引數和請求頭的請求,註解中有幾個引數:
1)value:表示請求的URL
2)method:表示請求的方式(GET/POST)
3)params:表示請求的引數
4)heads:請求頭
他們之間的是與的關係,聯合使用多個請求可以讓請求更加的精確化。
@RequestMapping(value="hello2",method=RequestMethod.POST,params={"username","userpass"},headers="contentType=text/*") public String hello2(){ return "hello"; }
這段程式碼表示,請求的地址是hello請求方式為Post必須帶username,userpass兩個引數,請求頭contentType必須是text/開頭。我們可以寫兩個URL一樣的方法,請求方式一個POST另一個GET當時會嚴格根據設定進行呼叫
@RequestMapping同時還支援Ant風格的URL,在Ant中支援3種萬用字元。
?:表示配置一個字元。
*:匹配任意字元
**:匹配多層路徑
在SpringMVC中對引數的處理:
@pathVariable:URL模板方式
用來對映URL中的佔位符,對映的變數名必須和佔位符中的名稱一致,像這種我們的請求地址就會時http://localhost:8080/SpringMvcDemo2/user/testPathVariable/Miya,這個miya就是我們傳過去的引數,在傳統的URL中testPathVariable?username=miya但是這種不利於百度的收錄。
@RequestMapping("/testPathVariable/{username}") public String hello3(@PathVariable("username")String username){ System.out.println("username :" + username); return "hello"; }
@RequestParam:獲取請求引數,如果請求引數名字和型別的名字一致我們可以省略吊這個註解,一樣可以接受到值。
@RequestMapping("/textParam") public String hello4(@RequestParam("username")String username,@RequestParam("userpass")String userpass){ System.out.println("userpass :" + userpass); return "hello"; }
@RequestHeader:獲取請求頭的引數
在這裡有三個引數,value:指定引數的名稱,required:指定引數是否為必填,defualtValue:指定引數的預設值。
@RequestMapping("/testRequestHeader") public String hello5(@RequestHeader("Accept-Language") String language){ System.out.println("language=" + language); return "hello"; }
@CookieValue:用來獲取客戶端Cookie的資訊。
@RequestMapping("/testCookieValue") public String hello6(@CookieValue("JSESSIONID")String sessionid){ System.out.println("sessionid=" + sessionid); return "hello"; }
SpringMVC可以使用ServletAPI作為請求方法的引數
@RequestMapping("/testServletAPI") public String hello7(HttpServletRequest request,HttpServletResponse response,HttpSession session){ //我們可以在這裡使用 return "hello"; }
SpringMVC提供了以下幾種處理模型資料的方式。
1)ModelAndView:將處理方法的返回型別設定為ModelAndView方法體可通過該模型物件新增模型資料。既包含檢視,也包含模型資訊
@RequestMapping("/testModelAndView") public ModelAndView hello8(){ ModelAndView modelAndView = new ModelAndView("hello"); //新增單個值 modelAndView.addObject("h","Hello Spring MVC"); return modelAndView; }
2)Map及形參:當形參為Map,Model,ModelMap時,處理方法返回時,Map中的資料會自動新增到模型中。
Spring MVC在內部使用了一個Model介面儲存資料的資料,在呼叫方法前會建立一個隱含的模型物件作為資料模型的儲存容器。如果傳入的引數為 Map,Model,ModelMap時,SpringMVC會自動儲存到容器中
@RequestMapping("/testMap") public String hello9(Map<String,Object> map){ map.put("mapdata", "map data"); return "hello"; }
3)@SessionAttributes:將這個模型中的某個屬性儲存到Session中,以便多個請求之間共享這個屬性,只能用來修飾類。在裡面的方法如果引數容器中如map裡賣弄儲存一個與定義的屬性名字相同會儲存到容器中共享
4)@ModelAttribute:方法形參標記該註解後,形參物件就會放到模型中。
SpringMVC在呼叫方法之前會逐個呼叫方法上標註了這個註解的方法。將@ ModelAttribute中的屬性儲存到map中,可在執行表單提交生成物件之前,替換執行方法名相同的引數。
@ModelAttribute public User getUser(){ User user = new User(); System.out.println("呼叫 getUser 方法"); //預設儲存名字為類名首字母小寫的user物件到Request中 return user; } @ModelAttribute public void getUserById(Integer id,Map<String,Object> map){ User myuser = new User(); map.put("myuser", myuser); //手動指定user物件的名稱,到Request中 System.out.println("呼叫 getUser 方法"); }
由@SessionAttributs會引發一個很容易輕視的錯誤當類使用@SessionAttributes修飾,而方法中使用了和SessionAttributes修飾同名的對映引數,確沒有新增@ModelAttribute修飾時,則會報錯。