ArcGis Server開發(fā)Web GIS新手體驗(二)
ArcGis Server開發(fā)Web GIS新手體驗(二)
接(一)
我們知道,.net adf提供的map組件、toc組件等都是標(biāo)準(zhǔn)的asp.net組件。這些組件在運行時,會生成相應(yīng)的html代碼,將自己展現(xiàn)出來。一般還會通過ViewState來保存狀態(tài),并生成_doPostBack(javascript)函數(shù),在必要的時候,通過javascript來調(diào)用該函數(shù),將客戶端數(shù)據(jù)返回來服務(wù)器端,從而激發(fā)服務(wù)器的響應(yīng)。總之,我們通過分析生成的html頁面,應(yīng)該可以大致窺見asp.net組件是怎么運行的。
好,我們現(xiàn)在按F5運行首頁,然后在瀏覽器中查看網(wǎng)頁的源代碼,趕快看下一吧:
1、首先會看到ID,MapIdClick,start等javascript函數(shù),這些函數(shù)是模板為我們生成的,在default.aspx文件中定義的。ID函數(shù)中有兩行:
var iddiv = document.getElementById("MapDiv_Map1");
if (iddiv!=null) iddiv.onmousedown = MapIdClick;
可以看到,這幾個函數(shù)的作用是對地圖的Identify(點擊查詢)作出處理。
為什么要放在這里呢,為什么單單只有點擊查詢的javascript要在這里定義呢,其它如放大、縮小、平移為什么不在這里處理?這是因為Toolbar組件對放大、縮小、平移等提供了默認(rèn)的處理方式,而identify沒有,這樣可以更方便進(jìn)行擴(kuò)展。在后面的代碼中有一行<esri:Tool ToolTip="Identify" DefaultImage="Images/identify.gif" ClientToolAction="ID()" Name="Identify"...>,可以看到,這個調(diào)用是模板為我們生成的(并且這個調(diào)用是可以修改的)。待會我們在進(jìn)一步分析中可以看到這一點。
2、再向下,是幾個隱藏域,其中包含__VIEWSTATE隱藏域,還有__doPostBack函數(shù),這些是asp.net組件生成的,作用是向服務(wù)器提交數(shù)據(jù),從而與服務(wù)器進(jìn)行交互。
3、往下我們看到了一些引入js腳本文件的代碼:
<script language="Javascript" src="/aspnet_client/esri_arcgis_server_webcontrols/9_1/JavaScript/common.js"></script>
<script language="Javascript" src="/aspnet_client/esri_arcgis_server_webcontrols/9_1/JavaScript/map_functions.js"></script>
<script language="Javascript" src="/aspnet_client/esri_arcgis_server_webcontrols/9_1/JavaScript/overview_functions.js"></script>
<script language="Javascript" src="/aspnet_client/esri_arcgis_server_webcontrols/9_1/JavaScript/toolbar_functions.js"></script>
可以看到,共引入了四個js腳本文件,這些文件的地址也比較奇怪,不是與當(dāng)前網(wǎng)站在同一個虛擬目錄下,而是在http://localhost//aspnet_client/esri_arcgis_server_webcontrols/9_1/JavaScript目錄下。在c:/inetpub/webroot/aspnet_client/esri_arcgis_server_webcontrols/9_1/JavaScript/文件夾下可以找到這些文件。原來,為了重用的方便,在安裝Arcgis Server時,安裝程序就已經(jīng)建立了一個虛擬目錄,用于提供這些共享的資源。在這個文件夾上一級目錄中,還可以看到images和treeimages兩個子目錄,以及treeview.htc文件。
知道了這些javascript文件的藏身之所,各位可以把這些javascript文件逐個看一遍,可以發(fā)現(xiàn)其作用主要是與瀏覽器進(jìn)行交互。
4、再往下,是TOC組件的Html代碼,代碼片斷如下:
<tvns:treenode Expanded="False" DefaultStyle="color:silver;" ImageUrl="/aspnet_client/esri_arcgis_server_webcontrols/9_1/images/outscale.gif" CheckBox="False">
道路注記<tvns:treenode Expanded="True" ImageUrl="ESRI.Web.Controls.MIMEImage.aspx?ImgID=Default.aspx_Toc1_0_1_0_0&NoCache=true"></tvns:treenode>
這一段代碼有一個特別之處就是ImageUrl="ESRI.Web.Controls.MIMEImage.aspx...",這個ESRI.Web.Controls.MIMEImage.aspx是什么東東,是一個網(wǎng)頁嗎?在機(jī)器里找一下,發(fā)現(xiàn)根本就不存在這個網(wǎng)頁,那它又是何方神圣,竟然可以作為一個圖片的地址?我們先往下看看。
5、<div id='OverviewMap1backdrop' style = 'position: absolute; left: 16px; top: 400px; width:204px; height:124px;
Z-INDEX:104; border-color:LightSteelBlue; border-width:3px; border-style:Solid; overflow:hidden;'>
<table cellspacing=0 cellpadding=0 style = 'width:198px; height:118px; overflow:hidden;'><tr><td id=OVCell_OverviewMap1></td></tr></table>
</div>
是鷹眼導(dǎo)航圖的代碼。怎么只有一個空的Div層和一個空的表格呢?唉,比較簡單,我懶得分析了,同志們自己去找吧~
6、再往下是Toolbar組件的代碼,沒什么特別的:
<td nowrap width="29" height ="32" align='Center'
id="Toolbar1ZoomIn"
onMouseDown="ToolbarMouseDown( 'Toolbar1', 'ZoomIn', 'Tool', event);"
onMouseOver="ToolbarMouseOver('Toolbar1', 'ZoomIn');"
onMouseOut="ToolbarMouseOut( 'Toolbar1', 'ZoomIn');"
style="background-color:LightSteelBlue;font-family:Arial;font-size:Smaller;font-weight:bold;"
><img id="Toolbar1ZoomInImage" alt="Zoom In" src="Images/zoominD.gif" align="absMiddle"></td>
7、再下面是生成地圖組件的代碼:
<script language="JavaScript" id="cs_dynamic_Map1">
Maps[mapCounter] = new MapCreation('Map1',0,mapCounter,0,0,502,378,'MapDiv_Map1','Black',2);
mapURL[mapCounter] = "ESRI.Web.Controls.MIMEImage.aspx?ImgID=Default.aspx-Map1&ct=5";
MakeMapDiv(mapCounter, 'Map1','ESRI.Web.Controls.MIMEImage.aspx?ImgID=Default.aspx-Map1&ct=5', 'MapCell_Map1','');
mapCounter++;
MapDragRectangle('Map1','ZoomIn', true);
</script>
又看到了MIMEImage這個東東!它究竟是什么東東呢?
如果對asp.net不是很熟悉的話,要破解這個秘密可能確實比較困難。
在asp.net中,所有的請求,都是通過httpHandler來進(jìn)行處理的。那httphandler又是什么東東呢?其實只要實現(xiàn)在IHttpHandler接口的類,都可以作為一個HttpHandler。在web.config或machine.config文件中,可以定義哪些請求可以由哪個httphandler來處理。查看一下web.config文件,沒有這些聲明。那就看一下mapchine.config文件吧,這個文件在WINDOWS\Microsoft.NET\Framework\v1.1.4322目錄下,用記事本打開它,查找ESRI.Web.Controls.MIMEImage.aspx,好家伙,果然在這里啊!
<httpHandlers>
<add verb="*" path="ESRI.Web.Controls.MIMEImage.aspx" type="ESRI.ArcGIS.Server.WebControls.ImageHandler, ESRI.ArcGIS.Server.WebControls, Version=9.1.0.722, Culture=neutral, PublicKeyToken=8fc3cc631e44ad86"/>
原來ESRI.Web.Controls.MIMEImage.aspx請求是能過ESRI.ArcGIS.Server.WebControls.ImageHandler來處理的。在Visual Studio中,使用對像瀏覽器查看一下esri.arcgis.server.webcontrols.dll文件,可以看到ImageHandler類,果然實現(xiàn)了IHttpHandler接口。呵呵,其實很簡單嘛,我們也完全可以自己寫一個類,來執(zhí)行自定義的請求。
又寫累了,就到這里吧。
待續(xù)
浙公網(wǎng)安備 33010602011771號