成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

吐血整理!14個編寫Spring MVC控制器的實用小技巧

開發 前端 開發工具
本文介紹了編寫Spring MVC框架的控制器(controller)的基礎技巧和最佳操作。在Spring MVC框架中,編寫控制器類通常是為了處理用戶提出的請求。

本文介紹了編寫Spring MVC框架的控制器(controller)的基礎技巧和最佳操作。在Spring MVC框架中,編寫控制器類通常是為了處理用戶提出的請求。

編寫完成后,控制器會調用一個業務類來處理業務相關任務,進而重定向客戶到邏輯視圖名。Springdispatcher servlet會對邏輯視圖名進行解析,并渲染結果或輸出。這就是一個典型的“請求—響應”的完整流程。

[[282570]]

1. 使用@controllerstereotype

創建一個能夠處理單個或多個請求的控制器類,最簡單的方法就是使用@controllerstereotype注解一個類,如:

  1. import org.springframework.stereotype.Controller; 
  2. import org.springframework.web.bind.annotation.RequestMapping; 
  3. @Controller 
  4. publicclassHomeController { 
  5.     @RequestMapping("/") 
  6.     publicString visitHome() { 
  7.         // do something before returning view name 
  8.         return"home"; 
  9.     } 

如上所示,visitHome()方法通過重定向跳轉到視圖名home來處理應用程序內容路徑(/)收到的請求。 注意:只有在Spring配置文件中啟用了注解驅動,才能使用@controllerstereotype。

  1. <annotation-driven/> 

啟用注解驅動后,Spring的容器(container)會自動掃描如下包中的類:

  1. <context:component-scanbase-packagecontext:component-scanbase-package="net.codejava.spring"/> 

帶有@controller注解的類會被標記成控制器。由于其簡單方便,且不再需要對配置文件中的控制器聲明beans,這一方法非常實用。 注意:使用@controller注解可以創建一個多動作控制器類,可同時處理多個不同的請求。如:

  1. @Controller 
  2. publicclassMultiActionController { 
  3.     @RequestMapping("/listUsers") 
  4.     public ModelAndView listUsers() { 
  5.     } 
  6.     @RequestMapping("/saveUser") 
  7.     public ModelAndView saveUser(User user) { 
  8.     } 
  9.     @RequestMapping("/deleteUser") 
  10.     public ModelAndView deleteUser(User user) { 
  11.     } 

如上所示,有三個處理器(handler)在分別處理三個請求,/listUsers,/saveUser,和/deleteUser。

2. 實現控制器接口

在Spring MVC中創建控制器還可以用另一個經典的方法,即對一個類實現Controller接口。如:

  1. import javax.servlet.http.HttpServletRequest; 
  2. import javax.servlet.http.HttpServletResponse; 
  3. import org.springframework.web.servlet.ModelAndView; 
  4. import org.springframework.web.servlet.mvc.Controller; 
  5. publicclassMainControllerimplements Controller { 
  6.     @Override 
  7.     public ModelAndView handleRequest(HttpServletRequest request, 
  8.             HttpServletResponse response) throws Exception { 
  9.         System.out.println("Welcome main"); 
  10.         returnnew ModelAndView("main"); 
  11.     } 

實現類必須重寫handleRequest()方法(當收到相匹配的請求時,Spring dispatcher servlet會調用handleRequest)。由該控制器處理的請求URL模式在Spring的內容配置文件中的定義如下:

  1. <beannamebeanname="/main"class="net.codejava.spring.MainController"/> 

這一方法的缺點在于其控制類無法同時處理多個請求URL。

3. 繼承AbstractController類

如果想要輕松控制受支持的HTTP方法、會話和內容緩存,讓控制類繼承AbstractController類是理想的方法。如:

  1. import javax.servlet.http.HttpServletRequest; 
  2. import javax.servlet.http.HttpServletResponse; 
  3. import org.springframework.web.servlet.ModelAndView; 
  4. import org.springframework.web.servlet.mvc.AbstractController; 
  5. publicclassBigControllerextends AbstractController { 
  6.     @Override 
  7.     protected ModelAndView handleRequestInternal(HttpServletRequest request, 
  8.             HttpServletResponse response) throws Exception { 
  9.         System.out.println("You're big!"); 
  10.         returnnew ModelAndView("big"); 
  11.     } 

上例創建了一個配置了受支持的方法、會話和緩存的單動作控制器,能夠在控制器的bean聲明中被指明。如:

  1. <beannamebeanname="/big"class="net.codejava.spring.BigController"> 
  2.     <propertynamepropertyname="supportedMethods"value="POST"/> 
  3. </bean> 

這一配置表明該控制器handler方法僅支持POST方法。了解更多配置(如會話、緩存),參見AbstractController。 SpringMVC還提供了多個支持特定目的的控制器類,包括:

  • AbstractUrlViewController
  • MultiActionController
  • ParameterizableViewController
  • ServletForwardingController
  • ServletWrappingController
  • UrlFilenameViewController

4. 為處理器指定URL映射

這是編寫控制器類必不可少的一步,旨在處理一個及以上特定請求。Spring MVC提供了@RequestMapping注解,用于指定URL映射。如:

  1. @RequestMapping("/login") 

這一步映射了URL模式/login,并用注解或注解類對其進行了處理。@RequestMapping注解用于類上時,類變成了單動作控制器。如:

  1. import org.springframework.stereotype.Controller; 
  2. import org.springframework.web.bind.annotation.RequestMapping; 
  3. import org.springframework.web.bind.annotation.RequestMethod; 
  4. @Controller 
  5. @RequestMapping("/hello") 
  6. publicclassSingleActionController { 
  7.     @RequestMapping(method = RequestMethod.GET) 
  8.     publicString sayHello() { 
  9.         return"hello"; 
  10.     } 

@RequestMapping注解用于方法上時,則可生成多動作控制器。如:

  1. import org.springframework.stereotype.Controller; 
  2. import org.springframework.web.bind.annotation.RequestMapping; 
  3. @Controller 
  4. publicclassUserController { 
  5.     @RequestMapping("/listUsers") 
  6.     publicString listUsers() { 
  7.         return"ListUsers"; 
  8.     } 
  9.     @RequestMapping("/saveUser") 
  10.     publicString saveUser() { 
  11.         return"EditUser"; 
  12.     } 
  13.     @RequestMapping("/deleteUser") 
  14.     publicString deleteUser() { 
  15.         return"DeleteUser"; 
  16.     } 

@RequestMapping注解也可用于指定多個URL模式,并用單一方法對其進行處理。如:

  1. @RequestMapping({"/hello", "/hi", "/greetings"}) 

此外,該注解還有其他的屬性,在一些情況下能發揮作用,如下一小節將講到的method屬性。

5. 為處理器方法指定HTTP請求方法

使用@RequestMapping注解的method屬性,可以指定處理器方法支持的HTTP方法(包括GET、POST、PUT等)。如:

  1. import org.springframework.stereotype.Controller; 
  2. import org.springframework.web.bind.annotation.RequestMapping 
  3. import org.springframework.web.bind.annotation.RequestMethod; 
  4. @Controller 
  5. publicclassLoginController { 
  6.     @RequestMapping(value = "/login"method = RequestMethod.GET) 
  7.     publicString viewLogin() { 
  8.         return"LoginForm"; 
  9.     } 
  10.     @RequestMapping(value = "/login"method = RequestMethod.POST) 
  11.     publicString doLogin() { 
  12.         return"Home"; 
  13.     } 

如上所示,對于同一個URL模式/login,該控制器有兩個處理方法。第一個方法用于GET方法,第二個則用于POST方法。 了解更多@RequestMapping注解相關知識,參見@RequestMapping注解。

6. 將請求參數映射至處理器方法

SpringMVC的特征之一,就是可以使用@RequestParam注解將請求參數作為處理器方法的常規參數取回。這是一個將控制器從ServletAPI的HttpServletRequest接口中解耦出來的好方法。 如:

  1. @RequestMapping(value = "/login"method = RequestMethod.POSTpublic String doLogin(@RequestParamString username @RequestParamString password) {} 

Spring將方法參數用戶名及密碼和命名相同的HTTP請求參數綁定到一起。這也就意味著可用如下方式調用一個URL(以GET請求方法為例):

http://localhost:8080/spring/login?username=scott&password=tiger 類型轉換也自動完成了。如果對一個integer類型的參數聲明如下:

  1. @RequestParamint securityNumber 

則Spring會在處理方法中自動將請求參數的值(String類型)轉換為指定類型(integer)。 為防止參數名與變量名不同,可將參數實名指定如下:

  1. @RequestParam("SSN") int securityNumber 

@RequestParam注解還有另外兩個屬性,可在一些情況下發揮作用。其中一個屬性是required,可指定一個參數是強制參數還是可選參數。如:

  1. @RequestParam(required = false) String country 

這就意味著參數country是可選的,在請求中可略去。當請求中沒有參數country時,則變量country為空值。 另一個屬性是defaultValue,可在請求參數為空時充當回退值(fallbackvalue)。如:

  1. @RequestParam(defaultValue = "18") int age 

當方法參數類型為Map

  1. doLogin(@RequestParam Map<String, String> params) 

則映射參數包含所有鍵值對形式的請求參數。了解更多@RequestParam注解相關知識,參見@RequestParam注解。

7. 返回模型和視圖

處理器方法在處理完業務邏輯后,會返回一個視圖,該視圖隨后由Springdispatcher servlet進行解析。Spring支持handler方法返回String對象或ModelAndView對象。如下所示,handler方法返回了一個String對象,并表示了視圖名LoginForm:

  1. @RequestMapping(value = "/login"method = RequestMethod.GET) 
  2. public String viewLogin() { 
  3.     return"LoginForm"; 

這是返回視圖名最簡單的方法。但是如果想要發送其他數據到視圖,則必須返回ModelAndView對象。如:

  1. @RequestMapping("/listUsers") 
  2. public ModelAndView listUsers() { 
  3.     List<User> listUser = new ArrayList<>(); 
  4.     // get user list from DAO... 
  5.     ModelAndView modelView = new ModelAndView("UserList"); 
  6.     modelView.addObject("listUser", listUser); 
  7.     return modelView; 

如上所示,該處理器方法返回了一個ModelAndView對象,該對象視圖名為UserList,并有一個可用在視圖中的User對象集。 Spring是一個非常靈活的框架,支持將ModelAndView對象聲明為處理器方法的參數,而無需再重新創建一個。因此,上例可以重寫為:

  1. @RequestMapping("/listUsers") 
  2. public ModelAndView listUsers(ModelAndView modelView) { 
  3.     List<User> listUser = new ArrayList<>(); 
  4.     // get user list from DAO... 
  5.     modelView.setViewName("UserList"); 
  6.     modelView.addObject("listUser", listUser); 
  7.     return modelView; 

了解更多ModelAndView類相關知識,參見ModelAndView類。

8. 將對象放入模型

在MVC架構的應用程序中,控制器將數據輸入到模型中,該模型則被用在視圖中。從上一節中的舉例中可以看到,ModelAndView類的addObject()用于將對象以名值對的形式放入模型中:

  1. modelView.addObject("listUser", listUser); 
  2. modelView.addObject("siteName", newString("CodeJava.net")); 
  3. modelView.addObject("users", 1200000); 

Spring同樣支持聲明處理器方法中的Map類型參數。Spring使用這一映射存儲將放入模型的對象。如:

  1. @RequestMapping(method = RequestMethod.GET) 
  2. publicStringviewStats(Map<String, Object> model) { 
  3.     model.put("siteName", "CodeJava.net"); 
  4.     model.put("pageviews", 320000); 
  5.     return"Stats"; 

這一方法比使用ModelAndView對象更加簡單。Spring支持用戶靈活選擇Map對象和ModelAndView對象。

9. 處理器方法中的重定向

當條件允許時,只需在URL前加上redirect:/就可將用戶重定向跳轉到另一個URL。如:

  1. // check login status.... 
  2. if (!isLogin) { 
  3.     returnnew ModelAndView("redirect:/login"); 
  4. // return a list of Users 

在上述代碼中,沒有登陸的用戶將會跳轉到/loginURL。

10. 處理表單提交和表單驗證

Spring中的@ModelAttribute注解支持將表單字段綁定到表單返回對象,BingingRequest接口則支持驗證表單字段。這使得處理表單提交變得非常簡單。一個處理和驗證表單數據的典型處理器方法的代碼如下所示:

  1. @Controller 
  2. publicclassRegistrationController { 
  3.     @RequestMapping(value = "/doRegister"method = RequestMethod.POST) 
  4.     publicString doRegister( 
  5.         @ModelAttribute("userForm") User user, BindingResult bindingResult) { 
  6.         if (bindingResult.hasErrors()) { 
  7.             // form validation error 
  8.         } else { 
  9.             // form input is OK 
  10.         } 
  11.         // process registration... 
  12.         return"Success"; 
  13.     } 

了解更多@ModelAttribute注解和BindingResult接口相關知識,參見Spring官方文檔:

  • Using @ModelAttribute on a method argument
  • Using @ModelAttribute on a method
  • Interface BindingResult

11. 處理文件上傳

Spring支持自動將上傳數據綁定到CommonsMultiparFile數組對象,這使得在處理器方法中處理文件上傳變得非常簡單。Spring使用Apache CommonsFileUpload作為深層多部分解析器(underlyingmultipart resolver)。 簡單上傳用戶文件的代碼如下所示:

  1. @RequestMapping(value = "/uploadFiles"method = RequestMethod.POST) 
  2. publicStringhandleFileUpload( 
  3.         @RequestParam CommonsMultipartFile[] fileUpload) throws Exception { 
  4.     for (CommonsMultipartFile aFile : fileUpload){ 
  5.         // stores the uploaded file 
  6.         aFile.transferTo(new File(aFile.getOriginalFilename())); 
  7.     } 
  8.     return"Success"; 

了解Spring MVC處理文件上傳的完整方法,參見Spring MVC 文件上傳教程。

12. 在處理器中自動注入業務類

為了讓控制器將業務邏輯處理委托到相關業務類,可以使用@Autowired注解,讓Spring自動將業務類的實際實現注入到控制器中。如:

  1. @Controller 
  2. publicclassUserController { 
  3.     @Autowired 
  4.     private UserDAO userDAO; 
  5.     publicString listUser() { 
  6.         // handler method to list all users 
  7.         userDAO.list(); 
  8.     } 
  9.     publicString saveUser(User user) { 
  10.         // handler method to save/update a user 
  11.         userDAO.save(user); 
  12.     } 
  13.     publicString deleteUser(User user) { 
  14.         // handler method to delete a user 
  15.         userDAO.delete(user); 
  16.     } 
  17.     publicString getUser(int userId) { 
  18.         // handler method to get a user 
  19.         userDAO.get(userId); 
  20.     } 

本例中所有與用戶管理相關的業務邏輯都由UserDAO接口的實現提供。如:

  1. interfaceUserDAO { 
  2.     List<User> list(); 
  3.     void save(User user); 
  4.     void checkLogin(User user); 

如上所示,使用@Autowired注解使處理器方法可以將任務委托到業務類:

  1. List<User> listUser = userDAO.list(); 

了解更多@Autowired注解相關知識,參見Annotation TypeAutowired。

13. 獲取HttpServletRequest和HttpServletResponse

有些情況要求在處理器方法中直接獲取HttpServletRequest或HttpServletResponse對象。在Spring靈活的框架中,僅需給處理器方法加上一個相關參數就可以完成此任務。如:

  1. @RequestMapping("/download") 
  2. publicStringdoDownloadFile( 
  3.         HttpServletRequest request, HttpServletResponse response) { 
  4.     // access the request 
  5.     // access the response 
  6.     return"DownloadPage"; 

Spring支持檢測并自動將HttpServletRequest和HttpServletResponse對象注入到方法中。這樣一來,就可以直接獲取請求和響應,如獲取InputStream、OutputStream或返回特定的HTTP代碼。

14. 遵守單一職責原則

在Spring MVC中設計和編寫控制器時,應遵循以下兩個非常實用的操作:

  • 不要用控制器類來執行業務邏輯,應該用控制器類將業務處理委托到相關的業務類。這可以保證控制器專注于其指定職責,即控制應用程序的工作流。如:
    1. @Controller 
    2. publicclassUserController { 
    3.     @Autowired 
    4.     private UserDAO userDAO; 
    5.     publicString listUser() { 
    6.         // handler method to list all users 
    7.         userDAO.list(); 
    8.     } 
    9.     publicString saveUser(User user) { 
    10.         // handler method to save/update a user 
    11.         userDAO.save(user); 
    12.     } 
    13.     publicString deleteUser(User user) { 
    14.         // handler method to delete a user 
    15.         userDAO.delete(user); 
    16.     } 
    17.     publicString getUser(int userId) { 
    18.         // handler method to get a user 
    19.         userDAO.get(userId); 
    20.     } 
  • 給每個業務領域創建一個獨立的控制器。如,用UserController控制用戶管理的工作流,用OrderController控制訂單處理的工作流,等等:
    1. @Controller 
    2. publicclassUserController { 
    3. @Controller 
    4. publicclassProductController { 
    5. @Controller 
    6. publicclassOrderController { 
    7. @Controller 
    8. publicclassPaymentController { 

以上就是本文全部內容,希望這14個小技巧可以幫助讀者準確且高效地編寫Spring MVC中的控制器類代碼。

 

責任編輯:趙寧寧 來源: 讀芯術
相關推薦

2020-03-06 18:43:58

Spring MVC控制器Java

2023-02-13 15:09:01

開發webCSS技巧

2011-03-08 08:58:37

springmvc

2021-03-15 08:13:19

JavaScript開發代碼

2022-11-01 15:57:44

2023-10-26 18:03:14

索引Python技巧

2016-05-10 10:16:13

JavaScript技巧

2017-10-30 17:25:11

javascript

2020-02-24 20:45:33

控制器技術選型技巧

2009-01-12 11:16:58

控制器控制器行為行為結果

2020-12-24 09:18:51

SQL數據庫函數

2023-01-09 17:23:14

CSS技巧

2009-06-19 13:03:31

JavaFX

2022-08-16 10:53:56

JavaScript前端技巧

2011-06-01 09:59:52

2021-04-20 22:23:33

iOS蘋果系統

2023-10-06 08:42:26

2021-04-20 09:55:37

Linux 開源操作系統

2011-06-22 13:07:37

MVC

2019-10-10 16:31:51

PyCharmPythonWindows
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 免费在线成人网 | 日日夜夜91 | 国产一级片免费视频 | 欧美精品在线视频 | 成人在线中文字幕 | 国产精品视频一区二区三区不卡 | 欧美精选一区二区 | 国产91丝袜在线熟 | 国产精品久久久久av | 欧美日韩在线免费观看 | 三a毛片 | 日韩高清在线观看 | 日韩三级在线 | 亚洲一区二区黄 | 亚洲成人精品 | 亚洲一区二区三区乱码aⅴ 四虎在线视频 | 美国十次成人欧美色导视频 | 亚洲精品综合 | 伊人手机在线视频 | a中文在线视频 | 黄色毛片视频 | 成人妇女免费播放久久久 | 91精品久久久久久久久 | 亚洲乱码一区二区三区在线观看 | 欧美视频免费在线观看 | 天天弄天天操 | 免费一级片 | 久久精品国产一区二区电影 | 国产片侵犯亲女视频播放 | 大香网伊人 | 日本一本在线 | 亚洲不卡在线观看 | 国产色在线 | 亚洲精品1区 | 成人影院网站ww555久久精品 | 亚洲成人中文字幕 | 啪啪av| 97伦理最新伦理 | 国产成人精品久久二区二区 | 免费99精品国产自在在线 | 一区二区在线 |