• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
    • 軟件測試技術
    • 軟件測試博客
    • 軟件測試視頻
    • 開源軟件測試技術
    • 軟件測試論壇
    • 軟件測試沙龍
    • 軟件測試資料下載
    • 軟件測試雜志
    • 軟件測試人才招聘
      暫時沒有公告

    字號: | 推薦給好友 上一篇 | 下一篇

    用VB編寫留言板

    發布: 2007-7-14 20:28 | 作者: 佚名    | 來源: 網絡轉載     | 查看: 39次 | 進入軟件測試論壇討論

    領測軟件測試網 黑龍江省牡丹江市兒童醫院內科 張建華

    隨著網絡的普及,越來越多的網站增設了各種實時交互功能,如網上調查、時事論壇、聊天室、留言板等。下面介紹一個使用VB編寫CGI腳本程序的實例,使你輕松擁有自己的留言板。
    一、 基本概念
    1.什么是CGI
    CGI是Common Gate Interface(通用網關接口)的縮寫,它運行在Web服務器上,提供同客戶端瀏覽器界面的接口。通過CGI可以使Web服務器執行一些外部程序,并將外部程序所產生的結果返回給Web瀏覽器。
    CGI程序由兩部分組成,一部分是超文本頁面(html),就是客戶端在瀏覽器中看到的交互式的表單(如調查表和留言板的界面);另一部分是運行在服務器上的程序(通過點擊頁面上的“提交”按鈕激活)。其基本的交互過程如下:   
    1) Web瀏覽器在接到客戶端對CGI程序的請求后,首先把要傳送的數據(客戶輸入)進行編碼,然后提交給服務器;
    2) 服務器調用CGI程序,對輸入數據進行相關的解碼處理,并把處理后的結果寫入指定的輸出文件;
    3) 服務器讀取輸出文件并把最終數據發送到客戶端,使用戶可以在瀏覽器中看到程序執行的結果。
    2.數據的提交方式
    如果從客戶端向服務器傳送的數據量不是很多,即小于1024字節,則可以使用“GET”傳輸方式,命令的使用方法為:在客戶端瀏覽器的交互式表單的源碼中加入如下一行代碼
    <Form method ="GET" action ="/cgi-bin/guest.exe">
    當使用這種方法時,CGI程序從環境變量QUERY_STRING中獲取數據(即URL的問號“?”之后的那一部分數據)。
    如果要通過CGI程序傳送的數據超過了1024字節(URL的最大長度限制),例如論壇中的“帖子”,則要使用“POST”的傳輸方法。
    3.瀏覽器的編碼方式
    Web瀏覽器對客戶端的輸入信息有統一的編碼格式:
    1) 用“=”連接提交表單中各元素的Name和Value屬性,即以“名稱=值”的形式進行編碼;
    2) 用“&”連接表單中不同的輸入項目,例如:“Name=王哲&Email=wangzhes@netease.com”;
    3) 若Value屬性中存放的數據含有空格,則空格被轉換成“+”,如“王  哲”被轉換為“王+哲”;
    4) 對URL和Web系統的保留字符編碼成十六進制數形式,即%HH。
    CGI程序在使用這些數據前必須對它們進行解碼,即將數據還原成用戶在Web頁面上輸入時的形式。由于Web系統將漢字當作特殊字符對待,一個漢字被瀏覽器編碼成四位十六進制數(例如%D5%C5),因此在CGI程序中還要對漢字進行一些特殊的解碼處理。
    二、編制CGI程序
    了解了上述CGI的一些基本特征后,我們就可以著手編制自己的留言板腳本程序了。
    1. 頁面設置
        首先要新建兩個超文本(html)文檔,可分別命名為guestbook.htm和databook.htm,其中的guestbook.htm為客戶在瀏覽器中看到的交互式表單頁面,其源代碼如下:
    <html><head><title>留言板</title></head>
    <body><center><h2>請留下您的建議</h2>
    <Form method ="GET" action ="/cgi-bin/guest.exe">
    您的名字:<input type =text name =name size=33><br>
    您的Email:<input type =text name =email size=32><br>
    您的主頁地址: <input type =text name =URL size=28 value ="http:// " ><br>
    您所在的城市: <input type =text name =city size=27><br><br>
    留言內容: <br><textarea name =content COLS=60 ROWS=4></textarea><p>
    <input type =submit value="提交">  <input type =reset value="重寫">
    </form></center> </body></html>
    在databook.htm文檔中存儲的是各位來賓的留言,特殊之處是在文件中要使用一個定位字符串“<! ----- >”將文件的開始部分和具體的客戶留言部分分開。CGI程序將在“<! ----- >”所在的位置之后插入客戶的留言。databook.htm的源文件為:
    <html><head><title>看留言</title></head>
    <body text="#00000" vlink="#990099" link="#333399">
    <center><h1>查看留言</h1></font></center>
    <!----->
    <留言插入位置>
    </body></html>
    這樣,最新的留言出現在頁面的最上端;如果要把最新的留言放在頁面的下端,則只需將其中的定位字符串“<! ----- >”移到客戶留言部分和HTML文件結尾部分之間的位置就行了。
    需注意的是:<!----->字符串一定要單獨占一行。
    2. CGI程序
    用VB編寫的CGI程序的完整代碼附后。
    三.程序調試
    程序編寫完成后,要進行調試排錯處理。CGI腳本不同于其他VB程序之處在于,CGI程序不能在個人計算機上進行測試,而要放到服務器上的特定目錄下才能執行(一般放在Cgi-Bin目錄下)。要實現這一點,對網絡管理員來說不成什么問題(因為其具有對服務器的讀寫操作權限),但對于大多數個人計算機愛好者來說卻是一個很大的難題。
    因此,要對CGI腳本進行測試,首先要在個人PC機上設置一個Web服務器的調試環境,即先在個人PC上運行Web Server軟件來模擬服務器。
    由于Windows操作平臺的局限性,可在Windows下運行的Server軟件并不是很多,比較簡單且易于實現的一個方法是使用Windows98光盤中自帶的Server工具——Personal Web Server(個人網絡服務器)。
    1.設置個人Web服務器
    在Windws98光盤中的“\add-one\pws”目錄中,點擊“Setup.exe”進行安裝。整個安裝過程比較簡單,按屏幕提示操作即可。
    安裝完成后,在其主畫面左側點擊“高級”圖標,在虛擬目錄列表框內選擇“home”目錄,點擊“添加”按鈕,選擇“瀏覽”,選中c:\Inetpub\wwwroot\cgi-bin(其中的盤符視執行安裝時的路徑而定),在“新虛擬目錄”欄內輸入“cgi-bin”,然后在訪問權限的設置中把“讀取”、“執行”、“腳本”各項全選上,點擊“確定”按鈕。即成功地設置了個人Web服務器。
    2. 測試操作
    首先,把我們在前面所新建的兩個超文本文檔guestbook.htm和databook.htm拷貝到c:\Inetpub\webpub子目錄內,把編譯完的CGI程序guest.exe拷入c:\Inetpub\wwwroot\cgi-bin子目錄內;然后,打開瀏覽器,在地址欄內輸入http://127.0.0.1/guestbook.htm,回車;就可以對CGI腳本程序進行測試操作了。
    如果在回車后出現請求“撥號連接”的畫面,則先點擊“取消”按鈕,然后在瀏覽器的“查看->Internet選項->連接”標簽中(以IE為例),選擇“通過局域網連接到Internet”一項,再點擊“確定”即可。
    經測試確認無誤后,便可以與自己放置主頁站點的網絡管理員聯系,把編制好的留言板腳本程序上傳到服務器上了。
    需注意一點,如果網絡管理員把你的文檔放在與前述目錄不同的目錄中,則要在腳本中做出相應的修改,并重新編譯生成EXE執行文件。
    附:guest .bas
    ' 聲明部分
    Declare Function GetStdHandle Lib "kernel32" (ByVal nStdHandle As Long) As Long
    Declare Function WriteFile Lib "kernel32" (ByVal hFile As Long, ByVal lpBuffer _
           As String, ByVal nNumberOfBytesToWrite As Long, lpNumberOfBytesWritten _
           As Long, lpOverlapped As Any) As Long
    Option Explicit
    Public StrData(5)           As String  ' 用于存儲表單內各項目的用戶輸入數據
    Public CGI_QueryString     As String  ' 定義環境變量
    Public Const STD_INPUT_HANDLE = -10&
    Public Const STD_OUTPUT_HANDLE = -11&
    Public hStdIn             As Long   ' 標準輸入文件句柄
    Public hStdOut            As Long   ' 標準輸出文件句柄
    Public Ent                As String
    ' 主函數
    Sub Main()
       Dim UrlString As String, Databook As String
       Dim TempFileName As String, TempString As String
       Dim Number As Single, I As Integer
         Ent = vbCrLf
         hStdIn = GetStdHandle(STD_INPUT_HANDLE)
         hStdOut = GetStdHandle(STD_OUTPUT_HANDLE)
         CGI_QueryString = Environ("QUERY_STRING")   ' 讀取返回字符
         TempString = TempString + CGI_QueryString + vbCrLf
         UrlString = UrlDecode(TempString)
         TempString = FenGe(UrlString)
          ' 獲得一個隨機數作為臨時文件名
        Randomize  
        Number = Int(10000 * Rnd + 100)  ' 隨機得到100到10000之間的整數
        TempFileName = "YourWebSitePath1 \" & Number  ' 注①
          ' 取得留言簿文件名
        Databook = "YourWebSitePath2 \databook.htm"     ' 注②
        Open TempFileName for Output As #1
        Open Databook For Input As #2
          ' 將留言簿中字符串"<!----->"前面的內容寫入臨時文件
         Do
           Line Input #2, TempString
           Print #1, TempString
         Loop While TempString <> "<!----->"
        ' 檢查客戶端用戶的輸入項
        If StrData(1) < "     " Then
            Send "Content-type:text/html" & Ent
            Send "不要著急,您忘記填寫名字了! "
            Exit Sub
          End If
        If StrData(5) < "     " Then
            Send "Content-type:text/html" & Ent
            Send "對不起,您還沒有填寫留言的內容。"
            Exit Sub
          End If
        ' 向臨時文件中寫入客戶端用戶的留言
        Print #1, "<ul>" & vbCrLf
        Print #1, "<li>時間:" & Date & " " & Time
        Print #1, "<li>姓名:" & StrData(1)
        ' 如果不填寫以下各項則不顯示該項的名稱
        If StrData(2) > "   " Then Print #1, "<li>E-mail:<small><a href=mailto:" _
              & StrData(2) & ">" & StrData(2) & "</a></small>"
        If StrData(3) > "http://   " Then Print #1, "<li>主頁:<a href=" & _
              StrData(3) & " TARGET=_blank >" & StrData(3) & "</a>"
        If StrData(4) > "   " Then Print #1, "<li>來自:" & StrData(4)
        ' 以下循環查找留言內容中的回車符,將其替換為瀏覽器能夠
        ' 識別的換行符
       Do
           I = InStr(StrData(5), Chr(13))
             If I = 0 Then Exit Do  
           UrlString = Mid(StrData(5), 1, I - 1)
           StrData(5) = UrlString + "<br>" + Mid(StrData(5), I + 1)
       Loop
           Print #1, "<li>內容:" & StrData(5) & vbCrLf; "</ul><hr>"
         ' 將留言簿中以前的留言內容寫入臨時文件
        Do
          Line Input #2, TempString
          Print #1, TempString
        Loop While Not EOF(2)
         ' 關閉打開的文件并將臨時文件更名
        Close #1
        Close #2
        Kill Databook
        Name TempFileName As Databook
         ' 在客戶端顯示處理結果
        Send "Content-type:text/html" & Ent
        Send "<HTML><body><center><br>您的建議已成功提交<br>"
        Send "<br><a href=\webpub\databook.htm>"    ' 注③
        Send "點這里查看結果</a></center></body></html>"
    End Sub
      ' 該子程序用于處理向客戶端返回的數據
    Sub Send(s As String)
    Dim lBytesWritten As Long
      s = s & Ent
      WriteFile hStdOut, s, LenB(StrConv(s, vbFromUnicode)), lBytesWritten, ByVal 0&
    End Sub
      ' 本函數用于對用戶輸入的數據進行解碼
    Public Function UrlDecode(ByVal sEncoded As String) As String
    Dim pointer As Long, pos As Long
    Dim temp As String
        If sEncoded = "" Then Exit Function
        pointer = 1
          Do      ' 該循環對系統保留字和漢字進行處理
            pos = InStr(pointer, sEncoded, "%")
               If pos = 0 Then Exit Do
            temp = Chr("&H" & (Mid(sEncoded, pos + 1, 2)))
               If Mid(sEncoded, pos + 3, 1) = "%" And (temp <> ":") _
                  And (temp <> "\") And (temp <> "/") Then
               Mid(sEncoded, pos, 2) = Chr("&H" & (Mid(sEncoded, pos + 1, 2)) _
                  & (Mid(sEncoded, pos + 4, 2)))
                  sEncoded = Left(sEncoded, pos) & Mid(sEncoded, pos + 6)
                  pointer = pos + 1
                   Else
               Mid(sEncoded, pos, 1) = temp
                  sEncoded = Left(sEncoded, pos) & Mid(sEncoded, pos + 3)
                  pointer = pos + 1
               End If
          Loop
        UrlDecode = sEncoded
    End Function
    ' 本函數用于對輸入的“Name = Value”數據對進行分解
    Public Function FenGe(Cstring As String) As String
    Dim I As Integer, j As Integer, add As Integer
    j = 1
       Do While InStr(Cstring, "&") <> 0
            I = InStr(Cstring, "&")
            StrData(j) = Mid(Mid(Cstring, 1, I - 1), InStr(Mid(Cstring, 1, I - 1), "=") + 1)
              j = j + 1
            Cstring = Mid(Cstring, I + 1)
       Loop
          StrData(j) = Mid(Cstring, InStr(Cstring, "=") + 1)
    For I = 1 To j    ' 該循環用于把字符串內的“+”還原為空格
        Do
          add = InStr(StrData(I), "+")
            If add = 0 Then Exit Do
          Mid(StrData(I), add, 1) = " "
        Loop
    Next I
    End Function
    注①:“TempFileName = "YourWebSitePath1\" & Number”中的YourWebSitePath1是由網絡管理員指定的Web服務器上的絕對路徑,用于存放臨時文件。若是在自己計算機上進行測試,可以先設定為“c:\windows\temp\”。
    注②:本句中的YourWebSitePath2亦是由網絡管理員分配的服務器路徑,用于存放超文本文檔。自己測試時,可以先設定為“c:\inetpub\webpub\”。
    注③:在上傳時,“webpub”目錄要隨注②中YourWebSitePath2的改變而改變,不要遺忘,否則要出錯。

    延伸閱讀

    文章來源于領測軟件測試網 http://www.kjueaiud.com/


    關于領測軟件測試網 | 領測軟件測試網合作伙伴 | 廣告服務 | 投稿指南 | 聯系我們 | 網站地圖 | 友情鏈接
    版權所有(C) 2003-2010 TestAge(領測軟件測試網)|領測國際科技(北京)有限公司|軟件測試工程師培訓網 All Rights Reserved
    北京市海淀區中關村南大街9號北京理工科技大廈1402室 京ICP備2023014753號-2
    技術支持和業務聯系:info@testage.com.cn 電話:010-51297073

    軟件測試 | 領測國際ISTQBISTQB官網TMMiTMMi認證國際軟件測試工程師認證領測軟件測試網

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>