|
| |
|
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
| |