一、映射請求html
在POJO類定義處標註@Controller,再經過<content:component-scan /...>掃描相應的類包,便可使POJO類成爲一個能處理HTTP請求的控制器。
如何將請求映射到對應的控制器的方法中是Spring MVC框架最重要的任務之一,這項任務由@RequestMapping註釋承擔。
例子1:
java
1 @Controller 2 public class UserController{ 3 4 @RequestMapping(value="/user/createUser") 5 public String createUser(@ModelAttribute("user") User user){ 6 ... 7 retrun "user/createSuccess"; 8 } 9 10 @RequestMapping(value="/user/register") 11 public String register(@ModelAttribute("user") User user){ 12 return "user/register"; 13 } 14 }
@RequestMapping不但支持標準的URL,還支持Ant風格(即?、*和**字符)和帶{xxx}佔位符的URL,經過@PathVariable註釋能夠將URL中佔位符參數映射到方法入參。
例子2:web
1 @Controller 2 //將「/user」映射到Controller上 3 @RequestMapping("/user") 4 public class UserController{ 5 6 @RequestMapping("/{userId}") 7 public ModelAndView showDetial(@PathVariable("userId") String userId){ 8 ModelAndView mv = new ModelAndView(); 9 mv.setView("user/showDetail"); 10 mv.addObject("user", userService.getUserById(userId)); 11 return mv; 12 } 13 14 }
@RequestMapping除了可使用請求URL映射請求外,還可使用請求方法、請求頭參數、請求參數(報文體和URL包含的請求參數)映射請求。
例子3:cookie
1 @Controller 2 @RequestMapping("/user") 3 public class UserController{ 4 5 @RequestMapping(value="/delete", method = RequestMethod.POST, params = "userId") 6 public String delete(@RequestParam("userId") String userId){ 7 ... 8 return "user/list"; 9 } 10 11 @RequestMapping(value="/show", headers = "content-type=text/*") 12 public String show(@RequestParam("userId") String userId){ 13 ... 14 return "user/show"; 15 } 16 }
Spring MVC對控制器處理方法簽名是很寬鬆的,用戶能夠按本身喜歡的方式進行方法簽名,在必要時對方法及方法入參標註相應的註解(@PathVariable、@RequestParam、@RequestHeader等)
例子4:session
1 @RequestMapping("/param") 2 public String handleParam(@RequestParam("userName") String userName, 3 @RequestParam("password") String password, 4 //若是不存在realName參數,也不拋出異常 5 @RequestParam(value = "realName", required = false) String realName ){ 6 return "success"; 7 } 8 9 @RequestMapping(value="/cookie") 10 //將Cookie值及報文頭屬性綁定到入參中 11 public ModelAndView handleCookie(@CookieValue("JESSIONID") String sessionId, 12 @RequestHeader("Accept-language" String acceptLanguage){ 13 ModelAndView mv = new ModelAndView(); 14 mv.setView("success"); 15 mv.addObject("user", new User()); 16 return mv; 17 } 18 19 @RequestMapping(value="/user") 20 //使用命令/表單對象綁定請求參數,請求參數按名稱匹配的方式綁定到user的屬性中、方法返回的字符串表明邏輯視圖名 21 //如URL請求能夠爲:"/user.html?userName=tom&dept.deptId=1&dept.address.tel=102" 22 public String handleUser(User user){ 23 return "success"; 24 } 25 26 @RequestMapping(value="servlet1") 27 //使用ServletAPI對象做爲入參,可組合使用 28 public void handleServlet1(HttpServletRequest request, HttpServletResponse response){ 29 String userName = WebUtils.findParameterValue(request, "userName"); 30 response.addCookie(new Cookie("userName", userName)); 31 } 32 33 @RequestMapping(value="servlet2") 34 public String handleServlet2(HttpSession session){ 35 session.setAttribute("sessionId", 1234); 36 return "success"; 37 }
二、處理模型數據app
將模型數據輸出給視圖是Spring MVC框架的一項重要工做,有如下幾種途徑輸出模型數據:框架
1 @RequestMapping("/user/showDetail") 2 //使用ModelAndView返回值,指定一個具體的視圖對象和一個邏輯圖名 3 public ModelAndView showDetial(@PathVariable("userId") String userId){ 4 ModelAndView mv = new ModelAndView(); 5 mv.setView("user/showDetail"); 6 mv.addObject("user", userService.getUserById(userId)); 7 return mv; 8 } 9 10 @RequestMapping(value="/model1") 11 //在方法入參處使用@ModelAttribute,入參對象就回放到數據模型中,視圖createSuccess.jsp就能夠經過${user.userName}等方式訪問模型中的數據。 12 public String handleModel1(@ModelAttribute("user") User user){ 13 user.setUserId("1000"); 14 return "user/createSuccess"; 15 } 16 17 @RequestMapping(value="/model3") 18 //入參爲Map、Model、ModelMap時,處理方法返回時,數據自動添加到模型中 19 public String handleModel3(ModelMap modelMap){ 20 modelMap.AddAttribute("testAttr", "value1"); 21 User user = (User)modelMap.get("user"); 22 user.setUserName("tom"); 23 return "/user/showUser"; 24 }
@SessionAttribute這個註解只有當你想在某個特定的事件處理中臨時保存session會話(紅色標註)的時候才適用,而當須要永久保存session的話,仍是採用常規的方法,好比說:session.setAttribute,使用@SessionAttribute 的例子:jsp
1 @Controller 2 @RequestMapping("/user") 3 @SessionAttributes("user") 4 public class UserController{ 5 6 //因爲@SessionAttribute的處理機制,把對象存入Session時,Session中必須已經有對應屬性,沒有即報錯 7 @ModelAttribute("user") 8 public User getUser(){ 9 User user = new User(); 10 user.setUserId("1001"); 11 return user; 12 } 13 14 @RequestMapping(value="/model4") 15 public String handleModel4(@ModelAttribute("user") User user){ 16 user.setUserName("John"); 17 //發起一個請求,由handleModel5處理 18 return "redirect:/user/model5.html"; 19 } 20 @RequestMapping("/model5") 21 public String handleModel5(ModelMap modelMap, SessionStatus sessionStatus){ 22 //獲取HttpSession中名爲「user」的模型屬性 23 User user = (User)modelMap.get("user"); 24 25 } 26 }
三、數據校驗post
具體配置和使用,見:Spring Validation(使用Hibernate Validator)。使用@Valid的例子:ui
1 @Controller 2 @RequestMapping("/user") 3 public class UserController{ 4 ... 5 @RequestMapping(value="/valid1") 6 //在入參對象前添加@Valid註解,同時聲明一個BindingResult的入參 7 public String handleValid1(@Valid @ModelAttribute("user") User user, BindingResult bindingResult){ 8 if(bindingResult.hasErrors()){ 9 return "user/register3"; 10 }else{ 11 return "user/showUser"; 12 } 13 } 14 }
四、文件上傳
JSP例子:
1 <html> 2 <head> 3 <title>Upload a file please</title> 4 </head> 5 <body> 6 <h1>Please upload a file</h1> 7 <form method="post"action="/form"enctype="multipart/form-data"> 8 <input type="text"name="name"/> 9 <input type="file"name="file"/> 10 <input type="submit"/> 11 </form> 12 </body> 13 </html>
Controller的寫法:
1 @RequestMapping(method=RequestMethod.POST) 2 public String addSpitterFromForm(@Valid Spitter spitter, BindingResult bindingResult, 3 //使用MultipartFile類型入參,接收文件上傳 4 @RequestParam(value="image", required=false) MultipartFile image){ 5 if(bindingResult.hasErrors()){ 6 return "spitters/edit"; 7 } 8 9 spitterService.saveSpitter(spitter); 10 11 try{ 12 if(!image.isEmpty()){ 13 validateImage(image); 14 saveImage(spitter.getId() + ".jpg", image); 15 } 16 } 17 catch(ImageUploadException e){ 18 bindingResult.reject(e.getMessage()); 19 return "spitters/edit"; 20 } 21 22 return "redirect:/spitters/" + spitter.getUserName(); 23 } 24 25 //校驗圖片 26 private void validateImage(MultipartFile image) throws ImageUploadException{ 27 if(!image.getContentType().equals("image/jpeg")){ 28 throw new ImageUploadException("Only JPG images accepted"); 29 } 30 } 31 32 //保存文件 33 private void saveImage(String filename, MultipartFile image) throws ImageUploadException{ 34 try{ 35 File file = new File(webRootPath + "resources/" + filename); 36 fileUtils.writeByteArrayToFile(file, image.getBytes()); 37 } 38 catch(IOException e){ 39 throw new ImageUploadException("Unable to save image", e); 40 } 41 }
使用Servlet3.0時也可使用javax.servlet.http.Part:
1 @Controller 2 public class FileUploadController { 3 @RequestMapping(value = 「/form」, method = RequestMethod.POST) 4 public String handleFormUpload(@RequestParam(「name」) String name, 5 @RequestParam(「file」) Part file) { 6 InputStream inputStream = file.getInputStream(); 7 // store bytes from uploaded file somewhere 8 return 「redirect:uploadSuccess」; } 9 }
五、參考