自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

分享14個Spring MVC頂級技巧!

開發(fā) 后端
今天整理了一下編寫Spring MVC控制器的14個技巧,你今天get到了嗎?

 [[317714]]

通常,在Spring MVC中,我們編寫一個控制器類來處理來自客戶端的請求。然后,控制器調用業(yè)務類來處理與業(yè)務相關的任務,然后將客戶端重定向到邏輯視圖名稱,該名稱由Spring的調度程序Servlet解析,以呈現(xiàn)結果或輸出。

這樣就完成了典型的請求-響應周期的往返。

今天整理了一下編寫Spring MVC控制器的14個技巧,你今天get到了嗎? \(≧▽≦)/

1.使用@Controller構造型

這是創(chuàng)建可以處理一個或多個請求的控制器類的最簡單方法。僅通過用構造型注釋一個類@Controller ,例如: 

  1. import org.springframework.stereotype.Controller;  
  2. import org.springframework.web.bind.annotation.RequestMapping;  
  3. @Controller  
  4. public class HomeController {  
  5.     @RequestMapping("/")  
  6.     public String visitHome() {     
  7.         return "home";  
  8.     }  

如你所見,visitHome()方法通過重定向到名為home的視圖來處理來自應用程序上下文路徑(/)的請求。

注意:@Controller原型只能在Spring的配置文件中啟用注解驅動時使用: 

  1. <annotation-driven /> 

啟用注釋驅動時,Spring容器自動在以下語句指定的包下掃描類: 

  1. <context:component-scan base-package="net.codejava.spring" /> 

由@Controller 注釋注釋的類被配置為控制器。這是最可取的,因為它很簡單:無需在配置文件中為控制器聲明bean。

注意:通過使用@Controller 注解,您可以擁有一個多動作控制器類,該類能夠處理多個不同的請求。例如: 

  1. @Controller  
  2. public class MultiActionController {  
  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.     }  

正如你可以在上面的控制器類看,有處理三種不同的請求3種處理方法   /listUsers,/saveUser,和/deleteUser分別。

2.實現(xiàn)控制器接口

在Spring MVC中創(chuàng)建控制器的另一種(也許是經(jīng)典的)方法是讓類實現(xiàn)  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. public class MainController implements Controller {  
  6.     @Override  
  7.     public ModelAndView handleRequest(HttpServletRequest request,  
  8.             HttpServletResponse response) throws Exception {  
  9.         System.out.println("Welcome main");  
  10.         return new ModelAndView("main");  
  11.     }  

實現(xiàn)類必須重寫該  handleRequest() 方法,當匹配請求進入時,該方法將由Spring調度程序Servlet調用。此控制器處理的請求URL模式在Spring的上下文配置文件中定義如下: 

  1. <bean name="/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. public class BigController extends AbstractController {  
  6.     @Override  
  7.     protected ModelAndView handleRequestInternal(HttpServletRequest request,  
  8.             HttpServletResponse response) throws Exception {  
  9.         System.out.println("You're big!");  
  10.         return new ModelAndView("big");  
  11.     }  

這將創(chuàng)建具有有關受支持的方法,會話和緩存的配置的單動作控制器,然后可以在控制器的bean聲明中指定這些配置。例如:  

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

此配置指示POST 此控制器的hander 方法僅支持該方法。

Spring MVC還提供了幾種針對特定目的而設計的控制器類,包括:

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

4.為處理程序方法指定URL映射

這是編碼控制器類時必須執(zhí)行的強制性任務,該控制器類旨在處理一個或多個特定請求。Spring MVC提供了@RequestMapping 注釋,該注解用于指定URL映射。例如: 

  1. @RequestMapping("/login") 

這映射了/login 要由帶注解的方法或類處理的URL模式。當在類級別使用此注解時,該類將成為單動作控制器。例如: 

  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. public class SingleActionController {  
  7.     @RequestMapping(method = RequestMethod.GET)  
  8.     public String sayHello() {  
  9.         return "hello";  
  10.     }  

當@RequestMapping 注解在方法級別使用的,你可以有一個多動作控制器。例如: 

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

@RequestMapping注釋還可以用于指定一個方法要處理的多個URL模式。例如: 

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

此外,此注解還具有在某些情況下可能有用的其他屬性,例如method。

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

可以使用 注解的method 屬性   指定處理程序方法支持哪種HTTP方法(GET,POST,PUT等)  @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. public class LoginController {  
  6.     @RequestMapping(value = "/login"method = RequestMethod.GET)  
  7.     public String viewLogin() {  
  8.         return "LoginForm";  
  9.     }  
  10.     @RequestMapping(value = "/login"method = RequestMethod.POST)  
  11.     public String doLogin() {  
  12.         return "Home";  
  13.     }  

此控制器有兩個處理相同URL模式的方法/login,但前者用于  GET 方法,而后者用于  POST 方法。有關使用@RequestMapping 注解的更多信息,請參見  @RequestMapping注解。

6.將請求參數(shù)映射到處理程序方法

Spring MVC的很酷的功能之一是,您可以使用@RequestParam 注解將請求參數(shù)作為處理程序方法的常規(guī)參數(shù)進行檢索。這是將控制器HttpServletRequest 與Servlet API 的接口分離的好方法。 

  1. @RequestMapping(value = "/login"method = RequestMethod.POST)  
  2. public String doLogin(@RequestParam String username,  
  3.                       @RequestParam String password) {  

Spring將方法參數(shù)用戶名和密碼綁定到具有相同名稱的HTTP請求參數(shù)。這意味著您可以按以下方式調用URL(如果請求方法是GET): 

  1. http:// localhost:8080 / spring / login?username = scottpassword = tiger 

類型轉換也是自動完成的。例如,如果您聲明integer 如下類型的參數(shù)  : 

  1. @RequestParam int securityNumber 

然后,Spring將在處理程序方法中自動將請求參數(shù)(字符串)的值轉換為指定的類型(整數(shù))。

如果參數(shù)名稱與變量名稱不同,則可以如下指定參數(shù)的實際名稱: 

  1. @RequestParam("SSN") int securityNumber 

該@RequestParam 注解也有兩個額外的屬性,這可能是在某些情況下是有用的。該屬性指定參數(shù)是否為必需。例如: required  

  1. @RequestParam(required = false) String country 

這意味著該參數(shù)  country 是可選的;因此,它可能會從請求中丟失。在上面的示例中,country 如果請求中不存在此類參數(shù),則變量  將為null。

另一個屬性是  defaultValue,可以在請求參數(shù)為空時用作后備值。例如: 

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

Map 如果方法參數(shù)是type,Spring還允許我們將所有參數(shù)作為對象   訪問  Map<String, String>。例如: 

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

然后,映射參數(shù)包含鍵-值對形式的所有請求參數(shù)。有關使用@RequestParam 注釋的更多信息,請參見  @RequestParam注解。關注微信公眾號:Java技術棧,在后臺回復:spring,可以獲取我整理的 N 篇最新 Spring 教程,都是干貨。

7.返回模型和視圖

處理完業(yè)務邏輯后,處理程序方法應返回一個視圖,然后由Spring的調度程序servlet對其進行解析。Spring允許我們ModelAndView 從handler 方法中返回String或  對象  。

在以下示例中,該  handler 方法返回一個String并表示一個名為的視圖  LoginForm: 

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

這是返回視圖名稱的最簡單方法。但是,如果要將其他數(shù)據(jù)發(fā)送到視圖,則必須返回一個  ModelAndView 對象??紤]以下處理程序方法: 

  1. @RequestMapping("/listUsers")  
  2. public ModelAndView listUsers() {  
  3.     List<User> listUser = new ArrayList<>();  
  4.     // 從DAO獲取用戶列表…  
  5.     ModelAndView modelView = new ModelAndView("UserList");  
  6.     modelView.addObject("listUser", listUser);  
  7.     return modelView;  

如您所見,此處理程序方法返回一個  ModelAndView 保存視圖名稱  UserList 的User 對象和一個可在視圖中使用的對象集合  。Spring 面試 7 大問題,推薦看下。

Spring也非常靈活,因為您可以將ModelAndView 對象聲明  為處理程序方法的參數(shù),而不用創(chuàng)建一個新的對象。因此,以上示例可以重寫如下: 

  1. @RequestMapping("/listUsers")  
  2. public ModelAndView listUsers(ModelAndView modelView) {  
  3.     List<User> listUser = new ArrayList<>();  
  4.     //從DAO獲取用戶列表…  
  5.     modelView.setViewName("UserList");  
  6.     modelView.addObject("listUser", listUser);  
  7.     return modelView;  

了解有關該類的更多信息,請參見:ModelAndView class。 

8.將對象放入模型

在遵循MVC架構的應用程序中,控制器(C)應該將數(shù)據(jù)傳遞到模型(M)中,然后在視圖(V)中使用該模型。正如我們在前面的示例中看到的那樣, 該類的addObject() 方法  ModelAndView是以名稱-值對的形式將對象放入模型中: 

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

同樣,Spring非常靈活。你可以Map 在處理程序方法中聲明類型的參數(shù)  。Spring使用此映射存儲模型的對象。讓我們看另一個例子: 

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

這比使用ModelAndView 對象還要簡單  。根據(jù)你的喜好,可以使用Map 或  使用  ModelAndView 對象。在這里要感謝Spring的靈活性。 

9.處理程序方法中的重定向

如果你希望在滿足條件的情況下將用戶重定向到另一個URL,請redirect:/ 在URL之前追加。以下代碼段給出了一個示例: 

  1. // 檢查登錄狀態(tài)....  
  2. if (!isLogin) {  
  3.     return new ModelAndView("redirect:/login");  
  4.  
  5. // 返回用戶列表 

在上面的代碼中,/login 如果未登錄,用戶將被重定向到該 URL。 

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

通過提供@ModelAttribute 用于將表單字段綁定到表單支持對象的注解以及BindingResult 用于驗證表單字段的界面,Spring使處理表單提交變得容易。下面的代碼片段顯示了一種典型的處理程序方法,該方法負責處理和驗證表單數(shù)據(jù): 

  1. @Controller  
  2. public class RegistrationController {  
  3.     @RequestMapping(value = "/doRegister"method = RequestMethod.POST)  
  4.     public String doRegister(  
  5.         @ModelAttribute("userForm") User user, BindingResult bindingResult) {  
  6.         if (bindingResult.hasErrors()) {  
  7.             // 表單驗證錯誤  
  8.         } else {  
  9.             // 表單輸入沒問題  
  10.         }  
  11.         // 注冊過程……  
  12.         return "Success";  
  13.     }  

從Spring的官方文檔中了解有關@ModelAttribute 注釋和BindingResult 接口的更多信息:

  •  在方法參數(shù)上使用@ModelAttribute
  •  在方法上使用@ModelAttribute
  •  接口綁定結果

11.處理文件上傳

通過自動將上傳數(shù)據(jù)綁定到CommonsMultipartFile 對象數(shù)組,Spring還使在處理程序方法中處理文件上傳變得容易。Spring使用Apache Commons FileUpload作為基礎的多部分解析器。

以下代碼段顯示了從客戶端上傳文件有多么容易 

  1. @RequestMapping(value = "/uploadFiles"method = RequestMethod.POST)  
  2. public String handleFileUpload(  
  3.         @RequestParam CommonsMultipartFile[] fileUpload) throws Exception {  
  4.     for (CommonsMultipartFile aFile : fileUpload){  
  5.         // 存儲上傳的文件  
  6.         aFile.transferTo(new File(aFile.getOriginalFilename()));  
  7.     }  
  8.     return "Success";  

12.在控制器中自動裝配業(yè)務類

控制器應將業(yè)務邏輯的處理委托給相關的業(yè)務類。為此,您可以使用@Autowired 注解讓Spring自動將業(yè)務類的實際實現(xiàn)注入控制器。關注微信公眾號:Java技術棧,在后臺回復:sp,可以獲取我整理的 N 篇最新Spring Boot 教程,都是干貨。

考慮以下控制器類的代碼段: 

  1. @Controller  
  2. public class UserController {  
  3.     @Autowired  
  4.     private UserDAO userDAO;  
  5.     public String listUser() {  
  6.         // 列出所有用戶的處理方法  
  7.         userDAO.list();  
  8.     }  
  9.     public String saveUser(User user) {  
  10.         // 保存/更新用戶的處理方法  
  11.         userDAO.save(user);  
  12.     }  
  13.     public String deleteUser(User user) {  
  14.         // 刪除用戶的處理方法  
  15.         userDAO.delete(user);  
  16.     } 
  17.      public String getUser(int userId) {  
  18.         // 獲取用戶的處理方法  
  19.         userDAO.get(userId);  
  20.     }  

在此,與用戶管理有關的所有業(yè)務邏輯都由該UserDAO 接口的實現(xiàn)提供  。例如: 

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

有關@Autowired 注解的更多信息,請參見  注釋類型自動裝配。

13.訪問HttpServletRequest和HttpServletResponse

在某些情況下,您需要直接 在處理程序方法中訪問  HttpServletRequest 或  HttpServletResponse對象。

通過Spring的靈活性,只需在處理方法中添加相關參數(shù)即可。例如: 

  1. @RequestMapping("/download")  
  2. public String doDownloadFile(  
  3.         HttpServletRequest request, HttpServletResponse response) {  
  4.     // 訪問請求  
  5.     // 訪問響應  
  6.     return "DownloadPage";  

Spring檢測并自動將  HttpServletRequest 和  HttpServletResponse 對象注入方法中。然后,可以訪問請求和響應如獲取  InputStream,  OutputStream或返回一個特定的HTTP代碼。

14.遵循單一責任原則

最后,在設計和編寫Spring MVC控制器時,有兩個很好的實踐是你應該遵循的:

1)控制器類不應執(zhí)行業(yè)務邏輯。相反,它應該將業(yè)務處理委托給相關的業(yè)務類別。這使控制器始終專注于其設計職責是控制應用程序的工作流程。例如: 

  1. @Controller  
  2. public class UserController {  
  3.     @Autowired  
  4.     private UserDAO userDAO;  
  5.     public String listUser() {  
  6.         userDAO.list();  
  7.     }  
  8.     public String saveUser(User user) {  
  9.         userDAO.save(user);  
  10.     }  
  11.     public String deleteUser(User user) {  
  12.         userDAO.delete(user);  
  13.     }  
  14.     public String getUser(int userId) {  
  15.         userDAO.get(userId);  
  16.     }  

2)為每個業(yè)務域創(chuàng)建每個單獨的控制器。例如,  UserController 用于控制用戶管理的OrderController 工作流程,  用于控制訂單處理的工作流程等。例如: 

  1. @Controller  
  2. public class UserController {  
  3.  
  4. @Controller  
  5. public class ProductController {  
  6.  
  7. @Controller  
  8. public class OrderController {  
  9.  
  10. @Controller  
  11. public class PaymentController {  

這14個小技巧,可以幫助你正確有效地在Spring MVC中編寫控制器類。 

 

責任編輯:龐桂玉 來源: Java技術棧
相關推薦

2019-11-17 22:58:03

Spring MVC控制器編寫

2023-02-13 15:09:01

開發(fā)webCSS技巧

2014-08-25 10:19:12

程序員

2015-08-24 16:24:08

程序員開發(fā)社區(qū)頂級社區(qū)

2024-02-01 08:28:28

2015-08-24 15:37:36

國外程序員開發(fā)社區(qū)

2019-11-13 14:58:39

JavaScriptNumbers程序員

2020-05-31 18:57:50

CIO影子ITIT運營

2022-02-24 10:05:20

Python編程語言代碼

2011-07-07 18:39:22

SEO

2024-04-01 07:58:49

Next.js 14ReactWeb應用

2020-03-24 09:54:57

SpringMVCWebFlux

2022-11-01 15:57:44

2019-12-12 20:49:05

JavaScript語言運算符

2012-12-12 13:44:31

Git

2011-03-01 16:00:08

java數(shù)據(jù)庫

2023-01-09 17:23:14

CSS技巧

2025-02-10 00:45:00

pairplotheatmaplmplot

2009-05-13 09:06:26

面試技巧求職技巧

2019-10-29 16:02:14

開發(fā)者技能工具
點贊
收藏

51CTO技術棧公眾號