在技術方面無論我們怎么學習,總感覺需要提升自已不知道自己處于什么水平了。但如果有清晰的指示圖供參考還是非常不錯的,這樣我們清楚的知道我們大概處于那個階段和水平。

Java程序員
高級特性
反射、泛型、注釋符、自動裝箱和拆箱、枚舉類、可變
參數、可變返回類型、增強循環、靜態導入
核心編程
IO、多線程、實體類、
集合類、正則表達式、
XML和屬性文件
圖形編程
AWT(Java2D/JavaSound/JMF)、Swing、SWT、JFace
網路編程
Applet、Socket/TCP/UDP、NIO、RMI、CORBA
Java語法基礎
類、抽象類、接口、最終類、靜態類、匿名類、內部類、異常類、編碼規范
Java開發環境
JDK、JVM、Eclipse、Linux
Java核心編程技術
Java,設計而又非常精巧的語言。學習Java,須從Java開發環境開始,到Java語法,再到Java的核心API。
1.Java開發入門:Java開發環境的安裝與使用,包括JDK命令、EclipseIDE、Linux下Java程序的開發和部署等。
2.Java語法基礎:基于JDK和Eclipse環境,進行Java核心功能開發,掌握Java面向對象的語法構成,包括類、抽象類、接口、最終類、靜態類、匿名類、內部類、異常的編寫。
3.Java核心API:基于JDK提供的類庫,掌握三大核心功能:
A。Java核心編程:包括Java編程的兩大核心功能——Java輸入/輸出流和多線程,以及常用的輔助類庫——實體類、集合類、正則表達式、XML和屬性文件。
B。Java圖形編程:包括Sun的GUI庫AWT(Java2D、JavaSound、JMF)和Swing,IBM和GUI庫SWT和Jface;
C. Java網路編程:Applet組件編程,Socket編程,NIO非阻塞Socket編程、RMI和CORBA分布式開發。
4.Java高級特性:掌握JDK1.4、JDK5.0、JDK6.0中的Java高級特性,包括反射、泛型、注釋,以及java高級特性——自動裝箱和拆箱、枚舉類、可變參數、可變返回類型、增強循環、靜態導入等。
JavaEE初級軟件工程師
JSF框架開發技術
配置文件(頁面導航、后臺Bean)、JSF組件庫(JSF EL語言、HTML標簽、事件處理、)、JSF核心庫(格式轉換、輸入驗證、國際化)
Javaweb核心開發技術
開發環境(Eclipse、Linux)
三大組件(JSP、JavaBean、Servlet)
擴展技術(EL、JSTL、Taglib)
網頁開發技術
HTML、XML、CSS、JavaScript、AJAX
數據庫設計技術
SQL、MySql、Oracle、SQLServer、JDBC
Web服務器(Tomcat/Jetty/Resin/JBossWeb)
JavaWeb核心技術:
JavaWeb項目開發的全過程可以分解為:
網頁開發+數據庫設計——>JavaWeb項目開發,其中,javaWeb由6項基本技術組成:JSP+JavaBean+Servlet+EL+JSTL+Taglib,而JSF正是將這6種技術進行有機結合的技術框架:
JavaEE中級軟件工程師
四種經典架構SSH1、SSI1、SSH2、SSI2
Struts1表現層框架
入門配置、核心組件、標簽庫、國際化、數據檢驗、數據庫開發、Sitemesh集成、集成Hibernate/iBATIS
Struts2表現層框架
入門配置、核心組件、標簽庫、國際化、數據校驗、Sitemesh集成轉換器、攔截器、集成Hibernate/iBATIS
Spring業務層框架
入門配置、IoC容器、MVC、標簽庫、國際化、數據校驗、數據庫開發
Hibernate持久層框架
MySQL、Oracle、SQLServer iBATIS持久層框架
MySQL、Oracle、SQLServer
Web服務器(Tomcat/Jetty/Resin/JBossWeb)
Java高級軟件工程師
javaWeb開源技術與框架
工作流、
規則引擎
搜索引擎、
緩存引擎 、
任務調度、
身份認證
報表服務、
系統測試、
集群、
負載平衡、
故障轉移
JavaWeb分布式開發技術
JTA(Java事物管理)
JAAS(Java驗證和授權服務)
JNDI(Java命名和目錄服務)
JavaMail(Java郵件服務)
JMS(java信息服務)
WebService(web服務)
JCA(java連接體系)
JMS(java管理體系)
應用服務器(JBossAS/WebLogic/WebSphere)
JavaEE系統架構師
面向云架構(COA)
COA、SaaS、網格計算、集群計算、分布式計算、云計算
面向資源架構(ROA)
ROA、RESI
面向web服務架構(SOA)
WebService、SOA、SCA、ESB、OSGI、EAI
Java設計模式
創建式模式:抽象工廠/建造者/工廠方法/原型/單例
構造型模式:適配器/橋接/組合/裝飾/外觀/享元/代理
行為型模式:責任鏈/命令/解釋器/迭代子/中介者/備忘錄/觀察者/狀態/策略/模板方法/訪問者
Java與UML建模
對象圖、用例圖、組件圖、部署圖、序列圖、交互圖、活動圖、正向工程與逆向工程
CTO首席技術官
發展戰略
技術總監
團隊提升
團隊建設
項目管理
產品管理
企業級項目實戰(帶源碼)地址:http://zz563143188.iteye.com/blog/1825168
收集五年的開發資料下載地址: http://pan.baidu.com/share/home?uk=4076915866&view=share
下面的更深入的有興趣可以了解一下,我的目的不是要大家掌握下面的知識,只是希望擴展自己的思維,摘自牛人的技術博客。
/**************************************************牛人必看*****************************************************************/
系統后臺框架:

前端工程師技能:

B2C電子商務基礎系統架構解析
運營B2C日 久,越來越深刻的意識到IT系統對確保規范化業務流轉,支撐消費者端的均一服務有著決定性的作用。于是,一直想好好整理下相關的系統架構,怎奈俗務纏身, 一直拖到今日,猛然發現下周娃很可能就要出生,拖無可拖,快馬加筆,居然整出來了。本文的重點是理清系統的邏輯關系,詳細的功能模塊請參見結尾附上的系統 架構圖。
首先,聊下對系統邏輯架構的看法;我個人始終堅持認為,系統的開發與演化,前臺嚴格follow消費者的購買流程,后臺則盯牢訂單流轉,牢牢抓住這兩條主線,才能高屋建瓴的看清B2C的邏輯鏈和數據流,更深刻的規劃功能模塊,從而更有效支撐實際業務的流轉。
前臺系統包括:商品展示,內容展示,訂單確認,支付系統,用戶中心四大模塊
一,商品展示
按照Ebay的內部分類,任何將商品以單個或批量的方式展示給消費者的功能均應歸入此系統。因此,該系統至少包括:
A,站內搜索(搜索提示,搜索規則,搜索成功頁,搜索不成功頁,相似推薦)
B,導航(頻道導航,其他導航如銷售排行,廣告位,推薦位,文字鏈,Also buy等)
C,商品分類(品牌分類,品類分類,屬性分類如剪裁形式)
D, 登陸頁(商品列表頁,商品詳細頁,商品活動頁)
這里的訪問邏輯是:A /B/C分流消費者去往相對個性化的頁面,由登陸頁體現商家的核心訴求和價值傳遞,完成call-to-action的第一步。
二,內容展示
內容展示較為簡單,對純購物品牌而言包括:
A,公告區
B,幫助中心
C,論壇(如需商城與論壇發生交互,則需自行開發,否則可集成discuz做同步登陸即可)
大家都知道,就不多說了。
三,訂單確認
訂單確認,就是幫助消費者正確提交訂單信息的環節,看似簡單,實則非常復雜,需要對很多信息邏輯判斷和處理,一般由2個部分組成:
A,購物車(購物車浮層,購物車頁面,無注冊購買)
無注冊購買是需要慎用的功能,除非刻意追求用戶的短平快下單,如團購/換購,一般不推薦使用,會造成系統異常復雜,開發量也很大。
B,訂單提交(返回購物車,收貨地址&地址薄,支付方式判斷,配送方式,發票,訂單標記,實付金額計算等等)
值得一提的是,幾乎大多數的促銷邏輯運算在這個環節完成,充分考慮各種促銷方式之間的互斥與重疊是系統設計的核心,需要充分考慮各種情況,避免出現邏輯漏洞。
四,支付系統
與一般的想象不同,支付系統其實并不簡單等于第三方支付工具接入:
A,外部支付系統(支付寶將接口,財付通接口,網銀直聯端口,信用ka分期端口)
B,內部支付系統(賬戶余額,積分,禮品卡,優惠券)
支付系統的邏輯設計不但需要考慮到各種極端情況的發生(如一張訂單先用禮品卡,再用積分,最后網銀支付),還要預留財務做賬所需的相關字段,并充分考慮訂單取消之后如何回滾各類內部賬戶。
五,用戶中心
用戶中心的實質是用戶自助功能的dashboard,一般4個部分組成:
A,注冊&登陸(快速注冊,完整注冊,注冊有禮,推薦注冊,密碼找回,主站id登陸,open-id登陸如QQ,新浪微博等)
B,訂單中心(歷史訂單狀態,中間狀態訂單修改,物流追蹤)
C,服務中心(各類自助服務如退款申請,退換貨申請,建議與投訴等)
D, 信息管理(用戶基本信息管理和賬戶信息管理)
用戶中心的價值在于:盡可能引導用戶自行獲取所需的信息并提交所需的服務,在提升服務準確率,及時性的同時降低對人工成本。
后臺系統包括:商品&促銷,CRM,訂單處理,WMS,采購管理,財務管理,報表管理,系統設置,WA系統9大模塊
一, 商品&促銷
商品&促銷模塊的核心在于確保消費者下單之前,前臺內容所見即所得
A, 商品管理(品類管理,品牌管理,單品管理)
B, 促銷管理(活動管理和自定義活動模板管理)
在上述模塊中,最重要的是2個部分:單品管理中的批量產品生成的自動程序和活動管理中“共享與互斥”管理。前者用于大幅提升上新速度,后者避免促銷活動失控。
二, CRM
CRM是對B2C核心資源—會員的管理,服務與再營銷系統,包括如下部分:
A,會員管理(會員信息的增刪改查和到其他系統的鏈接)
B,用戶關懷(條件觸發和人工觸發相關EDM & 短信 & OB)
C,定向營銷(會員分組和營銷活動管理)
D, 客服管理(內容非常多,集成所有需前臺與后臺交互的功能,詳情還是看圖吧)
E, 呼叫中心(IVR,坐席管理,統計報表,參數傳遞與窗口嵌入)
值得注意的,EDM和短信通道市面上已經有成熟的外包服務商,一般都會外包;呼叫中心和在線客服自行開發成本太高,特別是呼叫中心系統,業務初期也都是外包的。
三, 訂單處理
訂單處理是在訂單未正式進入倉儲部門處理之前,對訂單的前置性處理環節。
A,訂單錄入(電話訂購,網上下單,外部團購訂單,無金額訂單錄入如禮品單)
B,訂單審核(自動審核和人工審核)
C,RMA處理(RMA申請單和RMA處理單)
RMA的邏輯也異常復雜,需要在效率和成本之間找平衡,確保在不拖垮倉儲部門的正常出入庫的前提下對消費者端快速有效close工單;對內部則需要控制成本,貨損不能超過預算上限。
四, WMS(Warehouse Management system倉庫管理系統)
WMS的流程很長,功能模塊也很多,大致分為入庫管理,庫存管理,出庫管理和票據管理4個模塊四個模塊,細細道來就是另外一篇文章了,各位可以參考 我這篇文章:庖丁解牛—B2C倉儲內部運作解密(上,中,下)http://blog.sina.com.cn/wangxida0855
五, 采購管理
采購管理的核心是有效跟進采購合同/發票的狀態,大貨的采購入庫/退庫,財務結算和在倉庫存查詢和處理。
A,供應商管理(供應商信息管理,合同發票管理)
B,采購單管理(PO單管理,負PO單管理)
C,庫存管理(庫存查詢,庫存占用單,庫存變動log)
六, 財務管理
B2C的財務管理,主要是對供應商,渠道和內部費用支出的成本控制。
A,供應商結算
B,渠道結算
C,配送結算
D, 內部結算
說實在的,哥對財務這塊也不算很了解,大家將就看看,圖片上有明細。
七, 報表管理
報表是B2C業務的宏觀表現,理論上說,每個部門的KPI都應該從中找到。
A,搜索報表(站內搜索量查詢)
B,銷售報表(多個維度銷量查詢,優惠券使用情況,報表導出)
C,財務報表
D, 客服報表(客服日報和坐席報表)
前者反映與消費者發生的日常交互(包括正常與異常),后者考核客服的工作績效
E, 倉儲物流報表
這幾塊報表,是業務運作的核心,涉及到公司機密,就不能寫的太細了,見諒。
八, 系統設置
這塊大家都知道是干嘛的,也就不多說了,分成三塊。
A,基礎設置(和業務有關的一些字段值)
B,權限設置(不同賬號的操作權限和操作記錄)
C,其他設置
九, WA系統(Web Analytcis)
網站分析系 統,幾乎全是外購,很少有能夠自建的,即使自建,最多做幾個簡單的模塊。用于實戰的,要么是免費的GA(Google Analytics),要么是昂貴的Omniture。這塊的知識,細細說來也是另外一篇文章了,有興趣的同學可以看我這篇科普文章:揭秘—我所知道的網 站分析(上,下) http://blog.sina.com.cn/wangxida0855
最后,上全系統大圖,再感慨一句,B2C系統,真是一個大工程啊。

fr http://blog.sina.com.cn/s/blog_59d6717c0100syh3.html
摘要: ajax+json+Struts2實現list傳遞(轉載)一、首先需要下載JSON依賴的jar包。它主要是依賴如下: json-lib-2.2.2-jdk15 ezmorph-1.0.4 commons-logging-1.0.4&nbs...
閱讀全文
摘要: Batis 簡介:iBatis 是apache 的一個開源項目,一個O/R Mapping 解決方案,iBatis 最大的特點就是小巧,上手很快。如果不需要太多復雜的功能,iBatis 是能夠滿足你的要求又足夠靈活的最簡單的解決方案,現在的iBatis 已經改名為Mybatis 了。官網為:http://www.myb...
閱讀全文
第一篇: JavaScript 跳轉方法一:
<script language="javascript"> window.location= "http://www.baidu.com"; </script>
|
方法二:
<script language="javascript"> document.location = "http://www.baidu.com"; </script>
|
方法三: (帶進度條)
<html> <head> <meta http-equiv="Content-Language" content="zh-cn"> <meta HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=gb2312"> <title>跳轉到baidu.com</title> </head> <body> <form name=loading> <P align=center><FONT face=Arial color=#0066ff size=2>loading...</FONT> <INPUT style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-WEIGHT: bolder; PADDING-BOTTOM: 0px; COLOR: #0066ff; BORDER-TOP-style: none; PADDING-TOP: 0px; BORDER-RIGHT-style: none; BORDER-LEFT-style: none; BACKGROUND-COLOR: white; BORDER-BOTTOM-style: none" size=46 name=chart> <BR> <INPUT style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BORDER-LEFT: medium none; COLOR: #0066ff; BORDER-BOTTOM: medium none;" size=47 name=percent> <script language="javascript"> var bar=0 var line="||" var amount="||" count() function count(){ bar=bar+2 amount =amount + line document.loading.chart.value=amount document.loading.percent.value=bar+"%" if (bar<99){ setTimeout("count()",100); }else{ window.location = "http://www.baidu.com/"; } } </script> </P> </form> </body> </html>
|
第二篇: 頁面跳轉
<head> <meta http-equiv="refresh" content="10; url=http://www.baidu.com"> </head>
|
第三篇: 動態頁面跳轉
方法一: PHP 跳轉
<?php header("location: http://www.baidu.com"); ?>
|
方法二: ASP 跳轉
<%
response.redirect "http://www.baidu.com"
%>
FYI:
<%
Dim ID1
Dim ID2
dim str
ID1 = Request("forumID")
ID2 = Request("threadID")
str="/blog/threadview.asp?forumID="& ID1 &"&threadID=" & ID2
response.redirect str
%>
<%
response.redirect "http://www.baidu.com"
%>
FYI:
<%
Dim ID1
Dim ID2
dim str
ID1 = Request("forumID")
ID2 = Request("threadID")
str="/blog/threadview.asp?forumID="& ID1 &"&threadID=" & ID2
response.redirect str
%>
zencart如何設置smtp發郵件,zencart不能發email,發email失敗怎么辦?zen cart要使用gmail發送郵件,首先要把你的gmail賬戶開通pop/smtp, 然后再zencart后臺設置郵件發送方式,郵箱帳號,密碼。
具體操作方法如:
進入后臺--商店設置--電子郵件,首先選擇”電子郵件發送方式“為smtpauth。然后輸入你的gamil郵箱地址。
最后設置
1)首先后臺電子郵件 發送方式是:smtpauth
2)smtp帳號郵箱:xxx@gmail.com
3)smtp帳號密碼:xxxxxxxx
4)smtp主機:smtp.gmail.com
5)smtp服務器端口:465或者587
注意:國內的郵箱最好使用163郵箱:服務器:smtp.163.com 端口:465/25,其他的郵箱不能發,具體原因暫時不清楚。
如果這樣設置是正確的。但是有些主機還是會出現Email Error: SMTP Error: Could not connect to SMTP host.這樣的情況 。
這個需要服務器支持。檢查下后臺-工具-服務器信息里是否有OpenSSL。因為google 傳輸是ssl://smtp.gmail.com協議。
所以需要服務器支持Openssl這個尤為重要。
補充重要情況:電子郵件必須從現有域名發送 設置成 no
zencart-email-smtp.png

如果還是發不了email,可參考下面的技術細節:
在服務器上 telnet smtp.gmail.com 465 確定能連接
yum -y install openssl 安裝ssl,重啟apache在試一試
開通gmail帳號的pop/smtp功能:
Zen Cart后臺郵件發送不成功的解決辦法,錯誤提示“電子郵件錯誤: The following From address failed: ”
幾個需要注意的設置項:
1、服務器應啟用SMTPAUTH電子郵件發送方式;
2、檢查SMTP帳號、郵箱、密碼、郵件服務器域名和端口是否設置正確。
3、發件人郵件地址要用你的SMTP郵箱帳號,并且電子郵件必須從現有域名發送設為Yes.
* 如果上述都沒錯,請多換其他SMTP賬戶/郵箱測試。推薦gmail
收費調試服務
我們希望您能自己搞定這些問題,但是如果你多方測試都無法找到發郵件不成功的解決辦法,我們也提供收費調試服務。診斷調試要花費技術很多時間,調試一次需要的時間可能很長,估計2-5小時。每次調試收費200元。保證幫你調試到前臺 聯系我們 contact us 頁面能發送郵件
一、導出數據庫用mysqldump命令(注意mysql的安裝路徑,即此命令的路徑):
1、導出數據和表結構:
mysqldump -u用戶名 -p密碼 數據庫名 > 數據庫名.sql
#/usr/local/mysql/bin/ mysqldump -uroot -p abc > abc.sql
敲回車后會提示輸入密碼
2、只導出表結構
mysqldump -u用戶名 -p密碼 -d 數據庫名 > 數據庫名.sql
#/usr/local/mysql/bin/ mysqldump -uroot -p -d abc > abc.sql
注:/usr/local/mysql/bin/ ---> mysql的data目錄
二、導入數據庫
1、首先建空數據庫
mysql>create database abc;
2、導入數據庫
方法一:
(1)選擇數據庫
mysql>use abc;
(2)設置數據庫編碼
mysql>set names utf8;
(3)導入數據(注意sql文件的路徑)
mysql>source /home/abc/abc.sql;
方法二:
mysql -u用戶名 -p密碼 數據庫名 < 數據庫名.sql
#mysql -uabc_f -p abc < abc.sql
建議使用第二種方法導入。
注意:有命令行模式,有sql命令
摘要: 我們以一個學習的心態來對待這些PHP后門程序,很多PHP后門代碼讓我們看到程序員們是多么的用心良苦。強悍的PHP一句話后門這類后門讓網站、服務器管理員很是頭疼,經常要換著方法進行各種檢測,而很多新出現的編寫技術,用普通的檢測方法是沒法發現并處理的。今天我們細數一些有意思的PHP一句話木馬。利用404頁面隱藏PHP小馬:01<!DOCTYPE HTML PUBLIC "-...
閱讀全文
步驟:
1.創建一個Hello World模塊
2.為這個模塊配置路由
3.為這個模塊創建執行控制器
創建Hello World模塊
創建模塊的結構目錄:
app/core/local/Sjolzy/HelloWorld/Block
app/core/local/Sjolzy/HelloWorld/controllers
app/core/local/Sjolzy/HelloWorld/etc
app/core/local/Sjolzy/HelloWorld/Helper
app/core/local/Sjolzy/HelloWorld/Model
app/core/local/Sjolzy/HelloWorld/sql
創建config.xml的內容(app/core/local/Sjolzy/HelloWorld/etc/config.xml):
<config>
<modules>
<Sjolzy_HelloWorld>
<version>0.1.0</version>
</Sjolzy_HelloWorld>
</modules>
</config>
然后創建一個系統配置文件激活這個模塊
Sjolzy_HelloWorld.xml(app/etc/modules/Sjolzy_HelloWorld.xml)
<config>
<modules>
<Sjolzy_HelloWorld>
<active>true</active>
<codePool>local</codePool>
</Sjolzy_HelloWorld>
</modules>
</config>
檢查是否模塊已經激活:先清空magento緩存(var/cache),在后臺管理:System->Configuration->Advanced 展開Disable Modules Output,看是否Sjolzy_HelloWorld顯示出來。
配置路由
路由是用來把一個URL請求轉換成一個執行控制器的方法。
需要在magento的全局配置中顯式的定義你的路由。
在config.xml(app/core/local/Sjolzy/HelloWorld/etc/config.xml)中:
<config>
...
<!-- /* fontend:指向網站的前臺(也可以是admin|install) */ -->
<frontend>
<!-- /* routers:路由對象的定義或路由路徑的定義 */ -->
<routers>
<!-- /* helloworld:指向網站的前臺 */ -->
<helloworld>
<use>standard</use>
<args>
<!-- /* module:模塊名字的小寫版本 */ -->
<module>Sjolzy_HelloWorld</module>
<!-- /* fontName:路由過程中的一個參數,只跟路由相關(Front Controller則是用來實例化所有路由) */ -->
<frontName>helloworld</frontName>
</args>
</helloworld>
</routers>
</frontend>
</config>
為路由創建執行控制器
路由會把控制權交給控制器,我們已經定義了路由,現在來定義我們的執行控制器。
app/code/local/Sjolzy/HelloWorld/controllers/IndexAction.php(模塊的控制器放在子目錄controllers<小寫>里,這是magento的規定)
<?php
class Sjolzy_HelloWorld_IndexController extends Mage_Core_Controller_Front_Action{
public function indexAction(){
echo 'Hello World!';
}
}
?>
還是情況緩存,請求URL:http://example.com/helloworld/index/index
注:http://example.com/frontName/執行控制器/執行方法
如果看到空白頁面上寫著'Hello World!',則你的模塊創建成功!
近幾年很流行 Ajax,而 Ajax 的本質就 是 XMLHttpRequest,是客戶端 XMLHttpRequest 對象的使用。相對于 Ajax,服務端 XMLHTTP 就是在服務端使 用 XMLHttpRequest 對象了。雖然說,在服務端使用異步請求是比較不方便的,但是做為可以服務端發送 HTTP 請求的組件,學習一下也是 沒有壞處的。[喝小酒的網摘]http://blog.const.net.cn/a/2589.htm
這里,我講的是在 ASP 環境中使用服務端 XMLHttpRequest,并以 JScript 做為演示代碼的語言,因此,你需要了解 ASP 以及 JScript。
服 務端 XMLHTTP,通常會用在獲取遠程主機的網頁或者其他內容,新聞聚合系統一般就是使用服務端 XMLHTTP 對象來獲取要聚合的 Feed 的 內容,然后使用 XMLDOM 對象來分析 Feed 的內容,取出新聞的標題、作者、內容等信息,再存在數據庫中,然后將若干個數據源的新聞一起顯示在 一起。抓蝦就是這樣一個新聞聚合器,但是它不是用 ASP 寫的就是了 :)
在 ASP 中,我們可以用以下代碼來創建一個 ServerXMLHTTP 對象,而這個對象,就是我們在服務端進行一切操作的基礎。
程序代碼:
// demo code from xujiwei
// @website: http://www.xujiwei.cn/
var xmlhttp = new ActiveXObject("MSXML2.ServerXMLHTTP.5.0");
首先來了解一下 ServerXMLHTTP 對象有哪些比較有用的方法:
1. abort 這個方法用于取消 XMLHTTP 的請求。如果 XMLHTTP 對象以異步方式發送請求,如果到達一定的時間請求仍然沒有返回,就可以使用這個方法來取消請求。
2. getAllResponseHeaders 這個方法的返回值是一個字符串,相當于 HTTP 請求的頭部去掉了請求方法、URI和協議版本信息。
3. getResponseHeader 這個方法用來獲取指定頭部信息,比較有用的就是可以用來獲取返回數據的 Content-Type、Referer 等。
4. open 使用指定的請求方法、URI和同步方式以及認證信息等初始化一個請求。
5. send 發 送 HTTP 請求,等待接收響應數據,注意,如果是以同步方式發送請求,send方法調用后不會立即返回,而是等到請求完成后才會返回,而以異步方法請 求時,則會立即返回。另外,send方法帶有一個可選參數body,表示要發送的數據,這在使用 POST 方法時比較有用。
6. setTimeout 設置 ServerXMLHTTP 對象的 4 個超時時間,分別是:域名解析、連接服務器、發送數據、接收響應。可以通過設置相應的超時時間來控制 ServerXMLHTTP 對象,以免 ServerXMLHTTP 不能及時返回而造成程序停止響應。
7. setRequestHeader 設 置請求的 Header,在客戶端 XMLHttpRequest中,通常用來設置請求的數據類型,或者標識請求的方法等等,例如 jquery 會增加 頭部標識 X-Request-With,表示請求是從 XMLHttpRequest 對象發出,以方便服務端做出相應的動作。
8. waitForResponse 在使用異步方式發送請求時,可以用這個方法來控制請求的進程。在服務端腳本中,不可以像客戶端那樣直接使用回調函數來控制異步請求,也沒有相應的函數來使用程序休眠一定的時間,因此,為了等待請求返回,我們可以使用這個方法來等待一定時間。
另外,還有其他一些方法,如 getOption、setOption、setProxy 等,這些方法用得比較少,因此這里不再介紹,需要了解的朋友可以查閱 MSDN。
接下來,再看看 ServerXMLHTTP 對象的屬性:
1. onreadystatechange XMLHTTP 對象狀態改變時的回調函數,這個屬性為異步操作奠定了一個基礎,可以讓程序在不用查詢 XMLHTTP 對象狀態的情況獲知 XMLHTTP 操作是否已經完成。
2. readyState XMLHTTP 對象狀態,有 5 個值,從 0 到 4,分別代表的意思是:
0 - 未初始化,剛使用 new ActiveXObject("MSXML.ServerXMLHTTP.5.0") 創建時對象所處的狀態
1 - 載入中,這個時候,已經調用了 open 方法,但是還沒有使用 send 方法發送數據
2 - 已經載入,已經調用了 send 方法發送數據,但是還沒有可用的響應流
3 - 正在交互,正在接收數據,這個時候可以使用 responseBody 和 responseText 屬性來獲取已經得到的部分數據了
4 - 完成請求,全部數據已經接收完成
通常情況下,我們只需要判斷一下狀態 4 即可,這個時候數據已經全部載入,使用 responseBody 或 responseText 屬性就能獲取需要的數據。
3. status HTTP 響應狀態碼,正常情況應該為 200,如果請求的資源不存在,就會返回 404,還有其他狀態碼如服務器錯誤 500 等。
4. statusText HTTP 響應狀態文本,用于描述響應狀態碼所代表的意思,諸如 200 OK 中的 OK,404 Not Found 中的 Not Found
5. responseBody 響應數據的字節數組,這在 VBScript 里是可以直接使用的,但是在 JScript 里就需要轉換過了。
6. responseText 以文本方式獲取響應數據
7. responseXML 將響應數據作為一個 XMLDOM 對象來返回,這在請求的數據是一個 XML 文檔時特別有用
8. responseStream 響應流對象,這個屬性不常用
在 ServerXMLHTTP中,異步請求不再是主要用途,往往是同步的請求用得更多,因為在服務端編程中,程序的執行是需要迅速結束并返回結果的,不像在 桌面程序中,有一個消息循環。這樣就導致了在服務端編程中,同步編程用得更多。當然,這并不是說異步請求沒有用處,在一定的情況下,異步請求會有很大的作 用。
1. 簡單的使用ServerXMLHTTP請求并顯示指定Url
首先來看一下很簡單的例子,使用ServerXMLHTTP請求Google的首頁并顯示出來:
程序代碼:
<%@LANGUAGE="JScript" CODEPAGE="65001"%>
<%
// code from xujiwei
// http://www.xujiwei.cn
var url = "http://www.google.cn";
var xmlhttp = new ActiveXObject("MSXML2.ServerXMLHTTP.5.0");
xmlhttp.open("GET", url, false);
xmlhttp.send("");
Response.BinaryWrite(xmlhttp.responseBody);
xmlhttp = null;
%>
在瀏覽器查看這個頁面,你就可以看到Google的首頁了:
圖片附件
但是,我們可以看到,這里的Logo圖片是沒有顯示的,因為這個logo在網頁源代碼里是以相對路徑的方式來指定的:
<img src=/intl/zh-CN/images/logo_cn.gif width=286 height=110 border=0 alt="Google" title="Google">
但是,我們的測試服務器里并沒有這個圖片文件,因此瀏覽器就會顯示此圖片的替代文字“Google”。
這 里我使用了xmlhttp的responseBody屬性,這是因為,在不知道所請求的網頁是使用什么編碼的情況下,可以讓瀏覽器來處理這個問題,而不用 在服務器處理編碼。如果要在服務器處理編碼,你必需知道你所請求的URL所返回的內容是使用什么編碼的,并且正確的將返回內容進行轉碼以使得客戶端瀏覽器 能正常的顯示。
例如,我們請求Baidu的首頁,就會因為編碼問題而導致頁面完全錯亂:
圖片附件
所以,使用responseText或者responseBody,完全取決于我們的需要,并不是一成不變的,或者,在某些時候,我們要使用的并不是這兩個中的一個,而是responseXML:)
2. 設置超時
在 使用ServerXMLHTTP發送同步請求時,整個ASP程序的執行是被阻塞了的,也就意味著在開始發送請求到請求完成響應這段時間里,我們是做不了任 何事情的。那么這里就有幾個問題,如果所請求的域名解析很慢怎么辦?如果程序運行的服務器與請求的服務器之間的網絡環境比較差導致連接很慢怎么辦?如果要 發送的數據量很大但是帶寬不夠怎么辦?同樣如果響應的數據量很大但是帶寬不夠怎么辦?
服務器所在環境及網絡條件我們是無法改善的,因為,面對這些問題,我們只能采取回避的策略,即如果碰到這些問題,我們就直接丟掉這個請求。這時,ServerXMLHTTP的超時機制就有很大的用處了。
在 前一篇中,我介紹了ServerXMLHTTP的常用方法,其中有一個setTimeouts方法,就是用來設置ServerXMLHTTP對象的四個超 時時間,分別是:域名解析超時時間(resolveTimeout)、連接超時時間(connectTimeout)、數據發送超時時間 (sendTimeout)、數據接收超時時間(receiveTimeout)。這四個超時時間所代表的意義可以從它們的字面來理解,它們分別對應了這 一節開頭所提出一的四個問題。
在不使用setTimeouts方法進行設置的情況下,域名解析超時時間(resolveTimeout)是 無限的,即不會在域名解析時產生超時,連接超時時間(connectTimeout)的默認值為60秒,數據發送超時時間(sendTimeout)的默 認值為30秒,數據接收超時時間(receiveTimeout)的默認值也是30秒。
通常情況下,我們不需要默認值中所指定的那么長的超時時間,因為碰到了最壞的情況下,在一個頁面顯示時,訪客將要面對2分鐘左右的無響應時間,這時訪客往往認為這個頁面是無效的并且會離開這個頁面。
所 以我們要做的就是給ServerXMLHTTP設置一個較短的超時時間,一般情況下,域名解析和連接遠程服務器都可以在2秒內完成,發送數據時間視數據量 而定,如果只是使用GET請求,這個數據量是很小的,也可以在2秒內完成,而響應,則可以稍微長一點,定在10秒左右,超過10秒時可以認為遠程服務器沒 有響應。
需要注意的是,setTimeouts方法所使用的參數單位是以毫秒為單位的,也就是說,如果 要指定2秒的超時時間,所用的參數為2000。另外,setTimeouts的參數順序也是固定的,按順序為:域名解析超時時間 (resolveTimeout)、連接超時時間(connectTimeout)、數據發送超時時間(sendTimeout)、數據接收超時時間 (receiveTimeout)。
那么,可以使用下面的代碼來完成超時設置:
程序代碼:
<%@LANGUAGE="JScript" CODEPAGE="65001"%>
<%
// code from xujiwei
// http://www.xujiwei.cn
var url = "http://www.google.com";
var xmlhttp = new ActiveXObject("MSXML2.ServerXMLHTTP.5.0");
// 設置超時時間,注意參數順序
xmlhttp.setTimeouts(2000, 2000, 2000, 10000);
xmlhttp.open("GET", url, false);
xmlhttp.send("");
Response.BinaryWrite(xmlhttp.responseBody);
xmlhttp = null;
%>
如 果在某個階段超時了,程序會拋出異常,在JScript里可以使用try...catch來捕獲,并根據ServerXMLHTTP對象的 readyState屬性來獲知是在哪個階段產生了超時異常。注意,同步請求時,超時異常會發生在調用send方法所在的行,例如上例中的 xmlhttp.send("")。
程序代碼:
<%@LANGUAGE="JScript" CODEPAGE="65001"%>
<%
// code from xujiwei
// http://www.xujiwei.cn
var url = "http://www.youtube.com/";
var xmlhttp = new ActiveXObject("MSXML2.ServerXMLHTTP.5.0");
// 設置超時時間,注意參數順序
xmlhttp.setTimeouts(2000, 2000, 2000, 10000);
xmlhttp.open("GET", url, false);
try {
xmlhttp.send("");
}
catch(e) {
Response.Write("發生異常:" + e.message + "<br/>");
// 判斷是否為超時錯誤
if(e.number == -2147012894) {
var step = "";
// 判斷超時錯誤發生所在的階段
switch(xmlhttp.readyState) {
case 1:
step = "解析域名或連接遠程服務器"
break;
case 2:
step = "發送請求";
break;
case 3:
step = "接收數據";
break;
default:
step = "未知階段";
}
Response.Write("在 " + step + " 時發生超時錯誤");
}
Response.End();
}
Response.BinaryWrite(xmlhttp.responseBody);
xmlhttp = null;
%>
3. 請求使用HTTP認證的頁面
呃,雖然說目前使用HTTP基本認證的已經少之又少,但是,總該知道ServerXMLHTTP有這么一個功能,可以直接實現HTTP基本認證。
在ServerXMLHTTP對象的open中,我們通常用到的只是它的前3個參數,即method、uri、async,但事實上,它還有另外兩個可選參數,即用于HTTP基本認證的username及password。
那么,如果某天,我們要使用ServerXMLHTTP訪問某個使用HTTP基本認證的網站,并且我們已經有了認證所需要的用戶名及密碼,那么可以使用以下密碼來訪問需要認證的內容:
程序代碼:
<%@LANGUAGE="JScript" CODEPAGE="65001"%>
<%
// code from xujiwei
// http://www.xujiwei.cn
// 訪問www.google.cn并不需要HTTP認證,這里只是作為一個演示
var url = "http://www.google.cn";
var xmlhttp = new ActiveXObject("MSXML2.ServerXMLHTTP.5.0");
// 用戶名和密碼分別為username和password
xmlhttp.open("GET", url, false, "username", "password");
xmlhttp.send("");
Response.BinaryWrite(xmlhttp.responseBody);
xmlhttp = null;
%>
4. 使用responseXML屬性
有時候,我們所需要的結果并不是文本的,而是一個XML文檔,譬如目前最常用的RSS。這個時候,responseXML屬性就是我們的不二選擇了。
使用responseXML屬性所得到的對象,就是一個DOMDocument對象,這個對象可以使用諸如selectNodes、selectSingleNode這樣的方法來操作XML文檔對象。
例如,我們可以利用ServerXMLHTTP抓取新浪新聞的RSS并顯示出來:
程序代碼:
<%@LANGUAGE="JScript" CODEPAGE="65001"%>
<%
// code from xujiwei
// http://www.xujiwei.cn
// 新浪新聞的RSS地址
var url = "http://rss.sina.com.cn/news/marquee/ddt.xml";
var xmlhttp = new ActiveXObject("MSXML2.ServerXMLHTTP.5.0");
xmlhttp.open("GET", url, false);
xmlhttp.send("");
var xml = xmlhttp.responseXML;
Response.Write("<h1>" + xml.selectSingleNode("/rss/channel/title").text + "</h1>");
var items = xml.selectNodes("/rss/channel/item");
for(var i = 0; i < items.length; i++) {
Response.Write("<h3>" + items[i].selectSingleNode("title").text + "</h3>");
Response.Write("<small>" + items[i].selectSingleNode("pubDate").text + "</small>");
Response.Write("<div>" + items[i].selectSingleNode("description").text + "</div><hr />");
}
items = null;
xmlhttp = null;
%>
這些如果弄明白了,寫一個RSS新聞聚合器就不是難事了。當然XMLDOM操作就不在本系列的范圍之類了。
服務端XMLHTTP(ServerXMLHTTP in ASP)進階應用-User Agent偽裝
這篇開始講講ServerXMLHTTP的進階應用。說是進階應用,但也就是講一些在基本應用里沒有講到的屬性或者方法之類:)
使用setRequestHeader偽裝User-Agent
User-Agent一般是服務端程序用來判斷客戶端瀏覽器、操作系統等信息的標志,它的說明可以參考Wiki,譬如在我的電腦 IE7 的UA就是:
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ;
SLCC1; .NET CLR 2.0.50727; .NET CLR 3.5.21022; .NET CLR 3.5.30729; .NET CLR 3.0.30618)
可以看到,這個UA提供了不少信息,IE版本、Windows版本、.NET版本都有。再看看 Firefox 的:
Mozilla/5.0 (Windows; U; Windows NT 6.0; zh-CN; rv:1.9.0.3) Gecko/2008092417 Firefox/3.0.3 (.NET CLR 3.5.30729)
UA的格式不是本文的重點,因此,如果需要了解UA的具體格式,可以去Google上找找,另外,在http://www.user-agents.org/這里可以找到目前大多數瀏覽器、搜索引擎Spider等的UA。
在我們使用 ServerXMLHTTP 發送請求時,它所用的 User-Agent 是以下內容:
Mozilla/4.0 (compatible; Win32; WinHttp.WinHttpRequest.5)
但是,某些網站會限制這個UA的訪問,比如Google,如果我們使用以下代碼來請求Google的頁面,它使用的是默認UA“Mozilla/4.0 (compatible; Win32; WinHttp.WinHttpRequest.5)”:
程序代碼:
<%@LANGUAGE="JScript" CODEPAGE="65001"%>
<%
// code from xujiwei
// http://www.xujiwei.cn
var url = "http://news.google.cn/?output=rss";
var xmlhttp = new ActiveXObject("MSXML2.ServerXMLHTTP.5.0");
xmlhttp.open("GET", url, false);
//xmlhttp.setRequestHeader("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 6.0; zh-CN; rv:1.9.0.3) Gecko/2008092417 Firefox/3.0.3 (.NET CLR 3.5.30729)");
xmlhttp.send("");
Response.BinaryWrite(xmlhttp.responseBody);
xmlhttp = null;
%>
你會發現,我們會收到一個 403 Forbidden 的錯誤:
圖片附件
為 了使得Google的RSS輸出程序能把我們的識別成正常的RSS閱讀或者一般瀏覽器,就需要在請求發出前設置 Request Header。要設 置 Request Header,只需要簡單的在調用 open 方法之后,send 方法之前使用 setRequestHeader 來設置就行 了,它的語法是 xmlhttp.setRequestHeader(key, value)。下面我們就讓Google的RSS輸出程序把我們的請求識 別為Firefox的請求:
程序代碼:
<%@LANGUAGE="JScript" CODEPAGE="65001"%>
<%
// code from xujiwei
// http://www.xujiwei.cn
var url = "http://news.google.cn/?output=rss";
var xmlhttp = new ActiveXObject("MSXML2.ServerXMLHTTP.5.0");
xmlhttp.open("GET", url, false);
// 設置 User Agent 為 Firefox 的UA
xmlhttp.setRequestHeader("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 6.0; zh-CN; rv:1.9.0.3) Gecko/2008092417 Firefox/3.0.3 (.NET CLR 3.5.30729)");
xmlhttp.send("");
Response.BinaryWrite(xmlhttp.responseBody);
xmlhttp = null;
%>
刷新瀏覽器,顯示出了Firefox的RSS預覽界面,獲取Google資訊RSS成功!
圖片附件
ok,我們能正確得到Google資訊的RSS了,再通過XMLDOM來操作返回的RSS文檔,就可以采集Google資訊那海量的新聞了。
[喝小酒的網摘]http://blog.const.net.cn/a/2589.htm
相關文章
發生msxml3.dll,錯誤800c0005錯誤的原因和解決方法Function getHTTPPage(url)
dim http
set http=Server.createobject("Microsoft.XMLHTTP")
Http.open "GET",url,false
Http.send()
if Http.readystate<
定時運行ASP文件在一定的時候,要定時的運行某個ASP文件去執行一個任務,如一個工廠在早上9點鐘要采集所有的電表的讀數,當然這要通過IN SQL連接到各個電表中,我們現在就是用一個ASP文件把IN SQL中表的讀數再集中到MS SQL中。
可能你看到的定時運行ASP文件的方法有多種,不過我現在要說的是一種簡單的方法,利用計劃任務就可簡單的實現。
首先,你要
安裝asppdf的幾種方式asppdf其實只有一個文件,也就是asppdf.dll,安裝的時候只需要復制到系統system32目錄下,然后regsvr32就可以了,當然你 也可以去官方網站下載asppdf.exe,安裝程序不會把asppdf.dll復制到system32,但他還是已經regsvr32了,并且有一些示 例代碼,也自動新建了一個虛擬目錄/asppdf。也就是說可以直接http://localhost/asppd
xmlhttp屬性和方法下面是WinHttpRequest component,不過我想也應該適用于xmlhttp,
前文有講到xmlhttp的屬性與方法,但覺得不是很完整,所以就有了下面的補充,下面的這些數據是來自于Microsoft,估計這個是比較全的,但里面提到的一些方法,例如屬性(property-get)Option,在xmlhttp中平時都沒有用過,又比如function SetTimeouts
asp中使用xmlhttp下載圖片代碼asp中使用xmlhttp下載圖片代碼:
<%
function getHTTPimg(url)
dim http
set http=server.createobject("MSXML2.XMLHTTP")
Http.open "GET",url,false
Http