整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          XMLHTTP的簡單講解

          分享成果,隨喜正能量】行走于塵世,繁忙的工作節奏,沉重的生活壓力,似乎想讓生活過得行云流水,真的不是一件容易的事情,那么何不讓它變得簡單一些?或許我們不夠時尚,至少我們可以簡約,或許我們不夠精致,至少我們可以簡潔。把每一段旅途,都當做最好的修行;把每一段旅途遇到的困難,都當做自己的助力;把每一段旅途中遇到的人,都當做今生的因緣。

          《VBA信息獲取與處理》教程是我推出第六套教程,目前已經是第一版修訂了。這套教程定位于最高級,是學完初級,中級后的教程。這部教程給大家講解的內容有:跨應用程序信息獲得、隨機信息的利用、電子郵件的發送、VBA互聯網數據抓取、VBA延時操作,剪貼板應用、Split函數擴展、工作表信息與其他應用交互,FSO對象的利用、工作表及文件夾信息的獲取、圖形信息的獲取以及定制工作表信息函數等等內容。程序文件通過32位和64位兩種OFFICE系統測試。是非常抽象的,更具研究的價值。

          教程共兩冊,八十四講。今日的內容是專題六“VBA中利用XMLHTTP完成網抓數據”的第1講:XMLHTTP的簡單講解

          第一節 XMLHTTP的簡單講解及相關概念的介紹

          現在的社會是網絡的社會,離開了網絡,很多工作會變得不通暢。我們日常的生活也是和網絡緊密聯系一起的,那么網絡是如何搭建的呢?我們可以通過本講的講解了解到HTTP 超文本傳輸協議,TCP/IP的介紹,XMLHTTP的介紹,等等。

          1 什么是XMLHTTP,它是用來做什么的?

          1) XML的介紹 XML指可擴展標記語言(EXtensible Markup Language),設計宗旨是傳輸數據,是W3C (萬維網聯盟World Wide Web Consortium)的推薦標準。XML 是各種應用程序之間進行數據傳輸的最常用的工具,并且在信息存儲和描述領域變得越來越流行。

          2) HTTP的介紹 HTTP 超文本傳輸協議(HyperText Transfer Protocol,超文本傳輸協議)是因特網上應用最為廣泛的一種網絡傳輸協議,所有的WWW文件都必須遵守這個標準。

          HTTP是一個基于TCP/IP通信協議來傳遞數據(HTML 文件, 圖片文件, 查詢結果等)。

          3) TCP/IP的介紹 TCP/IP是供已連接因特網的計算機進行通信的通信協議(Transmission Control Protocol / Internet Protocol)。定義了電子設備(比如計算機)如何連入因特網,以及數據如何在它們之間傳輸的標準。

          TCP 用于應用程序之間的通信。當應用程序希望通過 TCP 與另一個應用程序通信時,它會發送一個通信請求。這個請求必須被送到一個確切的地址。在雙方“握手”之后,TCP 將在兩個應用程序之間建立一個全雙工 (full-duplex) 的通信。這個全雙工的通信將占用兩個計算機之間的通信線路,直到它被一方或雙方關閉為止。

          IP 用于計算機之間的通信。IP 是無連接的通信協議。它不會占用兩個正在通信的計算機之間的通信線路。這樣,IP 就降低了對網絡線路的需求。每條線可以同時滿足許多不同的計算機之間的通信需要。通過 IP,消息(或者其他數據)被分割為小的獨立的包,并通過因特網在計算機之間傳送。IP 負責將每個包路由至它的目的地。

          TCP/IP協議意味著 TCP 和 IP 在一起協同工作。TCP 負責應用軟件(比如你的瀏覽器)和網絡軟件之間的通信。IP 負責計算機之間的通信。TCP 負責將數據分割并裝入 IP 包,然后在它們到達的時候重新組合它們。IP 負責將包發送至接受者。

          4) XMLHTTP的介紹 XMLHTTP是一套可以在Javascript、VbScript、Jscript等腳本語言中通過http協議傳送或從接收XML及其他數據的一套API。XmlHttp最大的用處是可以更新網頁的部分內容而不需要刷新整個頁面。

          來自MSDN的解釋:XmlHttp提供客戶端同http服務器通訊的協議。客戶端可以通過XmlHttp對象(MSXML2.XMLHTTP.3.0)向http服務器發送請求并使用微軟XML文檔對象模型Microsoft? XML Document Object Model (DOM)處理回應。

          現在的絕對多數瀏覽器都增加了對XmlHttp的支持,IE中使用ActiveXObject方式創建XmlHttp對象,其他瀏覽器如:Firefox、Opera等通過window.XMLHttpRequest來創建xmlhttp對象.

          2 應用XMLHTTP抓取數據的步驟

          1)創建XMLHTTP對象 //需MSXML4.0支持

          2)打開與服務端的連接,同時定義指令發送方式,服務網頁(URL)和請求權限等。客戶端通過Open命令打開與服務端的服務網頁的連接。與普通HTTP指令傳送一樣,可以用"GET"方法或"POST"方法指向服務端的服務網頁。 

          3)發送指令。 

          4)等待并接收服務端返回的處理結果。 

          5)釋放XMLHTTP對象

          3 XMLHTTP的屬性及方法

          1) XMLHTTP的常見屬性: 

          onreadystatechange:在同步執行方式下獲得返回結果的事件句柄。只能在DOM中調用。 

          responseBody:   結果返回為無符號整數數組。 

          responseStream:  結果返回為IStream流。 

          responseText:   結果返回為字符串。 

          responseXML:   結果返回為XML格式數據。

          2) XMLHTTP的常用方法: 

          ① Open(bstrMethod, bstrUrl, varAsync, bstrUser, bstrPassword)創建一個新的http請求,并指定此請求的方法、URL以及驗證信息(用戶名/密碼)打開指定網址

          bstrMethod:  數據傳送方式,即GET或POST。 

          bstrUrl:    服務網頁的URL。 

          varAsync:   是否同步執行。缺省為True,即同步執行,但只能在DOM中實施同步執行。用中一般將其置為False,即異步執行。 

          bstrUser:    用戶名,可省略。 

          bstrPassword:用戶口令,可省略。 

          setRequestHeader(bstrHeader, bstrvalue)

          bstrHeader:HTTP 頭(header) 

          bstrvalue: HTTP 頭(header)的值 

          如果Open方法定義為POST,可以定義表單方式上傳: 

          xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded") 

          ② Send(varBody)發送請求到http服務器并接收回應

          varBody:指令集。可以是XML格式數據,也可以是字符串,流,或者一個無符號整數數組。也可以省略,讓指令通過Open方法的URL參數代入。

          ③ abort 取消當前請求

          ④ getAllResponseHeaders 獲取響應的所有http頭

          ⑤ getResponseHeader 從響應信息中獲取指定的http頭

          以上我給出了一些常用的屬性和方法,其他的大家可以參考相關的資料,或許我在今后的課程中會用到時講解。同時我們還要主要下面的注意點:

          1、ResponseBody是二進制的數據,是服務器傳來的沒有經過任何加工的數據。

          2 ResponseText是按照utf-8編碼把ResponseBody轉換而成,也就是:ResponseText=ByteToStr(ResponseBody,"UTF-8")

          本節知識點回向:了解一些概念,HTTP,TCP/IP,XMLHTTP,以及XMLHTTP的常用屬性和方法。

          我20多年的VBA實踐經驗,全部濃縮在下面的各個教程中,教程學習順序:

          HTML 頁面中顯示 XML 數據

          在下面的實例中,我們打開一個 XML 文件("cd_catalog.xml"),然后遍歷每個 CD 元素,并顯示HTML 表格中的 ARTIST 元素和 TITLE 元素的值:

          實例

          <html>

          <body>

          <script>

          if (window.XMLHttpRequest)

          {// code for IE7+, Firefox, Chrome, Opera, Safari

          xmlhttp=new XMLHttpRequest();

          }

          else

          {// code for IE6, IE5

          xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");

          }

          xmlhttp.open("GET","cd_catalog.xml",false);

          xmlhttp.send();

          xmlDoc=xmlhttp.responseXML;

          document.write("<table border='1'>");

          var x=xmlDoc.getElementsByTagName("CD");

          for (i=0;i<x.length;i++)

          {

          document.write("<tr><td>");

          document.write(x[i].getElementsByTagName("ARTIST")[0].childNodes[0].nodeValue);

          document.write("</td><td>");

          document.write(x[i].getElementsByTagName("TITLE")[0].childNodes[0].nodeValue);

          document.write("</td></tr>");

          }

          document.write("</table>");

          </script>

          </body>

          </html>

          如您還有不明白的可以在下面與我留言或是與我探討QQ群308855039,我們一起飛!

          薦學習:

          這可能是全網Java學習路線最完整,最詳細的版本了,沒有之一

          Spring的出現是為了解決企業應用程序開發的復雜性 它是一個分層的、JavaSE/EE一站式、輕量級開源框架。

          Spring框架是一個分層架構,它包含一系列的功能要素并被分為大約20個模塊。這些模塊分為Core Container、Data Access/Integration、Web、AOP(Aspect Oriented Programming)、Instrumentation和測試部分。

          spring的兩個核心是 ioc 和 aop;
          IoC(Inversion of Control 控制反轉):將對象創建的權利交給spring工廠來控制。
          AOP(Aspect Oriented Programming 面向切面編程),基于動態代理的功能增強方式。

          本章主要學習下ioc的內容;

          第一步 : 創建工程導入jar 包。

          <?xml version="1.0" encoding="UTF-8"?>
          <project xmlns="http://maven.apache.org/POM/4.0.0"
                   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
              <modelVersion>4.0.0</modelVersion>
          
              <groupId>org.example</groupId>
              <artifactId>springTest</artifactId>
              <version>1.0-SNAPSHOT</version>
          
              <properties>
                  <maven.compiler.source>8</maven.compiler.source>
                  <maven.compiler.target>8</maven.compiler.target>
              </properties>
              <dependencies>
                  <dependency>
                      <groupId>org.springframework</groupId>
                      <artifactId>spring-context</artifactId>
                      <version>5.0.5.RELEASE</version>
                  </dependency>
                  <dependency>
                      <groupId>log4j</groupId>
                      <artifactId>log4j</artifactId>
                      <version>1.2.16</version>
                  </dependency>
                  <dependency>
                      <groupId>org.slf4j</groupId>
                      <artifactId>slf4j-api</artifactId>
                      <version>1.6.1</version>
                  </dependency>
                  <dependency>
                      <groupId>junit</groupId>
                      <artifactId>junit</artifactId>
                      <version>4.12</version>
                      <scope>test</scope>
                  </dependency>
              </dependencies>
          
          </project>
          123456789101112131415161718192021222324252627282930313233343536373839

          spring 有4個核心容器的jar 包 分別是Beans、Core、Context、SpEL這里我們只要引入spring-context依賴就足夠了。


          添加log4j.properties文件放置到src/reources下。

          
          log4j.rootLogger=INFO,A1
          log4j.logger.org.apache=INFO
          log4j.appender.A1.Target=System.err
          log4j.appender.A1=org.apache.log4j.ConsoleAppender
          log4j.appender.A1.layout=org.apache.log4j.PatternLayout
          log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c]-[%p] %m%n
          1234567

          ps:這里的日志等級可以改為debug的級別,這里為了簡便設置為info的級別,有需要可以自行更改。

          接下來就是寫下的偽登錄業務;

          快速寫下dao層和service層業務

          package com.spring.quickTest;
          
          public interface userDao {
          
              public void queryUser();
              
          }
          
          12345678
          package com.spring.quickTest;
          
          public class UserDaoImpl  implements userDao  {
          
          
              @Override
              public void queryUser() {
                  System.out.println("用戶登錄了");
              }
          }
          
          1234567891011
          package com.spring.quickTest;
          
          public interface UserService {
          
            void login();
          
          
          }
          
          123456789
          package com.spring.quickTest;
          
          import org.springframework.context.ApplicationContext;
          import org.springframework.context.support.ClassPathXmlApplicationContext;
          
          public class UserServiceImpl implements UserService {
          
              private  userDao userDao;
          
              public void setUserDao(com.spring.quickTest.userDao userDao) {
                  this.userDao = userDao;
              }
          
              @Override
              public void login() {
                  System.out.println("準備登錄中");
          //        1.傳統方法
          //         userDao userDao = new UserDaoImpl();
          //         userDao.queryUser();
          //        2.自定義工廠
          //        userDao user = (userDao) new UserdaoFactory().getBean();
          //           user.queryUser();
          //        3spring 工廠
          //        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
          //        userDao userDao = (com.spring.quickTest.userDao) context.getBean("userDao");
                  
                  userDao.queryUser();
          
              }
          }
          
          12345678910111213141516171819202122232425262728293031

          傳統方法下的代碼過于耦合;
          例如:UserDao userDao = new UserDaoImpl();
          如果要更換實現類,或者實現類換一個名字,此時代碼會報錯,必須要修改原來的業務代碼。
          我們也可以通過反射的方法自定義一個bean工廠來實現代碼的解耦;

          package com.spring.quickTest;
          
          public class UserdaoFactory {
          
              public Object getBean() {
          
          
                  try {
                      return Class.forName("com.spring.quickTest.UserDaoImpl").newInstance();
                  } catch (InstantiationException e) {
                      e.printStackTrace();
                  } catch (IllegalAccessException e) {
                      e.printStackTrace();
                  } catch (ClassNotFoundException e) {
                      e.printStackTrace();
                  }
          
                 return  null ;
              }
          }
          1234567891011121314151617181920

          我們就可以通過自定義的工廠進行實例化,然后調用dao層的方法,避免了耦合。

          接下來也可以通過spring的工廠來實現解耦;
          寫好spring核心文件的配置文件applicationContext.xml

          <?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">
                
               <bean name="userDao" class="com.spring.quickTest.UserDaoImpl"/>
              
                <bean name="UserService" class="com.spring.quickTest.UserServiceImpl">
                     <property name="userDao" ref="userDao"></property>
                </bean>
          </beans>
          123456789101112

          我們將dao層交給spring 工廠后發現還是不夠方便,就將service層也交給spring工廠來控制 ,將bean標簽下的 property進行依賴注入這樣我們只要聲明下成員變量后并進行set方法賦值就可以直接引用了,不需要在創建spring工廠了。


          ps:
          標簽說明: bean: spring工廠創建的一個對象(反射機制)
          id/name:對象的名字,可以用來引用或者獲取對象, 一般為類名或接口名稱的首字母小寫
          class:要創建的對象類型的類字符串,類名全路徑
          注入對象
          property 根據類中的setter方法進行屬性注入
          name:setter方法的后綴小寫,比如setXxx 對應的name為xxx
          ref:引用哪一個bean(對象),值為bean的id/name

          import com.spring.quickTest.UserServiceImpl;
          import com.spring.quickTest.UserService;
          import com.spring.quickTest.UserdaoFactory;
          import org.junit.Test;
          import org.springframework.context.ApplicationContext;
          import org.springframework.context.support.ClassPathXmlApplicationContext;
          
          public class userTest {
              @Test
              public void test(){
          //       UserService service = new UserServiceImpl();
                  ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
                  UserService service = (UserService) context.getBean("UserService");
                  service.login();
              }
          }
          
          1234567891011121314151617

          創建完測試類后運行成功。。。

          感謝閱讀,三連是最大的支持!


          主站蜘蛛池模板: 久草新视频一区二区三区| 亚洲国产美国国产综合一区二区| 精品视频一区二区| 久久亚洲中文字幕精品一区| 国产短视频精品一区二区三区| 午夜精品一区二区三区在线观看| 精品视频无码一区二区三区| 国偷自产av一区二区三区| 婷婷国产成人精品一区二| 日韩免费视频一区| 亚洲第一区二区快射影院| 亚洲AV无码一区二区三区人| 亚洲狠狠久久综合一区77777 | 亚洲一区二区在线视频| 国产亚洲自拍一区| 狠狠综合久久AV一区二区三区| 久夜色精品国产一区二区三区| 国产伦一区二区三区高清 | 国精品无码一区二区三区在线蜜臀| 鲁大师成人一区二区三区| 精品国产免费一区二区| 国产伦精品一区二区三区在线观看| 精品久久久中文字幕一区| 国产人妖视频一区在线观看| 日本精品夜色视频一区二区| 亚洲av片一区二区三区| 国产福利电影一区二区三区久久久久成人精品综合 | 在线电影一区二区三区| 国产一区二区三区四| 久久99精品免费一区二区| 中文字幕VA一区二区三区| 精品一区二区三区在线观看视频| 国产成人精品久久一区二区三区| 精品少妇人妻AV一区二区| 动漫精品专区一区二区三区不卡| 中文字幕日韩一区二区三区不| 色偷偷久久一区二区三区| 无码aⅴ精品一区二区三区| 国产精品福利区一区二区三区四区| 成人区精品人妻一区二区不卡| 精品无码一区二区三区在线|