Java:14 个 Spring MVC 顶级技巧,随时用随时爽,一直用一直爽
轉自:失控的狗蛋~
鏈接:blog.csdn.net/Summer_Lyf/article/details/102911215
通常,在Spring MVC中,我們編寫一個控制器類來處理來自客戶端的請求。然后,控制器調用業務類來處理與業務相關的任務,然后將客戶端重定向到邏輯視圖名稱,該名稱由Spring的調度程序Servlet解析,以呈現結果或輸出。
這樣就完成了典型的請求-響應周期的往返。
今天整理了一下編寫Spring MVC控制器的14個技巧,你今天get到了嗎?(≧▽≦)/
1.使用@Controller構造型
這是創建可以處理一個或多個請求的控制器類的最簡單方法。僅通過用構造型注釋一個類@Controller ,例如:
import?org.springframework.stereotype.Controller; import?org.springframework.web.bind.annotation.RequestMapping; @Controller public?class?HomeController?{@RequestMapping("/")public?String?visitHome()?{return?"home";} }如你所見,visitHome()方法通過重定向到名為home的視圖來處理來自應用程序上下文路徑(/)的請求。
注意:@Controller原型只能在Spring的配置文件中啟用注解驅動時使用:
<annotation-driven?/>啟用注釋驅動時,Spring容器自動在以下語句指定的包下掃描類:
<context:component-scan?base-package="net.codejava.spring"?/>由@Controller 注釋注釋的類被配置為控制器。這是最可取的,因為它很簡單:無需在配置文件中為控制器聲明bean。
注意:通過使用@Controller 注解,您可以擁有一個多動作控制器類,該類能夠處理多個不同的請求。例如:
@Controller public?class?MultiActionController?{@RequestMapping("/listUsers")public?ModelAndView?listUsers()?{}@RequestMapping("/saveUser")public?ModelAndView?saveUser(User?user)?{}@RequestMapping("/deleteUser")public?ModelAndView?deleteUser(User?user)?{} }正如你可以在上面的控制器類看,有處理三種不同的請求3種處理方法 /listUsers,/saveUser,和/deleteUser分別。
2.實現控制器接口
在Spring MVC中創建控制器的另一種(也許是經典的)方法是讓類實現 Controller 接口。例如:
import?javax.servlet.http.HttpServletRequest; import?javax.servlet.http.HttpServletResponse; import?org.springframework.web.servlet.ModelAndView; import?org.springframework.web.servlet.mvc.Controller; public?class?MainController?implements?Controller?{@Overridepublic?ModelAndView?handleRequest(HttpServletRequest?request,HttpServletResponse?response)?throws?Exception?{System.out.println("Welcome?main");return?new?ModelAndView("main");} }實現類必須重寫該 handleRequest() 方法,當匹配請求進入時,該方法將由Spring調度程序Servlet調用。此控制器處理的請求URL模式在Spring的上下文配置文件中定義如下:
<bean?name="/main"?class="net.codejava.spring.MainController"?/>但是,此方法的缺點是控制器類無法處理多個請求URL。
3.擴展AbstractController類
如果要輕松控制受支持的HTTP方法,會話和內容緩存。擴展你的控制器 AbstractController 類是理想的選擇。請考慮以下示例:
import?javax.servlet.http.HttpServletRequest; import?javax.servlet.http.HttpServletResponse; import?org.springframework.web.servlet.ModelAndView; import?org.springframework.web.servlet.mvc.AbstractController; public?class?BigController?extends?AbstractController?{@Overrideprotected?ModelAndView?handleRequestInternal(HttpServletRequest?request,HttpServletResponse?response)?throws?Exception?{System.out.println("You're?big!");return?new?ModelAndView("big");} }這將創建具有有關受支持的方法,會話和緩存的配置的單動作控制器,然后可以在控制器的bean聲明中指定這些配置。例如:
<bean?name="/big"?class="net.codejava.spring.BigController"><property?name="supportedMethods"?value="POST"/> </bean>此配置指示POST 此控制器的hander 方法僅支持該方法。
Spring MVC還提供了幾種針對特定目的而設計的控制器類,包括:
AbstractUrlViewController
MultiActionController
ParameterizableViewController
ServletForwardingController
ServletWrappingController
UrlFilenameViewController
4.為處理程序方法指定URL映射
這是編碼控制器類時必須執行的強制性任務,該控制器類旨在處理一個或多個特定請求。Spring MVC提供了@RequestMapping 注釋,該注解用于指定URL映射。例如:
@RequestMapping("/login")這映射了/login 要由帶注解的方法或類處理的URL模式。當在類級別使用此注解時,該類將成為單動作控制器。例如:
import?org.springframework.stereotype.Controller; import?org.springframework.web.bind.annotation.RequestMapping; import?org.springframework.web.bind.annotation.RequestMethod; @Controller @RequestMapping("/hello") public?class?SingleActionController?{@RequestMapping(method?=?RequestMethod.GET)public?String?sayHello()?{return?"hello";} }當@RequestMapping 注解在方法級別使用的,你可以有一個多動作控制器。例如:
import?org.springframework.stereotype.Controller; import?org.springframework.web.bind.annotation.RequestMapping; @Controller public?class?UserController?{@RequestMapping("/listUsers")public?String?listUsers()?{return?"ListUsers";}@RequestMapping("/saveUser")public?String?saveUser()?{return?"EditUser";}@RequestMapping("/deleteUser")public?String?deleteUser()?{return?"DeleteUser";} }@RequestMapping注釋還可以用于指定一個方法要處理的多個URL模式。例如:
@RequestMapping({"/hello",?"/hi",?"/greetings"})此外,此注解還具有在某些情況下可能有用的其他屬性,例如method。
5.為處理程序方法指定HTTP請求方法
可以使用 注解的method 屬性 指定處理程序方法支持哪種HTTP方法(GET,POST,PUT等) @RequestMapping。這是一個例子:
import?org.springframework.stereotype.Controller; import?org.springframework.web.bind.annotation.RequestMapping; import?org.springframework.web.bind.annotation.RequestMethod; @Controller public?class?LoginController?{@RequestMapping(value?=?"/login",?method?=?RequestMethod.GET)public?String?viewLogin()?{return?"LoginForm";}@RequestMapping(value?=?"/login",?method?=?RequestMethod.POST)public?String?doLogin()?{return?"Home";} }此控制器有兩個處理相同URL模式的方法/login,但前者用于 GET 方法,而后者用于 POST 方法。有關使用@RequestMapping 注解的更多信息,請參見 @RequestMapping注解。
6.將請求參數映射到處理程序方法
Spring MVC的很酷的功能之一是,您可以使用@RequestParam 注解將請求參數作為處理程序方法的常規參數進行檢索。這是將控制器HttpServletRequest 與Servlet API 的接口分離的好方法。
@RequestMapping(value?=?"/login",?method?=?RequestMethod.POST) public?String?doLogin(@RequestParam?String?username,@RequestParam?String?password)?{ }Spring將方法參數用戶名和密碼綁定到具有相同名稱的HTTP請求參數。這意味著您可以按以下方式調用URL(如果請求方法是GET):
http:// localhost:8080?/ spring / login?username = scott&password = tiger類型轉換也是自動完成的。例如,如果您聲明integer 如下類型的參數 :
@RequestParam?int?securityNumber然后,Spring將在處理程序方法中自動將請求參數(字符串)的值轉換為指定的類型(整數)。
如果參數名稱與變量名稱不同,則可以如下指定參數的實際名稱:
@RequestParam("SSN")?int?securityNumber該@RequestParam 注解也有兩個額外的屬性,這可能是在某些情況下是有用的。該屬性指定參數是否為必需。例如:required
@RequestParam(required?=?false)?String?country這意味著該參數 country 是可選的;因此,它可能會從請求中丟失。在上面的示例中,country 如果請求中不存在此類參數,則變量 將為null。
另一個屬性是 defaultValue,可以在請求參數為空時用作后備值。例如:
@RequestParam(defaultValue?=?"18")?int?ageMap 如果方法參數是type,Spring還允許我們將所有參數作為對象 訪問 Map<String, String>。例如:
doLogin(@RequestParam?Map<String,?String>?params)然后,映射參數包含鍵-值對形式的所有請求參數。有關使用@RequestParam 注釋的更多信息,請參見 @RequestParam注解。
7.返回模型和視圖
處理完業務邏輯后,處理程序方法應返回一個視圖,然后由Spring的調度程序servlet對其進行解析。Spring允許我們ModelAndView 從handler 方法中返回String或 對象 。
在以下示例中,該 handler 方法返回一個String并表示一個名為的視圖 LoginForm:
@RequestMapping(value?=?"/login",?method?=?RequestMethod.GET) public?String?viewLogin()?{return?"LoginForm"; }這是返回視圖名稱的最簡單方法。但是,如果要將其他數據發送到視圖,則必須返回一個 ModelAndView 對象。考慮以下處理程序方法:
@RequestMapping("/listUsers") public?ModelAndView?listUsers()?{List<User>?listUser?=?new?ArrayList<>();//?從DAO獲取用戶列表…ModelAndView?modelView?=?new?ModelAndView("UserList");modelView.addObject("listUser",?listUser);return?modelView; }如您所見,此處理程序方法返回一個 ModelAndView 保存視圖名稱 UserList 的User 對象和一個可在視圖中使用的對象集合 。Spring 面試 7 大問題,推薦看下。
Spring也非常靈活,因為您可以將ModelAndView 對象聲明 為處理程序方法的參數,而不用創建一個新的對象。因此,以上示例可以重寫如下:
@RequestMapping("/listUsers") public?ModelAndView?listUsers(ModelAndView?modelView)?{List<User>?listUser?=?new?ArrayList<>();//從DAO獲取用戶列表…modelView.setViewName("UserList");modelView.addObject("listUser",?listUser);return?modelView; }了解有關該類的更多信息,請參見:ModelAndView class。
8.將對象放入模型
在遵循MVC架構的應用程序中,控制器(C)應該將數據傳遞到模型(M)中,然后在視圖(V)中使用該模型。正如我們在前面的示例中看到的那樣, 該類的addObject() 方法 ModelAndView是以名稱-值對的形式將對象放入模型中:
modelView.addObject("listUser",?listUser); modelView.addObject("siteName",?new?String("CodeJava.net")); modelView.addObject("users",?1200000);同樣,Spring非常靈活。你可以Map 在處理程序方法中聲明類型的參數 。Spring使用此映射存儲模型的對象。讓我們看另一個例子:
@RequestMapping(method?=?RequestMethod.GET) public?String?viewStats(Map<String,?Object>?model)?{model.put("siteName",?"CodeJava.net");model.put("pageviews",?320000);return?"Stats"; }這比使用ModelAndView 對象還要簡單 。根據你的喜好,可以使用Map 或 使用 ModelAndView 對象。在這里要感謝Spring的靈活性。
9.處理程序方法中的重定向
如果你希望在滿足條件的情況下將用戶重定向到另一個URL,請redirect:/ 在URL之前追加。以下代碼段給出了一個示例:
//?檢查登錄狀態.... if?(!isLogin)?{return?new?ModelAndView("redirect:/login"); } //?返回用戶列表在上面的代碼中,/login 如果未登錄,用戶將被重定向到該 URL。
10.處理表格提交和表格驗證
通過提供@ModelAttribute 用于將表單字段綁定到表單支持對象的注解以及BindingResult 用于驗證表單字段的界面,Spring使處理表單提交變得容易。下面的代碼片段顯示了一種典型的處理程序方法,該方法負責處理和驗證表單數據:
@Controller public?class?RegistrationController?{@RequestMapping(value?=?"/doRegister",?method?=?RequestMethod.POST)public?String?doRegister(@ModelAttribute("userForm")?User?user,?BindingResult?bindingResult)?{if?(bindingResult.hasErrors())?{//?表單驗證錯誤}?else?{//?表單輸入沒問題}//?注冊過程……return?"Success";} }從Spring的官方文檔中了解有關@ModelAttribute 注釋和BindingResult 接口的更多信息:
在方法參數上使用@ModelAttribute
在方法上使用@ModelAttribute
接口綁定結果
11.處理文件上傳
通過自動將上傳數據綁定到CommonsMultipartFile 對象數組,Spring還使在處理程序方法中處理文件上傳變得容易。Spring使用Apache Commons FileUpload作為基礎的多部分解析器。
以下代碼段顯示了從客戶端上傳文件有多么容易
@RequestMapping(value?=?"/uploadFiles",?method?=?RequestMethod.POST) public?String?handleFileUpload(@RequestParam?CommonsMultipartFile[]?fileUpload)?throws?Exception?{for?(CommonsMultipartFile?aFile?:?fileUpload){//?存儲上傳的文件aFile.transferTo(new?File(aFile.getOriginalFilename()));}return?"Success"; }12.在控制器中自動裝配業務類
控制器應將業務邏輯的處理委托給相關的業務類。為此,您可以使用@Autowired 注解讓Spring自動將業務類的實際實現注入控制器。
考慮以下控制器類的代碼段:
@Controller public?class?UserController?{@Autowiredprivate?UserDAO?userDAO;public?String?listUser()?{//?列出所有用戶的處理方法userDAO.list();}public?String?saveUser(User?user)?{//?保存/更新用戶的處理方法userDAO.save(user);}public?String?deleteUser(User?user)?{//?刪除用戶的處理方法userDAO.delete(user);}public?String?getUser(int?userId)?{//?獲取用戶的處理方法userDAO.get(userId);} }在此,與用戶管理有關的所有業務邏輯都由該UserDAO 接口的實現提供 。例如:
interface?UserDAO?{List<User>?list();void?save(User?user);void?checkLogin(User?user); }有關@Autowired 注解的更多信息,請參見 注釋類型自動裝配。
13.訪問HttpServletRequest和HttpServletResponse
在某些情況下,您需要直接 在處理程序方法中訪問 HttpServletRequest 或 HttpServletResponse對象。
通過Spring的靈活性,只需在處理方法中添加相關參數即可。例如:
@RequestMapping("/download") public?String?doDownloadFile(HttpServletRequest?request,?HttpServletResponse?response)?{//?訪問請求//?訪問響應return?"DownloadPage"; }Spring檢測并自動將 HttpServletRequest 和 HttpServletResponse 對象注入方法中。然后,可以訪問請求和響應如獲取 InputStream, OutputStream或返回一個特定的HTTP代碼。
14.遵循單一責任原則
最后,在設計和編寫Spring MVC控制器時,有兩個很好的實踐是你應該遵循的:
1)控制器類不應執行業務邏輯。相反,它應該將業務處理委托給相關的業務類別。這使控制器始終專注于其設計職責是控制應用程序的工作流程。例如:
@Controller public?class?UserController?{@Autowiredprivate?UserDAO?userDAO;public?String?listUser()?{userDAO.list();}public?String?saveUser(User?user)?{userDAO.save(user);}public?String?deleteUser(User?user)?{userDAO.delete(user);}public?String?getUser(int?userId)?{userDAO.get(userId);} }2)為每個業務域創建每個單獨的控制器。例如, UserController 用于控制用戶管理的OrderController 工作流程, 用于控制訂單處理的工作流程等。例如:
@Controller public?class?UserController?{ } @Controller public?class?ProductController?{ } @Controller public?class?OrderController?{ } @Controller public?class?PaymentController?{ }IT技術分享社區
個人博客網站:https://programmerblog.xyz
文章推薦程序員效率:畫流程圖常用的工具程序員效率:整理常用的在線筆記軟件遠程辦公:常用的遠程協助軟件,你都知道嗎?51單片機程序下載、ISP及串口基礎知識硬件:斷路器、接觸器、繼電器基礎知識
總結
以上是生活随笔為你收集整理的Java:14 个 Spring MVC 顶级技巧,随时用随时爽,一直用一直爽的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 取消开机就弹出 msn中文网 操作步骤
- 下一篇: 后端:Java 8 中的 Map 实用操