分享成果,隨喜正能量】行走于塵世,繁忙的工作節奏,沉重的生活壓力,似乎想讓生活過得行云流水,真的不是一件容易的事情,那么何不讓它變得簡單一些?或許我們不夠時尚,至少我們可以簡約,或許我們不夠精致,至少我們可以簡潔。把每一段旅途,都當做最好的修行;把每一段旅途遇到的困難,都當做自己的助力;把每一段旅途中遇到的人,都當做今生的因緣。
《VBA信息獲取與處理》教程是我推出第六套教程,目前已經是第一版修訂了。這套教程定位于最高級,是學完初級,中級后的教程。這部教程給大家講解的內容有:跨應用程序信息獲得、隨機信息的利用、電子郵件的發送、VBA互聯網數據抓取、VBA延時操作,剪貼板應用、Split函數擴展、工作表信息與其他應用交互,FSO對象的利用、工作表及文件夾信息的獲取、圖形信息的獲取以及定制工作表信息函數等等內容。程序文件通過32位和64位兩種OFFICE系統測試。是非常抽象的,更具研究的價值。
教程共兩冊,八十四講。今日的內容是專題六“VBA中利用XMLHTTP完成網抓數據”的第1講:XMLHTTP的簡單講解
現在的社會是網絡的社會,離開了網絡,很多工作會變得不通暢。我們日常的生活也是和網絡緊密聯系一起的,那么網絡是如何搭建的呢?我們可以通過本講的講解了解到HTTP 超文本傳輸協議,TCP/IP的介紹,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對象.
1)創建XMLHTTP對象 //需MSXML4.0支持
2)打開與服務端的連接,同時定義指令發送方式,服務網頁(URL)和請求權限等。客戶端通過Open命令打開與服務端的服務網頁的連接。與普通HTTP指令傳送一樣,可以用"GET"方法或"POST"方法指向服務端的服務網頁。
3)發送指令。
4)等待并接收服務端返回的處理結果。
5)釋放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
創建完測試類后運行成功。。。
感謝閱讀,三連是最大的支持!
*請認真填寫需求信息,我們會在24小時內與您取得聯系。