SpringMVC-02-什麼是SpringMVC

来源:https://www.cnblogs.com/blog-moondream/p/18277188
-Advertisement-
Play Games

1、概述 Spring MVC是Spring Framework的Web開發部分,是基於Java實現MVC的輕量級Web框架。 官方文檔:https://docs.spring.io/spring-framework/docs/4.3.24.RELEASE/spring-framework-refe ...


1、概述

img

Spring MVC是Spring Framework的Web開發部分,是基於Java實現MVC的輕量級Web框架。

為什麼要學習SpringMVC ?

Spring MVC的特點:

  1. 輕量級,簡單易學
  2. 高效 , 基於請求響應的MVC框架
  3. 與Spring相容性好,無縫結合
  4. 約定優於配置
  5. 功能強大:RESTful、數據驗證、格式化、本地化、主題等
  6. 簡潔靈活

Spring的web框架圍繞DispatcherServlet [ 調度Servlet ] 設計。

DispatcherServlet的作用是將請求分發到不同的Handler。從Spring 2.5開始,使用Java 5或者以上版本的用戶可以採用基於註解形式進行開發,十分簡潔;

正因為SpringMVC好 , 簡單 , 便捷 , 易學 , 天生和Spring無縫集成(可以使用IOC和AOP) , 使用約定優於配置 ,能夠進行簡單的junit測試 ,支持Restful風格 ,異常處理 ,本地化 ,國際化 ,數據驗證 ,類型轉換 ,攔截器 等等......所以我們要學習。

最重要的一點還是用的人多 , 使用的公司多 。

2、SpringMVC 核心組件

  • 前端控制器:DispactherServlet
  • 處理器映射器:HandlerMapping
  • 處理器適配器:HandlerAdapter
  • 處理器:Handler
  • 視圖解析器:ViewResolver

組件介紹:

  • DispactherServlet:用於接收所有的客戶端請求並將請求分發給合適的Handler(Controller)進行處理。在原生JavaWeb中,分發請求是由 Tomcat 根據 web.xml 來做的,SpringMVC使用 DispactherServlet 替代了這個功能。(不需要程式員開發)
  • HandlerMapping:解析每個請求的URL,找到對應的 Handler。(不需要程式員開發)
  • HandlerAdapter:適配器模式,適配調用具體的 Handler。(不需要程式員開發)
  • Handler:Controller層組件,對客戶端請求進行邏輯處理,替代了原生JavaWeb中的 Servlet 所做的功能。(需要程式員手動開發)
  • ViewResolver:將 SpringMVC 中的 邏輯視圖名 拼接成具體的視圖地址,簡化了視圖地址的編寫。(不需要程式員開發)

Spring MVC框架像許多其他MVC框架一樣, 以請求為驅動 , 圍繞一個中心Servlet分派請求及提供其他功能DispatcherServlet是一個實際的Servlet (它繼承自HttpServlet 基類)

在這裡插入圖片描述

3、SpringMVC 執行原理

img

簡要分析執行流程

  1. 當用戶通過瀏覽器發起一個HTTP請求,請求直接到前端控制器 DispatcherServlet;
  2. 前端控制器接收到請求以後調用處理器映射器HandlerMapping,處理器映射器根據請求的URL解析出URI,找到具體的Handler,並將它返回給前端控制器;
  3. 前端控制器調用處理器適配器HandlerAdapter去適配調用Handler;
  4. 處理器適配器會根據Handler去調用真正的處理器去處理請求,並且處理對應的業務邏輯;
  5. 當處理器處理完業務之後,會返回一個ModelAndView對象給處理器適配器,HandlerAdapter再將該對象返回給前端控制器;ModelAndView 中的 Model 是指 被Model層執行業務處理後返回的數據對象,View 是指 將要轉向的視圖信息。
  6. 前端控制器DispatcherServlet將返回的ModelAndView對象傳給視圖解析器ViewResolver進行解析,解析完成之後就會返回一個具體的視圖地址給前端控制器;(ViewResolver根據邏輯的View查找具體的View)
  7. 前端控制器DispatcherServlet轉向具體的視圖,併進行渲染;
  8. 渲染完成之後響應給用戶(瀏覽器顯示);

4、HelloSpringMVC(舉個實例)

4.1、配置版

  1. 新建一個Moudle , SpringMVC-02-HelloMVC , 添加web的支持!

    image-20240627111446334

  2. 確定導入了SpringMVC 的依賴!

  3. 配置web.xml , 註冊DispatcherServlet

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
             version="4.0">
    
        <!--註冊DispatcherServlet-->
        <servlet>
            <servlet-name>DispatcherServlet</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <!--關聯一個springmvc的配置文件-->
            <init-param>
                <param-name>contextConfigLocation</param-name>
                <param-value>classpath:spring-mvc.xml</param-value>
            </init-param>
            <!--啟動級別-1-->
            <load-on-startup>1</load-on-startup>
        </servlet>
    
        <servlet-mapping>
            <servlet-name>DispatcherServlet</servlet-name>
            <url-pattern>/</url-pattern>
        </servlet-mapping>
    
    </web-app>
    

    配置說明:

    • init-param:當請求進入此servlet時,會攜帶的初始參數
    • classpath:classpath*::前者指的是 當前項目的編譯路徑,後者代表的是 當前項目及其依賴jar包的所有編譯路徑
    • load-on-startup:啟動級別,當值為0或者大於0時,表示容器在應用啟動時就載入這個servlet,值越小,優先順序越高,當值是一個負數時或者沒有指定時,則指示容器在該servlet被選擇時才載入。
    • url-pattern 為 ‘/’:預設匹配,詳見 關於tomcat中servlet的url-pattern匹配規則
  4. 編寫SpringMVC 的 配置文件!名稱:spring-mvc.xml,添加處理器映射器、 處理器適配器、 視圖解析器

    image-20240627114550878

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    
        <!-- Handler映射器 -->
        <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
    
        <!-- Handler適配器 -->
        <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
    
        <!-- 視圖解析器 -->
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="prefix" value="/WEB-INF/jsp/"/>
            <property name="suffix" value=".jsp"/>
        </bean>
    
    </beans>
    
  5. 編寫處理器 Handler ,實現Controller介面 或者 增加註解;需要返回一個ModelAndView,裝數據,封視圖

    image-20240627135809638

    import org.springframework.web.servlet.ModelAndView;
    import org.springframework.web.servlet.mvc.Controller;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class HelloController implements Controller {
        @Override
        public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
            ModelAndView mv = new ModelAndView();
    
            mv.addObject("msg","HelloMVC");
            mv.setViewName("hello");
    
            return mv;
        }
    }
    
  6. 將編寫的 Handler 交給SpringIOC容器,註冊bean,添加到spring-mvc.xml中。

    <!-- Handler -->
    <bean id="/hello" class="controller.HelloController"/>
    
  7. 編寫要跳轉的jsp頁面,顯示ModelandView存放的數據,以及正常頁面;

    image-20240627140629006

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>hello</title>
    </head>
    <body>
    ${msg}
    </body>
    </html>
    
  8. 配置Tomcat,啟動測試!

    image-20240627140949040

    image-20240627141420275

可能遇到的問題:訪問出現404,排查步驟:

  1. 查看控制台輸出,看一下是不是缺少了什麼jar包。

  2. 如果缺少jar包,就在項目結構中添加相應的lib依賴!

    image-20240627142003042

    image-20240627142053793

  3. 重啟Tomcat 即可解決!

4.2、註解版

  1. 新建一個Moudle,SpringMVC-03-Annotation ,添加web支持!

    image-20240628170543106

  2. 在pom.xml文件引入相關的依賴:主要有Spring框架核心庫、Spring MVC、Servlet、 JSTL等。在父項目中已經引入了

  3. 配置web.xml

    image-20240628171324339

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
             version="4.0">
    
        <servlet>
            <servlet-name>DispatcherServlet</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <init-param>
                <param-name>contextConfigLocation</param-name>
                <param-value>classpath:spring-mvc.xml</param-value>
            </init-param>
            <load-on-startup>1</load-on-startup>
        </servlet>
    
        <servlet-mapping>
            <servlet-name>DispatcherServlet</servlet-name>
            <url-pattern>/</url-pattern>
        </servlet-mapping>
        
    </web-app>
    

    配置說明:在上面的配置版講過了,這裡一樣,就不說了。

  4. 添加Spring MVC配置文件

    image-20240628172911701

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:context="http://www.springframework.org/schema/context"
           xmlns:mvc="http://www.springframework.org/schema/mvc"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="
           http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
           http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
    ">
    
        <!-- 組件掃描 -->
        <context:component-scan base-package="com.moondream.controller"/>
        <!-- 使用 default-servlet 處理靜態資源 -->
        <mvc:default-servlet-handler/>
        <!-- 使用mvc註解驅動 -->
        <mvc:annotation-driven/>
    
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="prefix" value="/WEB-INF/jsp/"/>
            <property name="suffix" value=".jsp"/>
        </bean>
    
    </beans>
    

    配置說明:

    1. 加入了兩個Xml命名空間 contextmvc

    2. <context:component-scan/>:組件掃描

      命名空間 context 下的標簽,掃描指定包下所有被模板註解標註了的類,將其bean化並註冊到IOC中。

      模板註解 即 @component 及其 組合註解(@Controller、@Configuration……),它們大都位於 org.springframework.stereotype 包下,抽象定義為 項目的某個模塊,比如 @Controller 代表 項目的 控制層,@Service 代表 項目的 服務層,@Configuration 代表 項目的 配置,@Component 代表 項目的 組件。

      不想使用組件掃描,也可以將其手動一個個註冊成bean

      <bean class="com.moondream.controller.HelloController"/>
      
    3. <mvc:default-servlet-handler/>:使用 default-servlet 來處理請求

      命名空間 mvc 下的標簽,將 匹配到的請求 轉發到 Tomcat 內建的 default servlet 中處理。

      一般用來處理 靜態資源請求(.html、.css、.mp3、.jpg……),使用此標簽要註意 配置中多個HandlerMapping的優先順序問題,免得 非靜態資源請求 被匹配上 default servlet ,那樣會報 404 錯誤。

      其本質是

          <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
              <!-- SimpleUrlHandlerMapping 通過urlMap來找相應的Handler -->
              <property name="urlMap">
                  <map>
                      <entry key="/**" value="org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler#0"/>
                  </map>
              </property>
          </bean>
          <bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"/>
          <bean class="org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler"/>
      
    4. <mvc:annotation-driven/>:使用 mvc 註解驅動

      命名空間 mvc 下的標簽,使用註解的方式來處理請求。

      其本質是

      <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping">
          <!-- 使用高優先順序 -->
          <property name="order" value="0"/>
      </bean>
      <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>
      

      (spring3.1之前使用的是 DefaultAnnotationHandlerMapping 與 AnnotationMethodHandlerAdapter )

      (spring3.1之後替換成如上述所示)

      註解方式處理請求的簡要流程:

      1)Spring容器啟動,RequestMappingHandlerMapping在bean載入完成後,掃描出所有帶有@Controller註解的bean,進而遍歷出其中所有帶有@RequestMapping註解 的方法,將方法上@RequestMapping註解信息封裝成RequestMappingInfo對象,其包含了請求路徑、請求方法、請求參數、請求頭等信息,將方法本身封裝成HandlerMethod對象,並以RequestMappingInfo為鍵,HandlerMethod為值,存儲在一個Map結構中,以便於後續查找。

      2)當一個HTTP請求到達DispatcherServlet時,DispatcherServlet會調用RequestMappingHandlerMappinggetHandler()方法來查找到相應的 Handler,這裡就是HandlerMethod

      3)如果找到了匹配的HandlerMethodDispatcherServlet就會根據其類型選擇合適的HandlerAdapter(即RequestMappingHandlerAdapter)來執行它,並返回結果;如果沒有找到匹配的HandlerMethodDispatcherServlet就會拋出異常並使用下一個 HandlerMapping 來查找 Handler 或者返回404錯誤頁面。

      4)如果被封裝成HandlerMethod的方法 或者 其上的類 被@ResponseBody註解 標註,那麼HandlerMethod的返回結果就是一個單純的數據字元串,會被當成響應體直接返回給客戶端瀏覽器,否則就是邏輯視圖名,會被視圖解析器解析後轉向具體視圖。

      詳見這篇文章的 RequestMappingHandlerMapping 部分:Spring MVC源碼解析——HandlerMapping(處理器映射器)

  5. 編寫Controller層,創建一個Java類:com.moondream.controller.HelloController , 註意編碼規範

    image-20240629202633806

    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    @Controller
    @RequestMapping("/HelloController")
    public class HelloController {
    
       //真實訪問地址 : 項目名/HelloController/hello
       @RequestMapping("/hello")
       public String sayHello(Model model){
           //向模型中添加屬性msg與值,可以在JSP頁面中取出並渲染
           model.addAttribute("msg","hello,SpringMVC");
           
           // /WEB-INF/jsp/hello.jsp
           return "hello";
      }
    }
    

    註意:

    • 標註在類上的 @RequestMapping,相當於前置要求,每個RequestMappingInfo在被封裝時,都會將類和對應方法上的 @RequestMapping 註解信息 整合註入自己。
    • 被封裝成HandlerMethod的方法,返回值必須是String類型,方法參數會被框架進行數據綁定。如果想在訪問的請求上加數據,可以設置一個Model類型的參數,這個參數對象將由框架傳入,它會把自身被加入的數據封裝到訪問的請求上。不要設置ModelAndView類型的參數,它在HandlerMethod中無效。
    • 一個RequestMappingInfo匹配的請求範圍不能被另一個RequestMappingInfo完全覆蓋,不然程式會報錯。簡單來說,你要保證一個RequestMappingInfo至少有一類請求能匹配上。
  6. 創建視圖層

    image-20240629225356409

    在WEB-INF/jsp目錄中創建hello.jsp , 視圖可以直接取出並展示從Controller帶回的信息;

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Hello</title>
    </head>
    <body>
    ${msg}
    <br/>
    <%out.print(request.getRequestURI());%>
    </body>
    </html>
    
  7. 配置Tomcat運行,開啟伺服器,訪問對應的請求路徑!

    image-20240629225849505

    http://localhost:8080/spring03/HelloController/hello

    image-20240629230333689

    運行成功!!!

4.3、小結

實現步驟:

  1. 新建一個web項目
  2. 導入相關jar包
  3. 編寫web.xml , 註冊DispatcherServlet
  4. 編寫springmvc配置文件
  5. 接下來就是去創建對應的控制類 , controller
  6. 最後完善前端視圖和controller之間的對應
  7. 測試運行調試.

使用springMVC必須配置的三大件:

  • 處理器映射器、處理器適配器、視圖解析器

通常,我們只需要手動配置視圖解析器,而處理器映射器處理器適配器只需要開啟註解驅動即可,省去了大段的xml配置。

不知道有沒有小伙伴註意到一個問題:

在上述註解版的案例中,我們通過命名空間mvc下的兩個標簽default-servlet-handlerannotation-driven,在SpringIOC中配置了多個HandlerMapping和HandlerAdapter,

那麼,當請求到達時,DispatcherServlet該使用哪個HandlerMapping和HandlerAdapter呢?

當IOC中有多個HandlerMapping時:

  1. DispatcherServlet會優先使用優先順序高的HandlerMapping(所有HandlerMapping中,都有一個order屬性,代表優先順序)
  2. 如果HandlerMapping優先順序一樣,DispatcherServlet會使用先註冊的
  3. 如果使用的HandlerMapping根據請求找不到Handler,DispatcherServlet會繼續使用下一優先順序的HandlerMapping繼續找,直到找到Handler

當IOC中有多個HandlerAdapter時:

  1. DispatcherServlet會遍歷所有註冊的HandlerAdapter,根據請求的Handler類型來選擇對應的HandlerAdapter
  2. 如果有多個HandlerAdapter都能夠支持當前請求的Handler類型,選擇第一個適配成功的HandlerAdapter來執行Handler,即選擇先註冊的HandlerAdapter

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 項目隨筆-【大事件(文章類)】 自定義參數校驗註解 需要寫一個自定義註解Xxx+校驗規則的類XxxValidation【需要繼承ConstraintValidator】 自定義註解 @Documented @Target(ElementType.FIELD) @Retention(Retention ...
  • Python 是一種面向對象、解釋型電腦程式設計語言,由 Guido van Rossum 於 1989 年底發明,第一個公開發行版發行於 1991 年。Python 語法簡潔而清晰,具有豐富和強大的類庫。它常被昵稱為膠水語言,能夠把用其他語言製作的各種模塊(尤其是 C/C++)很輕鬆地聯結在一起 ...
  • 正文 昨天睡了一天覺,今天看了一天《三體》電視劇。真是墮落到沒邊了呢(笑。本來想寫代碼完成年度計劃,或者多寫幾篇文章,但實在不想寫,也不想動筆。 感覺這個周末什麼都沒做呢,休息倒是休息好了。 今天 30 號,也不知道靈平安到學校沒有。 本有一些想寫的東西,但懶得動筆了。 成功日記: 《西游記》看到了 ...
  • 前言 之前做了微信登錄,所以總結一下微信授權登錄並獲取用戶信息這個功能的開發流程。 配置 1.首先得在微信公眾平臺申請一下微信小程式賬號並獲取到小程式的AppID和AppSecret https://mp.weixin.qq.com/cgi-bin/loginpage?url=%2Fwxamp%2F ...
  • 本文揭秘了Java Chassis 3流式響應的使用場景和技術背景,它基於伺服器事件推送和響應式流(reactive streams)標準,提供了非常簡潔的流式響應開發能力,簡化人工智慧應用開發體驗。 ...
  • 大家好,我是碼農先森。 說到 HTTP 請求工具想必對我們做 Web 開發的程式員都不陌生,只要涉及到網路請求都必須使用。對於我們 PHP 程式員來說,最熟悉不過的就是 CURL 擴展,只要安裝的這個擴展便可隨意發起 HTTP 請求。 但在 PHP 語言中還有一個很好用的 Composer 包「gu ...
  • 主題介紹 WaterDrop 是 水滴 的意思,其實並沒有什麼特殊含義,只是因為每一次項目取名都絞盡腦汁,太麻煩了,於是就想著效法一些大佬,乾脆取名隨性一點。例如,Java 語言因作者經常在辦公室喝 Java 咖啡而得名,MySQL和MariaDB的作者是同一人,命名分別是他兩個女兒的名字(看樣子作 ...
  • 集合工廠 List<String> friends = Arrays.asList("Raphael", "Olivia"); friends.set(0, "Richard"); friends.add("Thibaut"); ← 拋出一個UnsupportedModificationExcept ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...