![]() | |
ASP patarimų liūnas Buvęs C/C++ programuotoju dabar įklimpau į ASP (su VBScript) liūną. Ir nustebau, su kiek daug naujo tipo netikėtumų susiduriama. Kai kurie jų kartojasi daugelyje ASP taikymų. Šie patarimai skirti tiems, kurie nori rečiau suklupti lygioje vietoje. 1. Visada aprašykite kintamuosius, vardus suteikdami pagal nusistovėjusius susitarimus. Option Explicit Dim iRow, sVardas, oCon iRow = 1 sVardas = Request.Form("Vardas") Set oCon = Server.CreateObject("ADODB.Connection") 2. VBScript programą aprašykite kaip Main procedūrą. Main ' Sub Main ' ' visi veiksmai ' End Sub 3. Apimtį sumažinkite naudodami SSI (Server Side Includes) <BODY> <!--#include FILE="/common/connect.inc" --> <!--#include FILE="/common/menunav.inc" --> 4. Atsargiai naudokite On Error režimą. Option Explicit On Error Resume Next Dim sVardas, ilgid sVard = Request.Form("Name") ilgis = Len (sVardas) Suklydome nurodydami kintamojo vardą ir sVardas niekada neįgaus reikšmės. Tačiau klaidos pranešimo šiuo atveju negausite. Tad On Error naudokite tik funkcijų viduje - ir tik ten, kur to tikrai reikia. 5. Du skirtingi laukų masyvų formose sukūrimo būdai. a) visiems laukams priskiriant tą patį vardą, pvz., <% Const icTotalRows = 3 For iRow = 1 To icTotalRows %> <TR><TD><INPUT SIZE=3 NAME="numeris" VALUE="N<%=iRow%>"></TD></TR> <% Next %> Naršyklėje šis kodas sugeneruos tris lentelės eilutes su įvedimo laukais. Kaip paimti šių laukų reikšmes parodoma šiame fragmente: For Each sItem In Request.Form("numeris") ' Veiksmai su sItem Response.Write "<BR>" & sItem Next b) Tačiau galima generuoti lentelės laukus kiekvienam jų priskiriant unikalų vardą (ir sukuriant paslėptą lauką jų kiekio reikšmei saugoti), pvz. <% Const icTotalRows = 3 For iRow = 1 To icTotalRows %> <TR><TD><INPUT SIZE=3 NAME="numeris<%=iRow%>" VALUE="N<%=iRow%>"></TD></TR> <% Next %> <INPUT TYPE="hidden" NAME="kiekis" VALUE="<%icTotalRows%>"> Tokių laukų reikšmių paėmimo būdas iliustruojamas šiame fragmente: Dim nViso, iRow, sItem nViso = CInt(Request.Form("kiekis")) For iRow = 1 To nViso sItem = Request.Form("numeris" & iRow) ' Veiksmai su sItem Response.Write " Koks skirtumas tarp šių dviejų būdų? Logistikos (užsakymų įvykdymo sekimo) duomenų bazėje buvo pasirinktas antrasis būdas (galite pabandyti minėtos DB demonstracinį variantą). 6. Formų laukus konvertuokite į reikiamą formatą. iSuma = CInt(Request.Form("pirmas")) + CInt(Request.Form("antras")) 7. Naudokite ryšio seanso kintamuosius. Jei keliuose puslapiuose naudojami tie patys parametrai (pvz., vartotojo ID), galite naudotis Session kintamaisiais. Panašius sprendimus galima realizuoti naudojant paslėptus ("hidden") formų laukus ar "sausainiukus" (apie juos paskaitykite šiame puslapyje), tačiau ryšio seanso kintamieji yra daug efektyvesnis būdas (nes jie saugomi serveryje). Tačiau ryšio seanso terpė turi savųjų niuansų. Pirma, jos kintamieji yra laikini ir automatiškai praranda reikšmė po tam tikro laiko (nustatyto serverio režimais, nutylint IIS'ui - 20 minučių). Šio laiko intervalo reikšmę galite valdyti ir patys priskirdami reikšmę Session.Timeout savybei (turite galimybę ir ištrinti visus ryšio seanso kintamuosius pasinaudoję Session.Abandon metodu). Įtai reikia atsižvelgti kuriant įmonių vidines sistemas, kai vartotojai, įkėlę dinaminį puslapį, gali nebūti aktyvūs ilgą laiko tarpą (išeiti pietauti ir t.t.). Pvz., Session("User")= Request.Form("Vartotojas") Pradinės ryšio seanso kintamųjų reikšmės gali būti priskirtos GLOBAL.ASA failo (esančio pagrindiniame Internetinio taikymo puslapyje) "Session_onStart" procedūroje, pvz., Sub Session_onStart Session("User")="guest" Session("Aktyvumas")=0 Session("PreviousPageVisited")="" End Sub Ryšio seanso kintamąjį "Aktyvumas" galima panaudoti skaitliukui, kiek puslapių aplankė šis vartotojas jo reikšmė padidinant kiekvieno puslapio pradžioje, pvz., Sesion("Aktyvumas")=CInt(Sesion("Aktyvumas")) + 1 ComeFrom=Session("PreviousPageVisited") Session("PreviousPageVisited")="search.asp" 8. Formos laukų reikšmių korektiškumo patikrinimas. a) Tikrinimas kliento pusėje yra greitesnis, reakcija į klaidas staigesnė, nėra kreipinių į tinklą ir mažiau apkraunamas serveris. Atrodytų, visi pranašumai už šį variantą. Tačiau WWW svetainių lankytojai gali naudoti įvairias naršykles turinčias skirtingas galimybes. Tad tikrinimas kliento pusėje turėtų būti daromas naudojant kuo universalesnias funkcijas. Pvz., <SCRIPT LANGUAGE="JavaScript"> <!-- function doSubmit(forma) { if ((forma.Vardas <>> "") && (forma.Slapt <> "")) return true; else { alert ("Būtina nurodyti tiek vartotoją, tiek jo slaptažodį!"); if (forma.Vardas == "") forma.Vardas.focus(); else forma.Slapt.focus(); return false; } } //--> </SCRIPT> Vartotojas: <INPUT NAME="Vardas"><BR> Slaptažodis: <INPUT NAME="Slapt" TYPE="Password"><BR> <INPUT TYPE="Submit" VALUE="Įvesk" onSubmit="return doSubmit(this.form)"> b) serverio pusėje daroma visa parametrų kontrolė, kuriai reikalinga naudotis DB duomenimis. Pvz., <!--#include FILE="/common/connect.inc" --> <% sName=Request.Form("Vardas") sPswd=Request.Form("Slapt") bLogin = False If (sName <> "") AND (sPswd <> "") Then sqlquery="SELECT ID FROM Vartotojai WHERE " & _ User='" & sName & '" AND Pswd=' & sPswd & "'" oRset.Open sqlquery, oCon, 3 bLogin = oRset.Recordcount > 0 oRset.Close End If If Not bLogin Then Response.Write "<P>Neteisingi vartotojo registracijos duomenys. " & _ "<A HREF=index.htm>Pakartokite...</A>" & _ "</P></BODY></HTML>" Response.End End If %> <!--#include FILE="/common/menunav.inc" --> 8. Sukurkite specialų klaidų pranešimų puslapį. Function VykdykSQL (byval sqlQuery) On Error Resume Next oCon.Execute sqlQuery If (oCon.Errors.Count > 0) OR (Err.Number <> 0) Then KlaidaSQL (sqlquery) ' Paprogramė klaidos puslapio pateikimui VykdykSQL = False Else VykdykSQL = True End End Function insertSQL = "INSERT Vartotojai (User, Pswd) VALUES ('guest', 'guest')" bOK = VykdykSQL(insertSQL) If bOK Then ' Tęsti kitus veiksmus End If | |