Avatar billede carstenandersen Nybegynder
24. oktober 2012 - 07:46 Der er 7 kommentarer og
1 løsning

Korrekt brug af include filer

Hej eksperter

Jeg har ledt og læst meget om brug af #include filer i classic asp, men er stadig lidt i tvivl ;-)

Eksempel:

En bruger kommer ind på en side. Hvis brugeren er "kundetype 1", skal brugeren have vist x-filer, og er brugeren "kundetype 2", skal brugeren have vist y-filer. Forenklet kode:

<% if Bruger = 1 then %>
<!-- #include virtual="/x-filer.asp"-->
<% elseif Bruger = 2 then %>
<!-- #include virtual="/y-filer.asp"-->
<% end if %>

x-filer.asp refererer videre til hele "filsættet" for "kundetype 1" og y-filer.asp refererer videre til hele "filsættet" for "kundetype 2".

Hvordan håndterer serveren dette? Læser serveren altid hele koden først og dermed begge "filsæt" og dermed altid indlæser et "ekstra" unødvendigt "filsæt", eller henter den kun det relevante filsæt, altså læser serveren kun x-filsættet, hvis bruger = 1?

Håber, at det giver mening ;-)

På forhånd tak.
Avatar billede softspot Forsker
24. oktober 2012 - 08:33 #1
Der køres en præprocessering af siden inden ASP-fortolkeren starter og det er i denne process at includes flettes ind i siden. Det betyder derfor også, at begge includefiler indlæses i siden hver gang.

Hvad der er rigtigt for dig, afhænger af hvad du vil opnå. Der er som sådan ikke noget galt med, at begge includefiler indlæses, hvis bare de er formuleret, til formålet. Siden caches af IIS til senere brug, så det er kun første gang den læses og oversættes, resten af tiden benytter IIS cachens oversatte version. Derfor kan det måske i virkeligheden være en fordel, at begge includefiler indlæses, da du så kan nøjes med én version af siden i cachen i stedet for 2, hvor der forskel på hvilken fil der inkluderes... :-)

Alternativt kan du (måske) bruge Server.Execute til, betinget, at udføre en anden ASP-fil. Her vil det kun være den der udføres af koden, som læses. Dog har dette nogle begrænsninger ifht. scope, da ASP-filer der udføres med Server.Execute ikke kan oprette globale variable i det kaldende scope (de kører i et isoleret scope).
Avatar billede carstenandersen Nybegynder
24. oktober 2012 - 08:45 #2
Det begynder at give mening ;-) En ting er indlæsning af filer, men der er også problemstillingen omkring kald til databasen. Hvis vi laver koden om til:

<% if Bruger = 1 then %>
SQL = "Select * from Sider where Bruger= 1"
Set rs = Conn.Execute(SQL)
<% elseif Bruger = 2 then %>
SQL = "Select * from Sider where Bruger= 2"
Set rs = Conn.Execute(SQL)
<% end if %>

Giver det 1 eller 2 databasekald? Det har vel rigtig stor betydning, hvor mange databasekald, der ligger i inkludere filer, og hvor mange af dem, der bliver kaldt?

Virkelig tak for din hjælp !
Avatar billede carstenandersen Nybegynder
24. oktober 2012 - 08:48 #3
i forhold til Server.Execute, er det så?

<% if Bruger = 1 then %>
<!-- #include virtual=""-->
<%Server.Execute("/x-filer.asp")%>
<% elseif Bruger = 2 then %>
<%Server.Execute("/y-filer.asp")%>
<% end if %>

Er det i dette tilfælde altid kun 1 filsæt, som indlæses?
Avatar billede softspot Forsker
24. oktober 2012 - 08:57 #4
#2: Der er forskel på hvad der genereres ind i ASP-filen af kode og hvad der udføres. Den kode der udføres afhænger af logikken i den kode du har på siden efter præprocesseringen er gennemført (og scriptfortolkeren er startet op), så om du benytter inline kode eller inkluderet kode er ligegyldigt i den sammenhæng.

#3: Ja, det er kun den ene fil der indlæses i dette tilfælde... MEN!!! Hvis din kode i x-filer og y-filer kun udfører opslaget i databasen og returnerer en variabel med recordsettet, kan du ikke benytte Server.Execute, da Server.Execute, som sagt, ikke kan operere i samme scope som den kaldende part (og derfor vil rs-variablen ikke være synlig for den kaldende kode i dit eksempel).

Server.Execute skal/kan kun bruges i tilfælde, hvor du har isoleret funktionalitet der kan udføres uden afhængighed til andre (eller hvor afhængigheden, f.eks. værdioverførsler, styres via et eksternt medie, så som en database, session, application eller lign.).
Avatar billede carstenandersen Nybegynder
24. oktober 2012 - 09:16 #5
Hold da op, det sætter tanker igang ;-) Er ikke helt sikker på, at jeg er med på #2, men skal lige til et møde, hvorefter jeg vil lave en masse tests. Herefter vender jeg tilbage med det samme.
Avatar billede softspot Forsker
24. oktober 2012 - 11:13 #6
Hvis du har 2 includefiler som hedder A.asp og B.asp og indeholder

set rs = con.execute("SELECT * FROM tabelA")

hhv.

set rs = con.execute("SELECT * FROM tabelB")

og du så inkluderer dem i siden SideX.asp således:

if bruger = 1 then
<!-- #include file="A.asp" -->
elseif bruger = 2 then
<!-- #include file="B.asp" -->
end if

så vil den fil som fortolkeren skal forholde sig til se således ud:

if bruger = 1 then
  set rs = con.execute("SELECT * FROM tabelA")
elseif bruger = 2 then
  set rs = con.execute("SELECT * FROM tabelB")
end if

Det vil altså være ligegyldigt for fortolkeren, om du skriver dette direkte i SideX.asp eller du inkluderer de to ASP-filer (A og B). SideX.asp bliver bygget af præprocessoren inden fortolkeren får den, så alle includes er udført på dette tidspunkt og præprocessoren kigger ikke på koden, det er fortolkerens arbejde (og sker derfor først senere i processen). I forbindelse med udførslen af koden vil der stadig kun ske højst et opslag i databasen, med ovenstående kode, da det jo er betinget af værdien af variablen bruger.

Execute-metoden på Server-objektet er ligeledes et runtime-element, som først evalueres når koden udføres og derfor vil det kun være det Server.Execute-kald, der ligger i den betingelsesblok som opfyldes, der udføres.

Processen for udførslen af en ASP side er (overordnet) altså:

1. Præprocessér, dvs. indlæs siden og inkluder de filer der måtte være reference til (med #include-direktivet)

2. Fortolk og udfør koden i den, af præprocessoren, opbyggede side.
Avatar billede carstenandersen Nybegynder
24. oktober 2012 - 11:40 #7
Jeg har fået overblik og fået det til at virke :-)

I morges var der nogle ting, som så meget "sort ud", men totalt ændret efter dine 3 indlæg - helt vildt og tusind tak for din hjælp !

Smid et svar.
Avatar billede softspot Forsker
24. oktober 2012 - 11:49 #8
Velbekomme :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester