<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>

          編寫Spring MVC控制器的14個技巧!漲知識了!

          共 10927字,需瀏覽 22分鐘

           ·

          2021-10-14 20:21

          往期熱門文章:

          1、日志打印的15個建議!血淚啊!

          2、List中remove()方法的陷阱,被坑慘了!

          3、Facebook 全球宕機 6 小時!到底遇到了什么問題??

          4放棄使用 15 年的 MacOS,我決定換成 Linux!

          5、宕機三個月、36億打水漂,印度驕傲Infosys如何活成了全球笑話?

          轉自:不墜青云~

          來源:csdn.net/Summer_Lyf/article/details/102911215


          通常,在Spring MVC中,我們編寫一個控制器類來處理來自客戶端的請求。然后,控制器調(diào)用業(yè)務類來處理與業(yè)務相關的任務,然后將客戶端重定向到邏輯視圖名稱,該名稱由Spring的調(diào)度程序Servlet解析,以呈現(xiàn)結果或輸出。這樣就完成了典型的請求-響應周期的往返。今天整理了一下編寫Spring MVC控制器的14個技巧,你今天get到了嗎??\(≧▽≦)/


          1.使用@Controller構造型

          這是創(chuàng)建可以處理一個或多個請求的控制器類的最簡單方法。僅通過用構造型注釋一個類@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的配置文件中啟用注解驅動時使用:

          ?

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

          "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.實現(xiàn)控制器接口

          在Spring MVC中創(chuàng)建控制器的另一種(也許是經(jīng)典的)方法是讓類實現(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");
          ????}
          }

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

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

          但是,此方法的缺點是控制器類無法處理多個請求URL。


          3.擴展AbstractController類

          如果要輕松控制受支持的HTTP方法,會話和內(nèi)容緩存。擴展你的控制器??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)建具有有關受支持的方法,會話和緩存的配置的單動作控制器,然后可以在控制器的bean聲明中指定這些配置。例如:?

          ?
          "/big"?class="net.codejava.spring.BigController">
          ????"supportedMethods"?value="POST"/>

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

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

          • AbstractUrlViewController

          • MultiActionController

          • ParameterizableViewController

          • ServletForwardingController

          • ServletWrappingController

          • UrlFilenameViewController


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

          這是編碼控制器類時必須執(zhí)行的強制性任務,該控制器類旨在處理一個或多個特定請求。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.將請求參數(shù)映射到處理程序方法

          Spring MVC的很酷的功能之一是,您可以使用@RequestParam?注解將請求參數(shù)作為處理程序方法的常規(guī)參數(shù)進行檢索。這是將控制器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

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

          ?
          @RequestParam?int?securityNumber

          然后,Spring將在處理程序方法中自動將請求參數(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?Map?params)

          然后,映射參數(shù)包含鍵-值對形式的所有請求參數(shù)。有關使用@RequestParam?注釋的更多信息,請參見??@RequestParam注解。?


          7.返回模型和視圖

          處理完業(yè)務邏輯后,處理程序方法應返回一個視圖,然后由Spring的調(diào)度程序servlet對其進行解析。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()?{
          ????List?listUser?=?new?ArrayList<>();
          ????//?從DAO獲取用戶列表…
          ????ModelAndView?modelView?=?new?ModelAndView("UserList");
          ????modelView.addObject("listUser",?listUser);
          ????return?modelView;
          }

          如您所見,此處理程序方法返回一個??ModelAndView?保存視圖名稱??UserList?的User?對象和一個可在視圖中使用的對象集合??。


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

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

          ?

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


          8.將對象放入模型

          在遵循MVC架構的應用程序中,控制器(C)應該將數(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(Map?model)?{
          ????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.處理表格提交和表格驗證

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

          @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?接口的更多信息 ??:

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

          • 在方法上使用@ModelAttribute

          • 接口綁定結果

          ?

          11.處理文件上傳

          通過自動將上傳數(shù)據(jù)綁定到CommonsMultipartFile?對象數(shù)組,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.在控制器中自動裝配業(yè)務類

          控制器應將業(yè)務邏輯的處理委托給相關的業(yè)務類。為此,您可以使用@Autowired?注解讓Spring自動將業(yè)務類的實際實現(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);
          ????}
          }

          ?

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

          interface?UserDAO?{
          ????List?list();
          ????void?save(User?user);
          ????void?checkLogin(User?user);
          }

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


          13.訪問HttpServletRequest和HttpServletResponse

          在某些情況下,您需要直接?在處理程序方法中訪問??HttpServletRequest?或??HttpServletResponse對象。通過Spring的靈活性,只需在處理方法中添加相關參數(shù)即可。例如:

          ?
          @RequestMapping("/download")
          public?String?doDownloadFile(
          ????????HttpServletRequest?request,?HttpServletResponse?response)?{
          ????//?訪問請求
          ????//?訪問響應
          ????return?"DownloadPage";
          }

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

          14.遵循單一責任原則

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

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

          ?
          @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è)務域創(chuàng)建每個單獨的控制器。例如,??UserController?用于控制用戶管理的OrderController?工作流程,??用于控制訂單處理的工作流程等。例如:

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

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

          往期熱門文章:

          1、歷史文章分類導讀列表!精選優(yōu)秀博文都在這里了!》
          2、用 Java 爬小姐姐圖片,這個厲害了。。。
          3、消息冪等(去重)通用解決方案,真頂!
          4、從MySQL 5.6升級到8.0,F(xiàn)acebook付出了慘痛代價……
          5、當 Transactional 碰到鎖,有個大坑!
          6、橫空出世,比Visio快10倍的畫圖工具來了。
          7、驚呆了,Spring中竟然有12種定義bean的方法
          8、代碼寫的垃圾被嫌棄?
          9、牛逼!SpringBoot+Vue企業(yè)級支付系統(tǒng)!附源碼!
          10、你真的會寫for循環(huán)嗎?來看看這些常見的for循環(huán)優(yōu)化方式

          瀏覽 30
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <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>
                  AV伊人麻豆 | 黄色在线免费官网 | 水蜜桃精品视频 | 亚洲中文字幕巨乳 | 婷婷五月天成人 |