1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        幫你完成蛻變的SpringMVC頂級技巧

        共 16235字,需瀏覽 33分鐘

         ·

        2021-07-12 00:52

        點擊上方 Java學(xué)習(xí)之道,選擇 設(shè)為星標(biāo)

        每天18:30點,干貨準(zhǔn)時奉上!

        來源: blog.csdn.net/Summer_Lyf/article/details/102911215
        作者: 不墜青云~

        Part1Spring MVC做了什么

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

        Part2使用@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ū)動時使用:

        <annotation-driven />

        啟用注釋驅(qū)動時,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分別

        Part3實現(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() 方法,當(dāng)匹配請求進(jìn)入時,該方法將由Spring調(diào)度程序Servlet調(diào)用。此控制器處理的請求URL模式在Spring的上下文配置文件中定義如下:

        <bean name="/main" class="net.codejava.spring.MainController" />

        注意

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

        Part4擴(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聲明中指定這些配置。例如:

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

        此配置指示POST 此控制器的hander 方法僅支持該方法。Spring MVC還提供了幾種針對特定目的而設(shè)計的控制器類,包括:

        • AbstractUrlViewController
        • MultiActionController
        • ParameterizableViewController
        • ServletForwardingController
        • ServletWrappingController
        • UrlFilenameViewController

        Part5為處理程序方法指定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。

        Part6為處理程序方法指定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注解。

        Part7將請求參數(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/loginusername=scott&password=tiger

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

        @RequestParam int securityNumber

        然后,Spring將在處理程序方法中自動將請求參數(shù)(字符串)的值轉(zhuǎn)換為指定的類型(整數(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<String, String>。例如:

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

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

        Part8返回模型和視圖

        處理完業(yè)務(wù)邏輯后,處理程序方法應(yīng)返回一個視圖,然后由Spring的調(diào)度程序servlet對其進(jìn)行解析。Spring允許我們ModelAndView從handler 方法中返回String或?qū)ο?。在以下示例中,? handler 方法返回一個String并表示一個名為的視圖LoginForm

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

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

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

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

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

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

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

        Part9將對象放入模型

        在遵循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(Map<String, Object> model) {
            model.put("siteName""CodeJava.net");
            model.put("pageviews"320000);
            return "Stats";
        }

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

        Part10處理程序方法中的重定向

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

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

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

        Part11處理表格提交和表格驗證

        通過提供@ModelAttribute用于將表單字段綁定到表單支持對象的注解以及BindingResult用于驗證表單字段的界面,Spring使處理表單提交變得容易。下面的代碼片段顯示了一種典型的處理程序方法,該方法負(fù)責(zé)處理和驗證表單數(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的官方文檔中了解有關(guān)@ModelAttribute 注釋和BindingResult 接口的更多信息   :

        • 在方法參數(shù)上使用@ModelAttribute
        • 在方法上使用@ModelAttribute
        • 接口綁定結(jié)果

        Part12處理文件上傳

        通過自動將上傳數(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";
        }

        Part13在控制器中自動裝配業(yè)務(wù)類

        控制器應(yīng)將業(yè)務(wù)邏輯的處理委托給相關(guān)的業(yè)務(wù)類。為此,您可以使用@Autowired注解讓Spring自動將業(yè)務(wù)類的實際實現(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接口的實現(xiàn)提供。例如:

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

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

        Part14訪問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代碼

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

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

        控制器類不應(yīng)執(zhí)行業(yè)務(wù)邏輯。相反,它應(yīng)該將業(yè)務(wù)處理委托給相關(guān)的業(yè)務(wù)類別。這使控制器始終專注于其設(shè)計職責(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)建每個單獨的控制器。例如,  UserController 用于控制用戶管理的OrderController 工作流程,  用于控制訂單處理的工作流程等。例如:

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

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

        -- END --

         | 更多精彩文章 -




        加我微信,交個朋友
        長按/掃碼添加↑↑↑

        瀏覽 62
        點贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

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

        手機(jī)掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            北条麻妃操屄毛片 | 超碰AⅤ| 思思热精品视频 | 天天舔天天日天天射 | 含紧一点h边做边走动 | 2019无码视频 | 国产精品九九久久精品女同毛多 | 一区二区三区无码免费 | 久久婷婷五月综合色国产婷婷一 | 91精品国产色综合久久不卞臂 |