![HTTP协议及高级编程课件_第1页](http://file4.renrendoc.com/view11/M03/15/01/wKhkGWeQ24aADZufAAEFJjb2g9M268.jpg)
![HTTP协议及高级编程课件_第2页](http://file4.renrendoc.com/view11/M03/15/01/wKhkGWeQ24aADZufAAEFJjb2g9M2682.jpg)
![HTTP协议及高级编程课件_第3页](http://file4.renrendoc.com/view11/M03/15/01/wKhkGWeQ24aADZufAAEFJjb2g9M2683.jpg)
![HTTP协议及高级编程课件_第4页](http://file4.renrendoc.com/view11/M03/15/01/wKhkGWeQ24aADZufAAEFJjb2g9M2684.jpg)
![HTTP协议及高级编程课件_第5页](http://file4.renrendoc.com/view11/M03/15/01/wKhkGWeQ24aADZufAAEFJjb2g9M2685.jpg)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
HTTP協議及高級編程簡要介紹HTTP協議。介紹MFC中的CHtmlView類。使用CHtmlView類,創建一個Web流覽器型的應用程式。
9.1HTTP協議
HTTP是超文本傳輸協議(HypertextTransferProtocol)的簡稱,HTTP協議也是基於TCP/IP的客戶/伺服器協議。
1990年,在萬維網應用的開發中,為了解決HTML文檔在網上的傳輸問題,誕生了HTTP協議。至今已有了三個版本,HTTP0.9,HTTP1.0以及HTTP1.1。為了適應下一代的因特網,還出現了HTTPng。事實證明,HTTP比以前的任何一種協議都簡單有效,能將資訊很好地組織起來,讓人們方便地、直接地從Internet上檢索和獲取所需的資訊。
9.1.1HTTP的基本概念
RFC2068是HTTP1.1的最新的詳細描述,本節介紹HTTP的基本概念。
圖9.1HTTP的會話過程
HTTP的會話週期由連接、請求、回應和斷開4個階段組成:
(1)建立TCP/IP連接(TCP/IPconnection)(2)Web客戶向伺服器發送HTTP請求(HTTPrequest)(3)伺服器向客戶回送HTTP回應(HTTPresponse)(4)斷開TCP/IP連接(disconnection)
HTTP協議就是規定了Web客戶和服務器之間的資訊交換規程,以及HTTP請求和HTTP回應消息的內容和格式。
HTTP協議應在Web流覽器和Web伺服器中實現。換句話說,Web流覽器和Web伺服器應按照HTTP協議交換資訊。至於HTTP消息的一般格式等具體細節,讀者可查閱相關資料。
9.1.2HTTP協議的應用
HTTP協議對編程有什麼用?能夠實現什麼樣實用的程式?這些問題使我們不得不回到HTTP的本質。超文本傳輸協議,主要是用於傳輸檔的協議。雖然RFC2068對HTTP協議描述早就超出了檔傳輸的範圍。但是傳輸檔的作用還是最主要的。在這裏我們提出幾個問題,這些問題都可以使用HTTP協議編程實現。比如
:u
基於HTTP的檔中斷點續傳的程式u
使用代理伺服器下載的程式u
Web伺服器程式u
能夠通過身份認證而下載檔的程式u
接受流覽器網頁上載檔的程式這些功能的實現都要求用戶對HTTP比較瞭解。
9.2利用CHtmlView類創建Web流覽器型的應用程式9.2.1CHtmlView類與WebBrowser控件
CHtmlView類在afxhtml.h包含檔中定義,是從CView派生的,如圖9.2所示。在標準的MFC框架應用程式中,無論是基於SDI或MDI的,所有從CView派生的類,都提供了由CView提供的功能。
圖9.2CHtmlView類的繼承關係
CHtmlView類的主要功能是訪問Web網站和HTML文檔。這是由於CHtmlView類在MFC的文檔/視圖結構(MFC'sdocument/viewarchitecture)環境中,進一步提供了WebBrowser控件的功能,可以說CHtmlView類是對WebBrowser控件的封裝。
WebBrowser控件支持通過超鏈接和統一資源定位器URL導航的Web流覽。使得應用程式成了一個Web流覽器(webbrowser)。要創建一個Web流覽器型的應用程式,可以使用CHtmlView類。通過MFC應用程式嚮導實現。
9.2.2CHtmlView類的成員函數1.獲取和設置屬性(Attributes)的成員函數(1)CStringGetType()const;(2)longGetLeft()const;voidSetLeft(longnNewValue);(3)longGetTop()const;voidSetTop(longnNewValue);(4)longGetHeight()const;voidSetHeight(longnNewValue);(5)BOOLGetVisible()const;voidSetVisible(BOOLbNewValue);
其他的函數就不一一列舉了。
2.主要的操作(Operations)成員函數這些成員函數非常有用,常常用在應用程式中。voidGoBack();導航到歷史列表的前一個條目(previousitem)。voidGoForward();導航到歷史列表的下一個條目。voidGoHome();導航到主頁,該主頁在IE的屬性中設置。voidGoSearch();導航到當前搜索頁。該頁在IE的屬性中設置。voidRefresh();重新裝入流覽器當前正在顯示的URL或者檔,即刷新。voidStop();撤銷任何未完成的導航或下載,並且停止任何動態的頁面元素,例如背景音樂和動畫。
Navigate導航到由URL指定的資源。Navigate2導航到由URL指定的資源或者由全路徑指定的檔。PutProperty設置與所給定的對象相關的屬性的當前值。GetProperty返回與所給定的對象相關的屬性的當前值。ExecWB執行一個命令。LoadFromResource 在WebBrowser控件中裝入一個資源。
後面的六個函數的調用格式比較複雜,下麵分別敘述。(1)第一種格式的導航函數調用這個成員函數,導航到由URL指定的資源,或者由一個完全的路徑指定的檔。voidNavigate(LPCTSTRURL,DWORDdwFlags=0,LPCTSTRlpszTargetFrameName=NULL,LPCTSTRlpszHeaders=NULL,LPVOIDlpvPostData=NULL,DWORDdwPostDataLen=0);
(2)第二種格式的導航函數Navigate2
調用這個成員函數,導航到由URL指定的資源,或者由一個完全的路徑指定的檔。函數通過支持特定檔夾的流覽,諸如,Desktop和MyComputer,擴展了Navigate成員函數的功能,它們由參數pIDL指定。函數有三種重載的形式,參數有所不同。voidNavigate2(LPITEMIDLISTpIDL,DWORDdwFlags=0,LPCTSTRlpszTargetFrameName=NULL);
voidNavigate2(LPCTSTRlpszURL,DWORDdwFlags=0,LPCTSTRlpszTargetFrameName=NULL,LPCTSTRlpszHeaders=NULL,LPVOIDlpvPostData=NULL,DWORDdwPostDataLen=0);
voidNavigate2(LPCTSTRlpszURL,DWORDdwFlags,CByteArray&baPostedData,LPCTSTRlpszTargetFrameName=NULL,LPCTSTRlpszHeader=NULL);
(3)設置屬性的成員函數設置一個給定對象相關的屬性。有多種重載的形式,參數不同。voidPutProperty(LPCTSTRlpszProperty,constVARIANT&vtValue);voidPutProperty(LPCTSTRlpszPropertyName,doubledValue);voidPutProperty(LPCTSTRlpszPropertyName,longlValue);voidPutProperty(LPCTSTRlpszPropertyName,LPCTSTRlpszValue);voidPutProperty(LPCTSTRlpszPropertyName,shortnValue);
(4)獲得屬性得到與控件相關的屬性值,有兩種重載的形式。BOOLGetProperty(LPCTSTRlpszProperty,CString&strValue);COleVariantGetProperty(LPCTSTRlpsz);
前者返回非零,表示成功完成,否則返回0,後者返回COleVariant對象。
(5)執行命令ExecWB
調用這個成員函數來在流覽器控件中或IE中執行一個命令。voidExecWB(OLECMDIDcmdID,OLECMDEXECOPTcmdexecopt,VARIANT*pvaIn,VARIANT*pvaOut);
(6)裝入資源調用此成員函數來將指定的資源裝入流覽器控件,有兩種形式。BOOLLoadFromResource(LPCTSTRlpszResource);BOOLLoadFromResource(UINTnRes);
3.事件(Events)處理函數為了利用Windows的消息驅動機制,CHtmlView類定義了許多可重載的事件處理函數,當一定的事件發生時,MFC框架會自動調用相應的事件處理函數。用戶可以重載這些函數,添加自己的代碼,實現應用程式特定的功能。下麵列舉了一些,詳細的資料可查閱MSDN文檔。
OnNavigateComplete2
對於一個窗口或顯示框架,完成到一個超鏈接的導航後,調用此函數
OnBeforeNavigate2
對於一個窗口或顯示框架,在給定的Web流覽器中,一個導航出現之前,調用此函數
virtualvoidOnStatusTextChange(LPCTSTRlpszText);
當與WebBrowser控件相關的狀態欄的文本改變時,調用此函數,參數lpszText包含新的狀態欄文本的字串。virtualvoidOnVisible(BOOLbVisible);
當WebBrowser的窗口應當被顯示或隱藏時,框架調用此函數,bVisible表示了窗口的狀態,:如果為非零,對象可見;為零,對象不可見。virtualvoidOnToolBar(BOOLbToolBar);
當ToolBar屬性已經改變時,調用此函數,bToolBar為非零,IE的工具欄是可見的;否則相反。
virtualvoidOnMenuBar(BOOLbMenuBar);
當MenuBar屬性已改變時,調用此函數。bMenuBar為非零,菜單欄可見;否則相反。
9.2.3創建一個Web流覽器型的應用程式的一般步驟1.利用MFCAppWizard創建SDI或MDI應用程式前幾章創建的都是基於對話框的程式,Web流覽器型的應用程式一般是單文檔或多文檔的程式。利用MFC應用程式嚮導創建SDI或MDI應用程式需要經過6步,你可以回到前一步或進到後一步來改變你已經選擇過的選項。在每一步,對每一個選項都可以得到幫助,右擊控件,可以得到關於每個選項控件的資訊。
在VC++集成開發環境中點菜單File/New...,出現新工程對話框,如圖9.3。
圖9.3創建新工程的對話框
選擇MFCAppWizard[.exe]類型的工程,輸入工程的名字,決定工程檔存放的位置,然後點擊OK按鈕,出現第一步對話框。如圖9.4。
(1)第一步:選擇應用程式結構
圖9.4第一步:選擇應用程式結構
①為你的應用程式選擇三種結構之一,單文檔(SingleDocumentSDI),多文檔(MultipleDocumentMDI),基於對話框(DialogBased)。Web流覽器型的應用程式一般選擇SDI類型,以下的操作都假定選擇了SDI類型。②決定你的應用程式是否要支持MFC的文檔/視圖結構(document/viewarchitecture),實際你必須選擇支持,因為不支持文檔/視圖結構的應用程式不能打開磁片檔和從CWnd類繼承的窗口區,並且後面的步驟都是無效的。③選擇資源中的文本所使用的語言,應選擇“中文[中國]”。作完這三件事以後,點擊Next按鈕,出現第二步對話框。如圖9.5。(2)第二步:選擇應用程式支持的資料庫
圖9.5第二步:選擇應用程式支持的資料庫
①為你的程式選擇一種資料庫支持,有四個選項。沒有(None),頭檔支持(Headerfilesupport),帶有檔支持的資料庫視圖(DatabaseViewwithfilesupport)或沒有檔支持的資料庫視圖(DatabaseViewwithoutfilesupport)。②如果你選擇了資料庫支持,點擊數據源(DataSource),在外部ODBC資料庫、DAO資料庫和OLEDB資料庫中選擇一個,然後選擇相應的數據源和數據庫表選項。
③點擊Next按鈕,出現第三步對話框,如圖9.6。
(3)第三步:選擇應用程式支持的複合文檔
圖9.6選擇應用程式支持的複合文檔
①選擇你的應用程式支持的複合文檔(compounddocument)類型。有五個選項:None:不支持複合文檔Container:容器,一個OLE2.0風格的文檔容器。Mini-server:最小伺服器,一個OLE伺服器,但不能作為一個獨立的程式來運行。Full-server:完全伺服器,一個OLE伺服器,可以作為獨立程式運行。Bothcontainerandserver:容器和服務器兩者。
②也可以選擇選項來啟用標準的ActiveX資源,增加額外的自動命令到應用程式的菜單條中。
③點擊Next按鈕,出現第四步對話框,如圖9.7。
(4)第四步:選擇應用程式的介面特性
圖9.7第四步:選擇應用程式的介面特性
①為你的程式選擇基本的用戶介面特性。如快捷的工具條、初始狀態欄、列印和列印預覽、內容敏感的幫助、3D控件、Windows套接字等,都是複選框。②要使用的工具條形式,IE4.0ReBars或者MFC常規的工具條。③最近打開的檔列表數目,默認值是4。
④如果你想要修改你的程式的名字和擴展名,或者為你的程式調整用戶介面窗口框架風格,點擊Advanced。如圖9.8。
圖9.8設置工程的高級屬性
⑤點擊Next,出現第五步對話框。如圖9.9所示。
(5)第5步:決定三個問題圖9.9第5步:決定三個問題
①選擇工程風格:WindowsExplorer:左邊是一個樹形視圖,右邊是一個列表視圖。MFCStandard:為檔視圖提供一個區域。②選擇是否希望應用程式嚮導在原始檔案中產生注釋,以便指導你編寫程式。③選擇使用MFC庫的選項AsasharedDLL:庫作為共用的DLLAsastaticallylinkedlibrary:庫作為靜態鏈節的DLL注意,靜態鏈接到MFC的庫僅僅在VC++的專業版和企業版中支持(ProfessionalandEnterpriseEditions)。
④點擊Next,出現MFCAppWizard–Step6of6對話框。如圖9.10。
(6)第6步:決定類名和基類
圖9.10第6步:決定類名和基類
①如果你想要改變默認的由應用程式嚮導提供的類名,基類,頭檔,或者實現檔的名字,輸入新的名字,要改變基類,選擇你的程式的視圖類。②點擊Finish按鈕,出現NewProjectInformation對話框。如圖9.11。說明了應用程式的類型,創建的類、應用程式的特性和工程的目錄。
③點擊OK按鈕,工程創建成功,進入VC++集成的開發環境。
圖9.11新工程的資訊
2.創建一個Web流覽器型的應用程式你可以使用MFCAppWizard創建一個Web流覽器型的應用程式。遵照使用MFC應用程式嚮導創建SDI或MDI的.exe程式的六個步驟。應用程式必須是基於MFC的文檔/視圖結構的,要注意的是,在第六步,使用Baseclass下拉列表框,必須選擇CHtmlView類作為視圖類的基類。其他步驟根據應用程式的需要來決定,大部分使用默認值就可以了。CHtmlView類扮演一個Web流覽器控件的封裝器,給你的應用程式一個視圖來顯示Web或HTML頁面。嚮導在該視圖類中對OnInitialUpdate函數創建了一個重載。
providinganavigationallinktotheMicrosoftVisualC++Website:voidCWebView::OnInitialUpdate(){CHtmlView::OnInitialUpdate();
//TODO:Thiscodenavigatestoapopularspotontheweb.//changethecodetogowhereyou'dlike.Navigate2(_T("http://www.microsoft.com/visualc/"),NULL,NULL);}你可以用一個你自己的站點代替Navigate2函數中的站點,或者你也可以使用LoadFromResource函數,來打開一個HTML頁面,它在你的工程的資源腳本內,作為默認的要觀察的內容,例如:voidCWebView::OnInitialUpdate(){CHtmlView::OnInitialUpdate();//TODO:Thiscodenavigatestoapopularspotontheweb.//changethecodetogowhereyou'dlike.LoadFromResource(IDR_HTML1);}
需要說明,當你使用MFC應用程式嚮導創建程式時,如果在第一步為應用程式選擇的結構是基於對話框的,則後面的步驟與前面介紹的6個步驟不太一樣,只需要4步就夠了。(1)為基於對話框的程式完成第1步①為你的應用程式選擇三種結構之一,這裏選擇基於對話框(DialogBased)。②決定你的應用程式是否要支持MFC的文檔/視圖結構(document/viewarchitecture),你必須選擇支持。③為文本選擇一種語言,然後點擊Next(2)為基於對話框的程式完成第2步①為你的程式選擇基本的用戶介面特性和套接字支持。
②點擊Next。
(3)為基於對話框的程式完成第3步①如果你需要原始檔案中的注釋,它告訴你需要在哪里添加你自己的代碼。②選擇你想要如何使用MFC庫,作為共用的DLL。還是靜態鏈接的DLL。(4)為基於對話框的程式完成第4步①如果你想要改變應用程式嚮導為你提供的默認的類名,頭檔案名或實現檔案名,輸入新的名字。
②點擊Finish。
9.3Web流覽器應用程式實例9.3.1程式實現的目標使用CHtmlView類來實現一個應用程式,使之具有Web流覽器的功能,包括流覽網頁、前進、後退、返回主頁和搜索功能。通過實例,重點掌握利用CHtmlView類開發Web客戶端程式的方法。實現的程式介面如圖9.12。
圖9.12myWeb應用程式的介面
9.3.2創建實例程式1.利用MFCAppWizard生成應用程式框架工程名為myWeb,第一步,工程類型為單文檔(SDI),中文語言支持。第二步和第三步使用默認值,不需要資料庫,也不提供對於複合對象的支持。第四步選擇InternetExplorerReBars工具欄的風格,這樣就有了用來輸入網址的文本框。第五步不作任何修改,第六步應選擇CHtmlView類作為視圖類的基類。生成的工程框架包含四個類:
應用程式類,CMyWebApp,對應myWeb.h和myWeb.cpp檔。框架類,CMainFrame,對應MainFrm.h和MainFrm.cpp檔。文檔類,CMyWebDoc,對應myWebDoc.h和myWebDoc.cpp檔。
HtmlView類,CMyWebView,對應myWebView.h和myWebView.cpp檔。此時編譯運行,程式已經具有了基本的Web流覽功能,能自動連到微軟的網站。2.修改菜單修改菜單,添加用戶需要的功能條目。在工作區中選擇ResourceView卡,選擇Menu,雙擊菜單控件的名字(IDR_MAINFRAME),右邊出現程式的菜單。點擊菜單中的“查看”項,已經有了“工具欄”和“狀態欄”兩個條目,雙擊下麵的空框,彈出設置菜單條目屬性對話框,如圖9.13所示,按照表9.1添加六個菜單條目。
圖9.13設置菜單條目屬性的對話框表9.1要添加的菜單條目菜單條目名稱(Caption)ID號前進ID_FOWARD後退ID_BACK停止ID_STOP刷新ID_UPDATE主頁ID_HOMEPAGE搜索ID_SEARCH3.修改工具欄在工具欄上增加新的按鈕,以便快速執行所需的功能。在工作區中選擇ResourceView卡,選擇ToolBar,雙擊工具條控件的名字(IDR_MAINFRAME),右邊出現程式的工具條。雙擊其中的按鈕,可以看到它們的屬性。其中有一個空的按鈕,雙擊它可以添加新的按鈕的屬性,如圖9.14,利用右邊的圖形繪製工具,可以自己設計新按鈕的圖樣。
按照表9.1添加六個按鈕,它們的ID號與相應的菜單條目相同。拖動按鈕,可以改變按鈕之間的相對位置。
4.為控件添加事件處理函數當用戶點擊菜單條目,或者點擊相應的快捷按鈕時,應能引起程式的反映,這就需要給這些控件添加事件處理函數。進入類嚮導,選擇“MessageMaps”卡。在“ClassName”下拉框中選擇CMyWebView類,然後按照表9.2,為前述的六個控件添加事件處理函數。
表9.2六個控件對應的事件處理函數
對象IDMessagesMemberFunctionID_FOWARDCOMMANDOnFoward()ID_BACKCOMMANDOnBack()ID_STOPCOMMANDOnStop()ID_UPDATECOMMANDOnUpdate()ID_HOMEPAGECOMMANDOnHomepage()ID_SEARCHCOMMANDOnSearch()5.添加事件處理函數的代碼在myWebView.cpp實現檔中,添加上述六個事件處理函數的代碼。//前進到下一個網頁voidCMyWebView::OnFoward(){GoForward();}//退到前一個網頁voidCMyWebView::OnBack(){GoBack();}//停止網頁的下載voidCMyWebView::OnStop(){Stop();}
//刷新當前的網頁voidCMyWebView::OnUpdate(){Refresh();}//回到主頁voidCMyWebView::OnHomepage(){GoHome();}//進行搜索voidCMyWebView::OnSearch(){GoSearch();}此時可以再編譯運行,應當沒有問題。
6.為應用程式添加URL定位功能至此,應用程式還無法流覽用戶想要的網頁,還沒有URL定位功能。通過以下步驟來添加這個功能。(1)添加網址輸入欄控件在建立應用程式框架時,曾選擇了InternetExplorerReBars的工具條風格,這就自動在程式的資源中添加了一個對話框條,可以將它變為一個網址的輸入欄。在工作區中選擇ResourceView卡,選擇Dialog,雙擊對話框控件的名字(IDR_MAINFRAME),右邊出現這個對話框條。在上面添加一個“地址:”的靜態文本,再添加一個文本編輯框控件,ID號是IDC_ADDR,作為地址欄,提供給用戶輸入要流覽的網站地址。
(2)添加控制代碼設想當用戶在地址欄中輸入網址後,打回車鍵時,流覽器應用程式就下載並顯示指定的新網頁,為了實現這個功能,考慮到用戶在文本編輯框中按下回車鍵後,會有一個IDOK的消息發送到主框架類,可以添加處理這個消息的控制函數,在該函數中,用指定的網址調用Navigate()或者Navigate2()函數,就可以實現對該網頁的流覽。①在MainFrm.h檔中,添加消息處理函數的聲明:public:voidOnNew();②在MainFrm.cpp檔中,添加該函數的實現代嗎:voidCMainFrame::OnNew(){CStringpp;//獲得用戶在地址欄中輸入的URLm_wndDlgBar.GetDlgItem(IDC_ADDR)->GetWindowText(pp);//流覽指定的網頁((CMyWebView*)GetActiveView())->Navigate(pp);}其中m_wndDlgBar是代表地址欄文本框所在的對話框條控件的成員變數,是在生成應用程式框架的時候自動創建的,利用它的GetDlgItem方法取得地址欄控件的ID,再利用地址欄控件的GetWindowText方法獲得用戶輸入的網址。另外,由GetActiveView()函數返回的是一個CView類的指針,必須將它強制轉換成本應用程式視圖類的指針,才能調用Navigate()
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025届高考英语读后续写说课稿 追车人
- 2025SRV汽化烟道热喷涂合金防护层施工合同
- 2025民间融资合同范本
- 14《母鸡》(说课稿)-2023-2024学年语文四年级下册统编版
- 2025年驾校培训合同范本
- 2025商品购销合同(超市类)
- 2024年五年级数学下册 一 图形的运动(二)1.2画对称图形说课稿 冀教版
- 2024-2025学年高中历史 第一单元 第一次世界大战 第2课 惨烈的四年战事教学说课稿 岳麓版选修3
- 陶土板幕墙施工方案
- 游乐场植物墙施工方案
- 法医病理学课件
- 职代会提案征集表
- 介绍uppc技术特点
- 物业工程工作分配及人员调配方案
- 《谏逐客书》理解性默写(带答案)最详细
- 《黑骏马》读书笔记思维导图
- 2023年物理会考真题贵州省普通高中学业水平考试试卷
- 盘扣式悬挑脚手架专项施工方案
- 劳动防护用品知识考试试题(含答案)
- 高中教师业务知识考试 数学试题及答案
- GB/T 9290-2008表面活性剂工业乙氧基化脂肪胺分析方法
评论
0/150
提交评论