ASP versus COM aneb konverzia ASP do COM

16. dubna 2003

Niektorí programátori možno poznajú či dokonca využívajú možnosť tvoriť web stránky vo Visual Basicu. Ak sa na to pozrieme z iného uhla pohľadu, využívajú to všetci programátori ASP stránok, keďže samotný engine ASP využíva zjednodušenú verziu runtime enginu Visual Basicu (verzia 5 alebo 6). Prečo to nevyužiť?

Webová aplikácia naprogramovaná ako ActiveX COM objekt má svoje výhody, aj nevýhody. Podobne ako pri iných otázkach sú strany za aj proti. V stručnosti môžeme spomenúť výhody, medzi ktoré patrí zvýšenie rýchlosti a stability aplikácie, možnosť omnoho kvalitnejšieho ošetrenia chybových stavov ASP stránky či vedľajší produkt kompilácie – nemožnosť čítať zdrojový kód, takže je chránený pred nedovoleným kopírovaním. Zrýchlenie spočíva v kompilácii, pretože pri štandartnom použití ASP stránok sa kód stránky prevádza zakaždým riadok po riadku, každý riadok je ISAPI filtrom upravený do podoby použiteľnej pre VB kompilátor, poslaný na kompiláciu a výsledok vrátený do ASP stránky. Zvýšenie stability je možné dosiahnuť omnoho lepším ošetrením chýb, keďže je možné využiť kompletné možnosti enginu VB, ktorý je v tomto ohľade kvalitnejší oproti enginu VBScriptu.

Medzi nevýhody musíme spomenúť nutnosť registrovať COM komponentu na serveri a samozrejme pri nevhodnom použití aj nadmerné odčerpávanie pamäťových prostriedkov serveru. Taktiež by sme nemali zabudnúť na bezpečnostné problémy používania ActiveX prvkov, aj keď použitie na serverovej strane znižuje toto nebezpečenstvo aj vzhľadom k tomu, že navonok nie je žiaden rozdiel oproti použitiu ASP stránok.

Pri samotnej tvorbe môžeme použiť dve metódy, využiť predpripravené šablóny vo VB alebo programovať aplikáciu úplne od začiatku. Je tu ešte tretia možnosť, a tou je konverzia existujúcich ASP stránok do ActiveX COM objektu, ktorá si vyžaduje minimálnu námahu. Tejto konverzii sa budeme venovať v tomto článku.

Ak sa dobre prizrieme zdrojovému kódu ASP stránky a použijeme presný zápis kódu podľa špecifikácie ASP (to znamená, že všetok HTML kód je „uzavretý“ v procedúre Response.Write) zistíme, že je to všetko len VB kód. Príklad „nesprávne“ formátovaného kódu vidíme nižšie:

<% CodePage=1250 Language=“VBScript“ %>
<%
  Option Explicit
  Dim strThisDate ‚ dnešný dátum
  strThisDate = CStr(Now())
  Set cnn = Server.CreateObject(„adodb.connection“)
%>
<!DOCTYPE HTML PUBLIC „-//W3C//DTD HTML 4.01 Transitional//EN“>
<html>
<head>
  <title>Test page</title>
</head>
<body>
  Dnes je <%= strThisDate %>.
</body>
</html>
<%
  strThisDate = 0
  Set cnn = Nothing
%>

Príklad správne formátovaného kódu stránky „test.asp“:

<%@ CodePage=1250 Language=“VBScript“ %>
<%
  Option Explicit
  Dim strThisDate ‚ dnešný dátum
  Dim cnn
  strThisDate = CStr(Now())
  Set cnn = Server.CreateObject(„adodb.connection“)
  Response.Write „<!DOCTYPE HTML PUBLIC „“-//W3C//DTD HTML 4.01 Transitional//EN““>“ & vbCrLf
  Response.Write „<html>“ & vbCrLf
  Response.Write „<head>“ & vbCrLf
  Response.Write „
  <title>Test page</title>“ & vbCrLf
  Response.Write „</head>“ & vbCrLf
  Response.Write „<body>“ & vbCrLf
  Response.Write „
  Dnes je <%= strThisDate %>.“ & vbCrLf
  Response.Write „</body>“ & vbCrLf
  Response.Write „</html>“ & vbCrLf
  strThisDate = 0
  Set cnn = Nothing
%>

Z príkladu je jasné, že „správne“ formátovaná ASP stránka obsahuje len jeden súvislý blok VB kódu (<% ... %>). Takže pred použitím kompilácie musíme upraviť kód do správnej podoby. Po úprave samozrejme nestačí priame načítanie do VB a spustenie kompilácie, pretože VB nepozná objekty ASP. To dosiahneme pridaním referencie na potrebné objekty (Microsoft Active Server Pages Object Library a COM+ Services Type Library) do projektu vo VB, určením správneho typu projektu (ActiveX DLL) a doplnením obslužného kódu pre inicializáciu objektov, na čo použijeme v ďalších častiach hotové „šablóny“ s kódom.

Pre úpravu ASP stránky z predchádzajúceho príkladu založíme vo VB nový projekt typu ActiveX DLL a pridáme v Referencies potrebné objekty. Ak nemáte nainštalovaný IIS, referenciu na ASP library nenájdete. Možnosti sú dve, nainštalovať si IIS, alebo získať od známeho súbor asp.dll a cez regsvr32 ho zaregistrovať. Pre samotnú kompiláciu to stačí.

Do projektu pridáme novú triedu (Class) s názvom rovnakým, ako je ASP stránka (vlastnosť Instancing = „MultiUse“), prípadne môžete použiť svoj názov, na čo ale nesmiete zabudnúť pri vytváraní „obslužných“ ASP stránok. Ak konvertujeme väčší projekt s rovnakými názvami stránok v rôznych adresároch, premenovávaniu tried sa nevyhneme. Projekt nazveme primerane výstižným názvom, cez ktorý budú volané jednotlivé triedy pre každú ASP stránku, v našom skúšobnom príklade „ComTest“. Do kódu doplníme „obslužné“ procedúry zo „šablóny“ nižšie, pridáme kód z ASP stránky a nahradíme objekty z ASP objektmi z VB. Tu je príklad súboru „test.cls“:

Dim ObjSession As Session
Dim ObjApplication As Application
Dim ObjRequest As Request
Dim ObjResponse As Response
Dim ObjServer As Server
Public Sub OnStartPage(cursc As ScriptingContext)
    Set ObjSession = cursc.Session
    Set ObjApplication = cursc.Application
    Set ObjRequest = cursc.Request
    Set ObjResponse = cursc.Response
    Set ObjServer = cursc.Server
End Sub
Public Sub OnEndPage()
    Set ObjSession = Nothing
    Set ObjApplication = Nothing
    Set ObjRequest = Nothing
    Set ObjResponse = Nothing
    Set ObjServer = Nothing
End Sub
Public Function ViewPageAsp()
  Dim strThisDate ‚ dnešný dátum
  Dim cnn
  strThisDate = CStr(Now())
  Set cnn = ObjServer.CreateObject(„adodb.connection“)
  ObjResponse.Write „<!DOCTYPE HTML PUBLIC „“-//W3C//DTD HTML 4.01 Transitional//EN““>“ & vbCrLf
  ObjResponse.Write „<html>“ & vbCrLf
  ObjResponse.Write „<head>“ & vbCrLf
  ObjResponse.Write „
  <title>Test page</title>“ & vbCrLf
  ObjResponse.Write „</head>“ & vbCrLf
  ObjResponse.Write „<body>“ & vbCrLf
  ObjResponse.Write „
  Dnes je <%= strThisDate %>.“ & vbCrLf
  ObjResponse.Write „</body>“ & vbCrLf
  ObjResponse.Write „</html>“ & vbCrLf
  strThisDate = 0
  Set cnn = Nothing
End Function

Teraz „nastal čas“ pre prípadnú ďalšiu úpravu kódu, napríklad kvalitnejšie ošetrenie chýb, využitie možnosti skokov a volaní a podobne.

Po dokončení revízie kódu sme pripravení ku kompilácii projektu. Určite sa nevyhneme viacnásobným kompiláciám a úpravám, preto ihneď po prvej kompilácii nastavíme vo vlastnostiach projektu binárnu kompatibilitu na skompilovaný DLL súbor. Vyhneme sa tak nielen hromadeniu „nepotrebných“ záznamov v registroch ale aj prípadnému problému, ak sa rozhodnete pre zrýchlenie aplikácie volať objekt jeho GUID identifikátorom.

Na odskúšanie skompilovanej aplikácie potrebujeme ešte vytvoriť „náhradnú“ ASP stránku, ktorá bude volať spracovanie kódu z našej COM DLL. Kód novej stránky „test.asp“ pre náš prípad je následovný:

<%@ Language=VBScript %>
<%
  Option Explicit
  Dim Ctest
  Set Ctest = Server.CreateObject(„ComTest.test“)
  Call Ctest.ViewPage
  Set Ctest = Nothing
%>

Týmto sme náš malý „experiment“ prevodu ASP stránky do COM objektu dokončili. Na odskúšanie je potrebné skopírovať na IIS server súbory test.dll a novú ASP stránku test.asp, zaregistrovať pomocou regsvr32 knižnicu test.dll a odskúšať novú web aplikáciu. Pre záujemcov je k dispozícií vzorový VB projekt, ktorý si môžete stiahnuť.

Mohli by sme skončiť, ale popíšme si ešte malý trik, ako použiť tejto techniky aj bez vlastnenia Visual Basicu. Na kompiláciu sa dá použiť aj voľne dostupná a šíriteľná verzia Visual Basicu – Control Creation Edition (VBCCE). Keďže táto verzia umožňuje tvoriť len ActiveX komponenty, musíme použiť namiesto novej triedy novú komponentu. Tej nastavíme Vlastnosť InvisibleAtRuntime = True a vložíme kód triedy. V podstate sa nič výraznejšie nezmení, keďže aj komponenta je typ triedy s vizuálnym rozhraním, ktoré ale nevyužijeme.

Další zdroje

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Předchozí článek gravoexpress.cz
Štítky: Články

Mohlo by vás také zajímat

Nejnovější

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *