<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è)Spring MVC頂級(jí)技巧,隨時(shí)用隨時(shí)爽,一直用一直爽~

          共 10569字,需瀏覽 22分鐘

           ·

          2020-09-24 06:21


          通常,在Spring MVC中,我們編寫(xiě)一個(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)周期的往返。


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


          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;@Controllerpublic 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)類必須重寫(xiě)該 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;@Controllerpublic 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;@Controllerpublic 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注解。


          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 面試 7 大問(wèn)題,推薦看下。


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


          @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ù):


          @Controllerpublic 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)注入控制器。


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


          @Controllerpublic 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ì)和編寫(xiě)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)用程序的工作流程。例如:


          @Controllerpublic 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 工作流程, 用于控制訂單處理的工作流程等。例如:


          @Controllerpublic class UserController {}@Controllerpublic class ProductController {}@Controllerpublic class OrderController {}@Controllerpublic class PaymentController {}


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


          譯文:blog.csdn.net/Summer_Lyf/article/details/102911215

          原文:dzone.com/articles/14-tips-for-writing-spring-mvc-



          武哥個(gè)人微信


          添加武哥個(gè)人微信即送100本優(yōu)質(zhì)電子書(shū)


          → 精選技術(shù)資料共享

          →?精選項(xiàng)目實(shí)戰(zhàn)視頻


          瀏覽 45
          點(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>
                  青青草视频国产 | 蜜桃视频在线观看www | 最会潮吹的小护士露比来了上篇顶级色影 | 亚洲精品天堂 | 免费av在线观影 免费成人毛片网站 |