<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          有了這 14 個(gè)技巧,讓你玩轉(zhuǎn) Spring MVC

          共 10866字,需瀏覽 22分鐘

           ·

          2020-08-28 05:35


          ??Java大聯(lián)盟

          ? 幫助萬(wàn)千Java學(xué)習(xí)者持續(xù)成長(zhǎng)

          關(guān)注



          作者|失控的狗蛋~

          https://blog.csdn.net/Summer_Lyf/article/details/102911215


          B 站搜索:楠哥教你學(xué)Java

          獲取更多優(yōu)質(zhì)視頻教程


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

          這樣就完成了典型的請(qǐng)求-響應(yīng)周期的往返。

          今天整理了一下編寫 Spring MVC 控制器的 14 個(gè)技巧,分享給大家。

          1、使用@Controller構(gòu)造型

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

          import?org.springframework.stereotype.Controller;
          import?org.springframework.web.bind.annotation.RequestMapping;
          @Controller
          public?class?HomeController?{
          ????@RequestMapping("/")
          ????public?String?visitHome()?{

          ????????return?"home";
          ????}
          }

          如你所見(jiàn),visitHome()方法通過(guò)重定向到名為home的視圖來(lái)處理來(lái)自應(yīng)用程序上下文路徑(/)的請(qǐng)求。

          注意:@Controller原型只能在Spring的配置文件中啟用注解驅(qū)動(dòng)時(shí)使用:


          啟用注釋驅(qū)動(dòng)時(shí),Spring容器自動(dòng)在以下語(yǔ)句指定的包下掃描類:

          base-package="net.codejava.spring"?/>

          由@Controller 注釋注釋的類被配置為控制器。這是最可取的,因?yàn)樗芎?jiǎn)單:無(wú)需在配置文件中為控制器聲明bean。

          注意:通過(guò)使用@Controller 注解,您可以擁有一個(gè)多動(dòng)作控制器類,該類能夠處理多個(gè)不同的請(qǐng)求。例如:

          @Controller
          public?class?MultiActionController?{
          ????@RequestMapping("/listUsers")
          ????public?ModelAndView?listUsers()?{
          ????}
          ????@RequestMapping("/saveUser")
          ????public?ModelAndView?saveUser(User?user)?{
          ????}
          ????@RequestMapping("/deleteUser")
          ????public?ModelAndView?deleteUser(User?user)?{
          ????}
          }

          正如你可以在上面的控制器類看,有處理三種不同的請(qǐng)求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)匹配請(qǐng)求進(jìn)入時(shí),該方法將由Spring調(diào)度程序Servlet調(diào)用。此控制器處理的請(qǐng)求URL模式在Spring的上下文配置文件中定義如下:

          "/main"?class="net.codejava.spring.MainController"?/>

          但是,此方法的缺點(diǎn)是控制器類無(wú)法處理多個(gè)請(qǐng)求URL。

          3、擴(kuò)展AbstractController類

          如果要輕松控制受支持的HTTP方法,會(huì)話和內(nèi)容緩存。擴(kuò)展你的控制器 AbstractController 類是理想的選擇。

          請(qǐng)考慮以下示例:

          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)受支持的方法,會(huì)話和緩存的配置的單動(dòng)作控制器,然后可以在控制器的bean聲明中指定這些配置。例如:

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

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

          Spring MVC還提供了幾種針對(duì)特定目的而設(shè)計(jì)的控制器類,包括:

          • AbstractUrlViewController

          • MultiActionController

          • ParameterizableViewController

          • ServletForwardingController

          • ServletWrappingController

          • UrlFilenameViewController

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

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

          @RequestMapping("/login")

          這映射了/login 要由帶注解的方法或類處理的URL模式。當(dāng)在類級(jí)別使用此注解時(shí),該類將成為單動(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 注解在方法級(jí)別使用的,你可以有一個(gè)多動(dòng)作控制器。例如:

          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注釋還可以用于指定一個(gè)方法要處理的多個(gè)URL模式。例如:

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

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

          5、為處理程序方法指定HTTP請(qǐng)求方法

          可以使用 注解的method 屬性 指定處理程序方法支持哪種HTTP方法(GET,POST,PUT等) @RequestMapping。這是一個(gè)例子:

          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";
          ????}
          }

          此控制器有兩個(gè)處理相同URL模式的方法/login,但前者用于 GET 方法,而后者用于 POST 方法。有關(guān)使用@RequestMapping 注解的更多信息,請(qǐng)參見(jiàn) @RequestMapping注解。

          6、將請(qǐng)求參數(shù)映射到處理程序方法

          Spring MVC的很酷的功能之一是,您可以使用@RequestParam 注解將請(qǐng)求參數(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請(qǐng)求參數(shù)。這意味著您可以按以下方式調(diào)用URL(如果請(qǐng)求方法是GET):

          http:// localhost:8080 / spring / login?username = scott&password = tiger

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

          @RequestParam?int?securityNumber

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

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

          @RequestParam("SSN")?int?securityNumber

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

          @RequestParam(required?=?false)?String?country

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

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

          @RequestParam(defaultValue?=?"18")?int?age

          Map 如果方法參數(shù)是type,Spring還允許我們將所有參數(shù)作為對(duì)象 訪問(wèn) Map例如:

          doLogin(@RequestParam?Map<String,?String>?params)

          然后,映射參數(shù)包含鍵-值對(duì)形式的所有請(qǐng)求參數(shù)。有關(guān)使用@RequestParam 注釋的更多信息,請(qǐng)參見(jiàn) @RequestParam注解。更多:SpringBoot聚合

          https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/bind/annotation/RequestParam.html

          7、返回模型和視圖

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

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

          @RequestMapping(value?=?"/login",?method?=?RequestMethod.GET)
          public?String?viewLogin()?{
          ????return?"LoginForm";
          }

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

          @RequestMapping("/listUsers")
          public?ModelAndView?listUsers()?{
          ????List?listUser?=?new?ArrayList<>();
          ????//?從DAO獲取用戶列表…
          ????ModelAndView?modelView?=?new?ModelAndView("UserList");
          ????modelView.addObject("listUser",?listUser);
          ????return?modelView;
          }

          如您所見(jiàn),此處理程序方法返回一個(gè) ModelAndView 保存視圖名稱 UserList 的User 對(duì)象和一個(gè)可在視圖中使用的對(duì)象集合 。

          Spring也非常靈活,因?yàn)槟梢詫odelAndView 對(duì)象聲明 為處理程序方法的參數(shù),而不用創(chuàng)建一個(gè)新的對(duì)象。因此,以上示例可以重寫如下:

          @RequestMapping("/listUsers")
          public?ModelAndView?listUsers(ModelAndView?modelView)?{
          ????List?listUser?=?new?ArrayList<>();
          ????//從DAO獲取用戶列表…
          ????modelView.setViewName("UserList");
          ????modelView.addObject("listUser",?listUser);
          ????return?modelView;
          }

          了解有關(guān)該類的更多信息,請(qǐng)參見(jiàn):ModelAndView class。

          8、將對(duì)象放入模型

          在遵循MVC架構(gòu)的應(yīng)用程序中,控制器(C)應(yīng)該將數(shù)據(jù)傳遞到模型(M)中,然后在視圖(V)中使用該模型。正如我們?cè)谇懊娴氖纠锌吹降哪菢樱?該類的addObject() 方法 ModelAndView是以名稱-值對(duì)的形式將對(duì)象放入模型中:

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

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

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

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

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

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

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

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

          10、處理表格提交和表格驗(yàn)證

          通過(guò)提供@ModelAttribute 用于將表單字段綁定到表單支持對(duì)象的注解以及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)證錯(cuò)誤
          ????????}?else?{
          ????????????//?表單輸入沒(méi)問(wèn)題
          ????????}
          ????????//?注冊(cè)過(guò)程……
          ????????return?"Success";
          ????}
          }

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

          • 在方法參數(shù)上使用@ModelAttribute

          • 在方法上使用@ModelAttribute

          • 接口綁定結(jié)果

          11、處理文件上傳

          通過(guò)自動(dòng)將上傳數(shù)據(jù)綁定到CommonsMultipartFile 對(duì)象數(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){
          ????????//?存儲(chǔ)上傳的文件
          ????????aFile.transferTo(new?File(aFile.getOriginalFilename()));
          ????}
          ????return?"Success";
          }

          12、在控制器中自動(dòng)裝配業(yè)務(wù)類

          控制器應(yīng)將業(yè)務(wù)邏輯的處理委托給相關(guān)的業(yè)務(wù)類。為此,您可以使用@Autowired 注解讓Spring自動(dòng)將業(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?{
          ????List?list();
          ????void?save(User?user);
          ????void?checkLogin(User?user);
          }

          有關(guān)@Autowired 注解的更多信息,請(qǐng)參見(jiàn) 注釋類型自動(dòng)裝配。

          13、訪問(wèn)HttpServletRequest和HttpServletResponse

          在某些情況下,您需要直接 在處理程序方法中訪問(wèn) HttpServletRequest 或HttpServletResponse對(duì)象。

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

          @RequestMapping("/download")
          public?String?doDownloadFile(
          ????????HttpServletRequest?request,?HttpServletResponse?response)?{
          ????//?訪問(wèn)請(qǐng)求
          ????//?訪問(wèn)響應(yīng)
          ????return?"DownloadPage";
          }

          Spring檢測(cè)并自動(dòng)將 HttpServletRequest 和 HttpServletResponse 對(duì)象注入方法中。然后,可以訪問(wèn)請(qǐng)求和響應(yīng)如獲取 InputStream, OutputStream或返回一個(gè)特定的HTTP代碼。

          14、遵循單一責(zé)任原則

          最后,在設(shè)計(jì)和編寫Spring MVC控制器時(shí),有兩個(gè)很好的實(shí)踐是你應(yīng)該遵循的:

          1)控制器類不應(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);
          ????}
          }

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

          @Controller
          public?class?UserController?{
          }
          @Controller
          public?class?ProductController?{
          }
          @Controller
          public?class?OrderController?{
          }
          @Controller
          public?class?PaymentController?{
          }

          這 14 個(gè)小技巧,可以幫助你正確有效地在 Spring MVC 中編寫控制器類。如果你有其他提示或建議,請(qǐng)隨時(shí)在評(píng)論中分享您的想法。


          推薦閱讀

          1、Spring Boot+Vue項(xiàng)目實(shí)戰(zhàn)

          2、B站:4小時(shí)上手MyBatis Plus

          3、一文搞懂前后端分離

          4、快速上手Spring Boot+Vue前后端分離


          楠哥簡(jiǎn)介

          資深 Java 工程師,微信號(hào)?southwindss

          《Java零基礎(chǔ)實(shí)戰(zhàn)》一書作者

          騰訊課程官方 Java 面試官今日頭條認(rèn)證大V

          GitChat認(rèn)證作者,B站認(rèn)證UP主(楠哥教你學(xué)Java)

          致力于幫助萬(wàn)千 Java 學(xué)習(xí)者持續(xù)成長(zhǎng)。




          有收獲,就點(diǎn)個(gè)在看?
          瀏覽 100
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  成人黄网站18秘 免费看 | 免费日屄视频 | 97人人爽 | 操逼无码免费视频 | 国产乱伦视频 |