這篇文章主要介紹編寫Spring MVC控制器的技巧有哪些,文中介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們一定要看完!
宿州網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)公司!從網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、響應(yīng)式網(wǎng)站開發(fā)等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營維護(hù)。創(chuàng)新互聯(lián)公司公司2013年成立到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)公司。1.使用@Controller構(gòu)造型
這是創(chuàng)建可以處理一個或多個請求的控制器類的最簡單方法。僅通過用構(gòu)造型注釋一個類@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的視圖來處理來自應(yīng)用程序上下文路徑(/)的請求。
注意:@Controller原型只能在Spring的配置文件中啟用注解驅(qū)動時使用:
啟用注釋驅(qū)動時,Spring容器自動在以下語句指定的包下掃描類:
由@Controller 注釋注釋的類被配置為控制器。這是最可取的,因?yàn)樗芎唵危簾o需在配置文件中為控制器聲明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.實(shí)現(xiàn)控制器接口
在Spring MVC中創(chuàng)建控制器的另一種(也許是經(jīng)典的)方法是讓類實(shí)現(xiàn) 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 { @Override public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception { System.out.println("Welcome main"); return new ModelAndView("main"); } }
實(shí)現(xiàn)類必須重寫該 handleRequest() 方法,當(dāng)匹配請求進(jìn)入時,該方法將由Spring調(diào)度程序Servlet調(diào)用。此控制器處理的請求URL模式在Spring的上下文配置文件中定義如下:
但是,此方法的缺點(diǎn)是控制器類無法處理多個請求URL
。
3.擴(kuò)展AbstractController類
如果要輕松控制受支持的HTTP方法,會話和內(nèi)容緩存。擴(kuò)展你的控制器 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 { @Override protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception { System.out.println("You're big!"); return new ModelAndView("big"); } }
這將創(chuàng)建具有有關(guān)受支持的方法,會話和緩存的配置的單動作控制器,然后可以在控制器的bean聲明中指定這些配置。例如:
此配置指示POST 此控制器的hander 方法僅支持該方法。
Spring MVC還提供了幾種針對特定目的而設(shè)計(jì)的控制器類,包括:
AbstractUrlViewController
MultiActionController
ParameterizableViewController
ServletForwardingController
ServletWrappingController
UrlFilenameViewController
4.為處理程序方法指定URL映射
這是編碼控制器類時必須執(zhí)行的強(qiáng)制性任務(wù),該控制器類旨在處理一個或多個特定請求。Spring MVC提供了@RequestMapping 注釋,該注解用于指定URL映射。例如:
@RequestMapping("/login")
這映射了/login 要由帶注解的方法或類處理的URL模式。當(dāng)在類級別使用此注解時,該類將成為單動作控制器。例如:
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"; } }
當(dāng)@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 方法。
有關(guān)使用@RequestMapping 注解的更多信息,請參見 @RequestMapping注解。
6.將請求參數(shù)映射到處理程序方法
Spring MVC的很酷的功能之一是,您可以使用@RequestParam 注解將請求參數(shù)作為處理程序方法的常規(guī)參數(shù)進(jìn)行檢索。這是將控制器HttpServletRequest 與Servlet API 的接口分離的好方法。
@RequestMapping(value = "/login", method = RequestMethod.POST) public String doLogin(@RequestParam String username, @RequestParam String password) { }
Spring將方法參數(shù)用戶名和密碼綁定到具有相同名稱的HTTP請求參數(shù)。這意味著您可以按以下方式調(diào)用URL(如果請求方法是GET):
http:// localhost:8080 / spring / login?username = scott&password = tiger
類型轉(zhuǎn)換也是自動完成的。例如,如果您聲明integer 如下類型的參數(shù) :
@RequestParam int securityNumber
然后,Spring將在處理程序方法中自動將請求參數(shù)(字符串)的值轉(zhuǎn)換為指定的類型(整數(shù))。
如果參數(shù)名稱與變量名稱不同,則可以如下指定參數(shù)的實(shí)際名稱:
@RequestParam("SSN") int securityNumber
該@RequestParam 注解也有兩個額外的屬性,這可能是在某些情況下是有用的。該屬性指定參數(shù)是否為必需。例如: required
@RequestParam(required = false) String country
這意味著該參數(shù) country 是可選的;因此,它可能會從請求中丟失。在上面的示例中,country 如果請求中不存在此類參數(shù),則變量 將為null。
另一個屬性是 defaultValue,可以在請求參數(shù)為空時用作后備值。例如:
@RequestParam(defaultValue = "18") int age
Map 如果方法參數(shù)是type,Spring還允許我們將所有參數(shù)作為對象 訪問 Map
doLogin(@RequestParam Mapparams)
然后,映射參數(shù)包含鍵-值對形式的所有請求參數(shù)。有關(guān)使用@RequestParam 注釋的更多信息,請參見 @RequestParam注解。
7.返回模型和視圖
處理完業(yè)務(wù)邏輯后,處理程序方法應(yīng)返回一個視圖,然后由Spring的調(diào)度程序servlet對其進(jìn)行解析。Spring允許我們ModelAndView 從handler 方法中返回String或 對象 。在以下示例中,該 handler 方法返回一個String并表示一個名為的視圖 LoginForm:
@RequestMapping(value = "/login", method = RequestMethod.GET) public String viewLogin() { return "LoginForm"; }
這是返回視圖名稱的最簡單方法。但是,如果要將其他數(shù)據(jù)發(fā)送到視圖,則必須返回一個 ModelAndView 對象??紤]以下處理程序方法:
@RequestMapping("/listUsers") public ModelAndView listUsers() { ListlistUser = new ArrayList<>(); // 從DAO獲取用戶列表… ModelAndView modelView = new ModelAndView("UserList"); modelView.addObject("listUser", listUser); return modelView; }
如您所見,此處理程序方法返回一個 ModelAndView 保存視圖名稱 UserList 的User 對象和一個可在視圖中使用的對象集合 。
Spring也非常靈活,因?yàn)槟梢詫odelAndView 對象聲明 為處理程序方法的參數(shù),而不用創(chuàng)建一個新的對象。因此,以上示例可以重寫如下:
@RequestMapping("/listUsers") public ModelAndView listUsers(ModelAndView modelView) { ListlistUser = new ArrayList<>(); //從DAO獲取用戶列表… modelView.setViewName("UserList"); modelView.addObject("listUser", listUser); return modelView; }
了解有關(guān)該類的更多信息,請參見 :ModelAndView class。
8.將對象放入模型
在遵循MVC架構(gòu)的應(yīng)用程序中,控制器(C)應(yīng)該將數(shù)據(jù)傳遞到模型(M)中,然后在視圖(V)中使用該模型。正如我們在前面的示例中看到的那樣, 該類的addObject() 方法 ModelAndView是以名稱-值對的形式將對象放入模型中:
modelView.addObject("listUser", listUser); modelView.addObject("siteName", new String("CodeJava.net")); modelView.addObject("users", 1200000);
同樣,Spring非常靈活。你可以Map 在處理程序方法中聲明類型的參數(shù) 。Spring使用此映射存儲模型的對象。讓我們看另一個例子:
@RequestMapping(method = RequestMethod.GET) public String viewStats(Mapmodel) { model.put("siteName", "CodeJava.net"); model.put("pageviews", 320000); return "Stats"; }
這比使用ModelAndView 對象還要簡單 。根據(jù)你的喜好,可以使用Map 或 使用 ModelAndView 對象。在這里要感謝Spring的靈活性。
9.處理程序方法中的重定向
如果你希望在滿足條件的情況下將用戶重定向到另一個URL,請redirect:/ 在URL之前追加。以下代碼段給出了一個示例:
// 檢查登錄狀態(tài).... if (!isLogin) { return new ModelAndView("redirect:/login"); } // 返回用戶列表
在上面的代碼中,/login 如果未登錄,用戶將被重定向到該 URL。
10.處理表格提交和表格驗(yàn)證
通過提供@ModelAttribute 用于將表單字段綁定到表單支持對象的注解以及BindingResult 用于驗(yàn)證表單字段的界面,Spring使處理表單提交變得容易。下面的代碼片段顯示了一種典型的處理程序方法,該方法負(fù)責(zé)處理和驗(yàn)證表單數(shù)據(jù):
@Controller public class RegistrationController { @RequestMapping(value = "/doRegister", method = RequestMethod.POST) public String doRegister( @ModelAttribute("userForm") User user, BindingResult bindingResult) { if (bindingResult.hasErrors()) { // 表單驗(yàn)證錯誤 } else { // 表單輸入沒問題 } // 注冊過程…… return "Success"; } }
從Spring的官方文檔中了解有關(guān)@ModelAttribute 注釋和BindingResult 接口的更多信息 :
在方法參數(shù)上使用@ModelAttribute
在方法上使用@ModelAttribute
接口綁定結(jié)果
11.處理文件上傳
通過自動將上傳數(shù)據(jù)綁定到CommonsMultipartFile 對象數(shù)組,Spring還使在處理程序方法中處理文件上傳變得容易。Spring使用Apache Commons FileUpload作為基礎(chǔ)的多部分解析器。
以下代碼段顯示了從客戶端上傳文件有多么容易
@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.在控制器中自動裝配業(yè)務(wù)類
控制器應(yīng)將業(yè)務(wù)邏輯的處理委托給相關(guān)的業(yè)務(wù)類。為此,您可以使用@Autowired 注解讓Spring自動將業(yè)務(wù)類的實(shí)際實(shí)現(xiàn)注入控制器。考慮以下控制器類的代碼段:
@Controller public class UserController { @Autowired private 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); } }
在此,與用戶管理有關(guān)的所有業(yè)務(wù)邏輯都由該UserDAO 接口的實(shí)現(xiàn)提供 。例如:
interface UserDAO { Listlist(); void save(User user); void checkLogin(User user); }
有關(guān)@Autowired 注解的更多信息,請參見 注釋類型自動裝配。
13.訪問HttpServletRequest和HttpServletResponse
在某些情況下,您需要直接 在處理程序方法中訪問 HttpServletRequest 或 HttpServletResponse對象。通過Spring的靈活性,只需在處理方法中添加相關(guān)參數(shù)即可。例如:
@RequestMapping("/download") public String doDownloadFile( HttpServletRequest request, HttpServletResponse response) { // 訪問請求 // 訪問響應(yīng) return "DownloadPage"; }
Spring檢測并自動將 HttpServletRequest 和 HttpServletResponse 對象注入方法中。然后,可以訪問請求和響應(yīng)如獲取 InputStream, OutputStream或返回一個特定的HTTP代碼。
14.遵循單一責(zé)任原則
最后,在設(shè)計(jì)和編寫Spring MVC控制器時,有兩個很好的實(shí)踐是你應(yīng)該遵循的:
控制器類不應(yīng)執(zhí)行業(yè)務(wù)邏輯。相反,它應(yīng)該將業(yè)務(wù)處理委托給相關(guān)的業(yè)務(wù)類別。這使控制器始終專注于其設(shè)計(jì)職責(zé)是控制應(yīng)用程序的工作流程。例如:
@Controller public class UserController { @Autowired private 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); } }
為每個業(yè)務(wù)域創(chuàng)建每個單獨(dú)的控制器。例如, UserController 用于控制用戶管理的OrderController 工作流程, 用于控制訂單處理的工作流程等。例如:
@Controller public class UserController { } @Controller public class ProductController { } @Controller public class OrderController { } @Controller public class PaymentController { }
以上是“編寫Spring MVC控制器的技巧有哪些”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司行業(yè)資訊頻道!
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)建站www.cdcxhl.com,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。