編寫Spring MVC Controller

一、映射請求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 }

 五、參考

《Spring3.0就這麼簡單》

相關文章
相關標籤/搜索