You are on page 1of 13

NAPREDNE WEB TEHNOLOGIJE

KOLOKVIJ 1

ASP.NET MVC je okruženje za izradu web aplikacija koje


primjenjuje generalni Model View Controller predložak na
ASP.NET platformu.

.NET Framework i .NET Core su dvije opcije za izradu web


aplikacija u .NET tehnologiji na strani servera. Većina
komponenti im je zajednička i većina koda je prenosiva s jedne
opcije na drugu

ASP.NET Core je open source, cross-platform,


redizajnirano i nanovo napisano ASP.NET okruženje.
.NET Core aplikacije se izvode preko Kestrel web
servera koji ima ugrađenu podršku za HTTPS,
WebSockets i Unix sockete. Podržan je na svim
platformama i verzijama za koje je podržana i .NET
Core platforma.

Razlike:

ASP.NET Core ASP.NET

Windows, macOS, Linux Windows


Web Forms, SignalR, Web API, WebHooks, Web
Razor pages, MVC, Web API, SignalR
Pages
Više verzija po stroju Jedna verzija po stroju
Visual Studio, Visual studio za Mac, VisualStudio
Visual studio - C#, VB ili F#
Code - C# ili F#
Bolje performanse od ASP.NET Dobre performanse

.NET Framework ili .NET Core runtime .NET Framework runtime

Framework ili softversko okruženje je apstrakcija u kojoj se softver opće funkcionalnosti može prilagoditi
pisanjem dodatnog koda, pružajući specifične aplikacijske funkcionalnosti. Olakšava razvoj aplikacija,
softverskih proizvoda i rješenja. Može uključivati različite programe za podršku, kompajlere, biblioteke, alate
i APIje.

Neki od okruženja su: .NET framework, Bootstrap framework, ASP.NET, Django (Python), Zend, Express.js,…

ASP.NET je Microsoftova tehnologija za razvoj web aplikacija (ubuduće app) koje je moguće razvijati na više
načina:

1. Razvoj app za interakciju s korisnikom koja treba imati odgovarajuće korisničko sučelje. Postoje 3 pristupa:
a) Web forms - tip ASP.NET app koji koristi web forme uz web forms sintaksu. Web forme su gotove
kontrole od kojih se slaže app. Temeljna kontrola je klasa Page koja predstavlja jednu stranicu.
Programski kod se uglavnom odvaja u code-behind datoteke.

b) MVC - tip ASP.NET app koja se temelji na MVC predlošku, a koristi Razor sintaksu za kombiniranje
HTML i C# koda. Osnovni element prikaza je WebViewPage, ali je ugrađen u MVC predložak.
Programski kod se također piše u code-behind datotekama.

c) Web API - tip ASP.NET app koji omogućava kreiranje RESTful servisa. Koristi se kada se razvija app
koja nije namijenjena krajnjem korisniku, nego drugoj app.

Single page web app podrazumijeva da se s web servera dohvaća samo jedna HTML stranica unutar koje se
izvođenjem JavaScript koda sa web servera dohvaćaju ostale informacije (JSON) i rezultati.

Dizajnerski predložak (design pattern) je općenito rješenje koje se može ponovno upotrebljavati za rješavanje
različitih problema prilikom dizajniranja app. Sam predložak nije direktno prevodiv u kod, već je idejno
rješenje i treba ga se treba implementirati na definiran način. On je šablona kako riješiti određeni problem.
Odnose se na različite razine apstrakcija i granulacija sustava. Arhitekturalni predložak je onaj koji se odnosi
na cijeli sustav (najviša razina).
Cilj je ubrzati i olakšati razvoj app, ponovna uporabljivost koda, jednostavno testiranje app,…

Apstrakcija je bilo koja tehnika kojom se pristupa kompleksnosti računalnog sustava skrivanjem
“nepotrebnog“ u trenutnom kontekstu.

MVC (Model View Controller) je arhitekturalni predložak namijenjen odvajanju prezentacije sadržaja od
ostatka app, tj. odvajanje koda za grafički prikaz od koda za poslovnu logiku od koda korisničke akcije.

- Model - središnji dio predloška, upravlja podacima u sustavu i implementira poslovnu logiku. Korisničke
ulaze prima preko kontrolera.

- Prikaz - bilo koja vizualizacija podataka korisniku. Prilikom prikazivanja podaci se mogu organizirati na
različite načine, tj. mogu se stvarati različiti prikazi, ovisno o potrebama korisnika.

- Kontroler - dio koji prihvaća ulaze korisnika te ih prema potrebi prevodi u naredbe modelu ili drugom
prikazu. Na osnovu zahtjeva korisnika generira prikaze s podacima iz modela.

Svaki predložak je pojednostavljena uputa kako organizirati


izvorni kod, kako ga razbiti na organizacijske komponente,
gdje smjestiti određene funkcionalnosti. MVC predložak ima
visok stupanj odvajanja interesa SoC (Seperation of Concerns) i
ponovne uporabljivosti koda (reusability) zbog čega je jako
prihvaćen.

SoC je princip dizajniranja softvera pri čemu se razdvajaju


dijelovi app prema izdvojenim, diskretnim odgovornostima
unutar sustava
MVC web okruženje je popraćeno dodatnim mehanizmima, pa tako i mehanizmom za rutiranje HTTP zahtjeva i
odgovora.

1.) HTTP zahtjevi se prosljeđuju kontrolerima koji ih obrađuju i


najčešće izvode CRUD operacije nad podacima u modelu.

2.) Podaci se kombiniraju s pogledom i vraćaju u HTTP odgovoru.

Model postoji u na strani servera (tu se spremaju trajno podaci), ali


uključivanjem Angular okružja, SignalR tehnologije i sl. tehnologija
u ASP.NET MVC moguće je dio modela prebaciti i na klijenta.

Koncept konvencija nad konfiguracijom (convention over configuration ili coding by convention) je softverska
dizajnerska paradigma (pristup razvoju softvera) prema kojoj se odluke i izbori poput imenovanja klasa,
mapiranja handlera,… u aplikaciji koje developeri trebaju donijeti tijekom razvoja aplikacije predefiniraju
(default). Kaže da je svojstva web app jednostavnije i bolje definirati konvencijom, nego konfiguracijskim
datotekama. Danas se većinom koristi ovaj pristup.

Osnovne konvencije strukture ASP.NET MVC app:

1.) Svaka klasa kontrolera završava riječi Controller i nalazi se u Controllers direktoriju. (ProductController)

2.) Postoji samo jedan Views direktorij za sve prikaze app.

3.) Prikazi koje kontroleri koriste smješteni su u poddirektorij Views direktorija i imenuju po konvenciji
prema imenu kontrolera bez sufiksa Controller. (/Views/Product)

4.) Svi dijelovi sučelja, koji su ponovno upotrebljivi, se smještaju u poddirektorij Shared Views direktorija.

Inverzija kontrole (IoC - Inversion of Control) je princip dizajniranja softverskih kojim se na različite načine
mijenja uobičajena kontrola tijeka izvršavanja app prema kojoj se app izvršava od početka app do kraja i
„sama” ima kontrolu nad tijekom izvršavanja. Povećava kvalitetu koda (reuseability, maintainablility,
testability, portability, …) kroz SoC i smanjuje ovisnosti među komponentama koda (decoupling).
(npr. kod JavaScripta, kada se desi neki događaj, event handler callback funkcija se smješta u red. Ne izvršava
se odmah u glavnoj niti nego se periodički dohvaćaju funkcije iz reda da bi se izvršile u glavnoj niti)
Loša strana IoCa je to što može zakomplicirati debugiranje app.

Zbog IoC se framework razlikuje od obične biblioteke koja sadrži funkcionalnosti.

EDP (event driven programming) je programska paradigma koja se obično koristi kod GUIja (graphical user
interface) i obično je implementirana kroz IoC.

Factory predložak je jedan od strukturalnih predložaka čija je namjena inverzija kontrole prilikom stvaranja
objekata. Objekt koji instancira određeni objekt, kako bi ga koristio, prepusti stvaranje objekta koji će
koristiti. Time se smanjuje sprega između te dvije klase, tj. objekta koji se koristi i korištenog objekta.

Factory predložak se može implementirati kao Factory Method (implementira se nasljeđivanjem), Simple
Factory i Abstract Factory (mehanizam sučelja), ovisno o potrebama app. Podrazumijeva se da postoji
centralno mjesto za stvaranje objekata koje koriste drugi objekti.

Visual Studio web alati: - IntelliSense


- podrška za testiranje app u različitim pretraživačima
- kreiranje vlastitih predložaka
- Emmet način pisanja HTML i CSS koda
- SideWaffle
URI rutiranje odnosi se na usmjeravanje klijentskih HTTP zahtjeva sa zahtjevnog URLa na krajnju točku web
app. Klasičan princip usmjeravanja koji radi web server je da se URL (Uniform Resource Locator) koji
predstavlja globalni identifikator traženog resursa mapira u lokalnu datoteku na disku, tzv. mapiranje 1:1.
Format URIja za HTTPS: <protokol>//:<server>/put do dokumenta (npr. https://www.google.hr)

Klasične tehnologije pojedini URI mapiraju u pojedinu .html, .php, .asp, .aspx datoteku. Nedostaci ovog
pristupa su da iz URIja korisnik ne može razumjeti što dohvaća, web tražilice ne mogu dobro povezati takav
URI s pojmovima pretraživanja i URIji nisu estetski.

Smjernice za dobro dizajnirane URLove: - ime domene koje je jednostavno za pamćenje


- kratki URLovi
- URLovi koji su jednostavni za tipkanje
- URLovi koji održavaju strukturu stranice
- URLovi koji se mogu jednostavno “hakirati“ izmjenom kraja URLa
- trajni (persistent) URLovi (PURL)

PURL (persistent URL) je tip URLa koji usmjerava zahtjeve na točno mjesto traženog resursa. Mora uvijek ostati
isti makar se struktura stranice mijenja.

Prednosti rutiranja klijentskih web zahtjeva je mogućnost korištenja tzv. taštih (vanity) URLa koji su razumljiviji
korisnicima kao i tražilicama (npr. http://localhost/Filmovi/Ljubavni/Titanic).

SEO koncept (Search Engine Optimization) je postupak optimizacije web stranice za


tražilice koji se definira kao niz postupaka s ciljem utjecanja na vidljivost određene
web stranice u web tražilicama. Općenito, što je web site "vidljiviji", odnosno što je
više rangiran, to će više posjetitelja dobiti s tražilice (npr. sa Googlea). Glavni cilj
optimizacije je dovođenje što većeg broja posjetitelja na web stranice.

Smjernice za SEO: - plitka struktura web stranice


- važne stranice imaju bar jedan link prema drugoj stranici
unutar web stranice
- korištenje ključnih riječi u tekstu linka
- korištenje alt atributa u img tagu,…

ASP.NET podržava rutiranje kroz zasebni ASP.NET API. U ASP.NET


MVC-u kontroleri stoje ispred svega osim routing podsustava.
Programer definira URL uzorke (pattern) koje routing podsustav
koristi za mapiranje dolaznog HTTP zahtjeva u rukovatelje
zahtjeva (request handler).

ASP.NET web forms aplikacija request handler je .aspx datoteka, a


kod MVC je klasa Controller i neka od njezinih Action metoda.

Dvije uloge rutiranja: - mapiranje URLa u akciju kontrolera


- kreiranje odlaznog URLa koji odgovara akciji kontrolera

Sve konfigurirane rute app koje definira programer, pri


pokretanju app se registriraju i kreiraju tablicu ruta
(RouteTable klasa). Tablicu koristi mehanizam za rutiranje
(routing engine) kako bi za dolazni HTTP zahtjev na osnovu
sadržanog URL pronašao odgovarajući handler.

Ruta je kombinacija URL predloška i informacije o handleru.


Global.asax datoteka ili ASP.NET app datoteka je opcionalna datoteka app, a sadrži kod koji odgovara na
događaje na razini cijele aplikacije. ASP.NET app razlikuje dva životna ciklusa: cijele app i pojedinog zahtjeva.

Predložak za URL: {controller}/{action}/{id} --> /Products/show/beverages :primjer URLa

Placeholderi su definirani vitičastim zagradama, segmenti su odvojeni kosom crtom “ / “. Više placeholdera
unutar jednog segmenta odvaja se literalom “ - “.

ASP.NET MVC rute trebaju sadržavati kontroler i akciju koja će se izvršiti. Ne


moraju biti imenovane, ali je poželjno. Ne smiju postojati dvije rute s istim
imenom.
defaults parametar definira predefinirani objekt koji će se koristiti ako nije
naveden ni jedan kontroler ni akcija u URIju

Parametar id ima svojstvo da ga se ne treba imenovati u zahtjevu i ne treba biti dio query stringa, već se može
navesti kao dio puta.

Proširena metoda (extension method) je metoda koja se dodaje objektu nakon kompajliranja bez potrebe za
stvaranjem nove klase s dodanom metodom, ponovnim kompajliranjem, itd.

Inicijalizatori objekata pružaju jednostavnu sintaksu za inicijalizaciju propertyja klase (postavljanje na


određene vrijednosti). Kod inicijalizatora izvršava se nakon konstruktora.

Inicijalizatori kolekcija rade na isti princip kao i inicijalizatori objekata, a omogućavaju postavljanje zadanih
vrijednosti u kolekcije.

Kolekcije su mehanizam u C# za rad s grupama povezanih objekata. Omogućavaju dinamičko dodavanje i


brisanje elemenata.

Imenovani argumenti omogućavaju povezivanje argumenta s imenom parametra (ne s pozicijom parametra u
listi). Opcionalni argumenti omogućavaju izostavljanje vrijednosti pojedinih parametara.

StopRoutingHandler ili IgnoreRoute su metode koje se koriste ako ne želimo da neke zahtjeve obradi
mehanizam rutiranja.

ActionLink metoda generira link na akciju kontrolera, a Action generira samo URL.

.axd ekstenzija ne definira fizičku datoteku, već dinamički kreirani handler prema dll ili nekim drugim
datotekama app. ASP.NET MVC routing podsustav ne bi trebao izvršavati ovakve zahtjeve.

Sve metode koje dinamički kreiraju URL-ove pozivaju jednu od dvije verzije metode GetVirtualPath na kolekciji
ruta (Route.GetVirtualPath) aplikacije:

- public VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)

Prva metoda ima trenutni RequestContext (objekt koji sadrži informacije o trenutnom HTTP zahtjevu) i tablicu
definiranih ruta. Prolazi kroz tablicu provjeravajući može li kreirati URL. Ako ruta odgovara, metoda vraća
instancu VirtualPathData s URLom, ako ne odgovara vraća null, a podsustav rutiranja dohvaća sljedeću rutu.
- public VirtualPathData GetVirtualPath(RequestContext requestContext, string name, RouteValueDictionary values)

Druga metoda koristi ime rute kao treći parametar. Imena ruta u kolekciji ruta aplikacije su jedinstvena, stoga
nije potrebno prolaziti kroz cijelu kolekciju, već se odmah dohvaća imenovana ruta. Ako imenovana ruta po
parametrima ne odgovara, metoda vraća null i ne provjerava dalje druge rute.

Kreiranje URLa: Html.ActionLink(”Back to List”, ”Index”)


MVC predložak slijedi SoC princip dizajniranja programa. Odvajanjem dijelova app na ovakav način se dobivaju
moduli maksimalne kohezije i minimalne sprege.

Model u MVCu je klasa (kolekcija klasa) u objektno orijentiranom smislu, zbog toga podaci u app trebaju biti u
obliku instanci klasa modela, odnosno objekata. Pretvaranje fizičkog zapisa podataka u objekte app je
unošenje dodatne razine apstrakcije u app.

ORM (Objektno relacijsko mapiranje) je postupak kojim se objekti app prevode u zapise u relacijskoj bazi
podataka i obrnuto. Problemi tijekom mapiranja zovu se object-relational impedance-mismatch.

NuGet je Microsoftov package manager koji dolazi kao ekstenzija za Visual Studio. Automatizira instalaciju,
nadogradnju i uklanjanje softvera vodeći računa o povezanom softveru, dijeljenim bibliotekama, … Za .NET
upravlja paketima na razini app (Application-level Dependency manager) i omogućava jednostavno
dodavanje potrebnih paketa koji nisu standardno dio projekta. NuGet se može pozvati iz konzole ili preko
grafičkog sučelja.

CDN (Content Delivery Network) je mreža zemljopisno distribuiranih servera koji sadrže različite sadržaje (web
sadržaje, softver za preuzimanje, video sadržaje, licencirane CDN, ….). Obično su to sadržaji poput jQuery.js i
slično, koji se mogu koristiti unutar web app. Dva razloga zašto koristiti tuđe CND: nije potrebno sam ih
hoastati na svom web serveru i to što CND može usmjeriti klijenta na dohvaćanje CND sadržaja koji je “bliži“.
(npr. CloudFront, Microsoft,…)

EF se oslanja na ADO.NET koji je dio .NET frameworka koji omogućava spajanje aplikacije na različite izvore
podataka i upravljanje podacima koji se nalaze u izvoru podataka (najčešće baza podataka). ADO.NET je OO
skupina biblioteka s gotovim klasama koje uključuju funkcionalnosti potrebne za rad s izvorima podataka.

ODBC (Open Database Connectivity) je API za pristup bazi podataka koji je razvio Microsoft.

EDM (Entity Data Model) je način opisivanja strukture podataka neovisno o tome kako su podaci pohranjeni.
Temelji se na ER (Entity-Relationship) modelu.

Sastoji se od tri glavna dijela:


- Konceptualni model sadrži modele klasa i njihovih relacija neovisnih
o dizajnu baze podataka (npr. domena app je fakultet)
- Mapiranje sadrži informacije potrebne za mapiranje konceptualnog
modela u model pohrane
- Model pohrane je dizajn baze podataka koji uključuje tablice,
relacije, ključeve, ali i poglede i procedure definirane nad
bazom podataka

Ovakvo odvajanje pruža prednosti lakše komunikacije svih dionika (stakeholders), lakše razumijevanje domene
od strane developera, lakši prijenos na različite načine fizičke pohrane podataka,…

Object Service je glavna ulazna točka za dohvaćanje podataka iz baze i spremanje podataka u bazu. Zadužen je
za materijalizaciju, postupak pretvaranja podataka koje je vratio Entity client data provider u entitete.

Entity Client Data Provider sloj ima glavnu namjenu u prevođenju L2E i Entity SQL upita u SQL upite koje može
razumjeti relacijska baza. Komunicira s ADO.Net data providerima koji šalju i dohvaćaju podatke iz baze.

ADO.Net Data Provider sloj komunicira s bazom podataka korištenjem standardnog ADO.Net pristupa.

L2E (LINQ to Entities) je jezik za generiranje upita nad objektima. Vraća entitete definirane u konceptualnom
modelu. Entity SQL (samo za EF 6) je još jedan jezik za generiranje upita nad entitetima.
DDM (Domain Drive Modeling) ili DDD (Domain Driven Design) je pristup razvoju složenih app gdje model
domene definira entitete i relacije, logički model za relacijsku bazu se približava fizičkoj pohrani kroz
normalizaciju, ograničenja stranih ključeva, i dr., a fizički model za određenu implementaciju baze podataka
specificira detalje pohrane poput indeksiranja, uskupljivanja (clustering) podataka i sl.

Četiri (tri) pristupa razvijanju app u EF: - Model first ili Code first kada se stvara nova baza podataka
- Database first ili Code first kada već postoji baza podataka

Database First iz postojeće baze reverznim inženjerstvom može se dobiti model app. Model je u .edmx fileu.

Code first - odmah se pišu obične C# klase koje su neovisne o EF, a EF zaključuje iz koda, pomoću niza
konvencija, kako i gdje pohraniti instance.
- podaci klase objekata Student bit će pohranjeni u tablicu Students
- svojstvo klase ID ili imeklaseID će biti mapirano u primarni auto-inkrementalni ključ u tablici,…

Svojstva su slična podatkovnim članovima klase i omogućavaju čitanje i zapisivanje vrijednosti privatnih
članova kroz pristupnike (accessors). Pristupnici svojstva sadrže naredbe za dohvaćanje ili postavljanje
svojstva. Deklaracija pristupnika može sadržavati pristupnik get ili set ili oba. Kod deklaracije svojstva oba
pristupnika trebaju biti deklarirana unutar tijela svojstva tj. {}. Tijelo pristupnika nalikuje metodi. Pristupnik
get treba vratiti vrijednost tipa svojstva te mora završiti ili s return naredbom ili s throw naredbom.
Pristupnik set je sličan metodi povratnog tipa void. Koristi implicitni parametar value istog tipa kao i svojstvo.

Mehanizam auto-implementiranih svojstava (auto-implemented properties) kaže kompajleru da kreira


privatna anonimna polja kojima se može pristupiti samo get i set pristupnicima. Kada svojstva ne trebaju
implementirati dodatnu funkcionalnost, već samo osnovne (dohvaćanje i postavljanje vrijednosti).

Podatkovne anotacije (data annotation) su atributi kojima definiramo svojstva entiteta (klasa) podatkovnog
modela. Atributi su mehanizam u C# kojima možemo definirati nova deklarativna svojstva klase. (npr. kada
želimo primarni ključ mapirati uz svojstvo koje nije imena ID ili imeklaseID, koristimo [Key]). Koriste se i za
definiranje metapodataka koje će EF koristiti prilikom kreiranja baze. Zatim u modelu se koriste kao
validacija na strani klijenta, te kao validacija podataka na strani servera.

Code first podržava korištenje EF fluentnog APIja koji omogućava definiranje svojstava modela programskim
kodom, za razliku od podatkovnih anotacija koje su deklarativne. Moguće je i kombiniranje ova dva pristupa,
ali u tom slučaju je fluent API jači (fluent API > data annotation > default conventions).

Fluentna sučelja je API dizajnerski predložak za implementaciju OO APIja koji omogućava pisanje fluentnog
koda, lakšeg za čitanje. Oslanja se na ulančavanje metoda (samo non-void metode).

Required (RequiredAtribute) definira da je određeno svojstvo obavezno. Validacija unosa podatka i na strani
klijenta i na strani servera.

DataType anotacija definira tip podatka specifičnije, nego što to rade osnovni tipovi podataka (npr. CreditCard,
Curency, Custom, Date, DateTime, Duration, EmailAddress, Html, Password, Text,…).

DisplayFormat atribut podržava različite opcije formatiranja podataka prilikom prikaza kroz niz parametara.

Column atribut definira ime kolone u tablici koja odgovara klasi u kojoj se atribut koristi.

StringLength atribut definira veličinu string svojstva i na strani servera i na strani klijenta.

Range atribut specificira minimalnu i maksimalnu granicu za numeričku vrijednost.


Operator ? omogućava definiranje null tipova vrijednosti (nullable tip varijable).

Operator ?? (null-coalescing) se koristi za operacije nad nulabilnim tipovima. Vraća operand s lijeve strane ako
je različit od null, inače vraća operand s desne strane operatora.

Tip varijable je nullable ako mu se može dodijeliti neka vrijednost ili null vrijednost, što znači da varijabla nema
nikakvu vrijednost. (String može biti null, Int32 ne može).

Formatiranje je postupak konvertiranja instance klase, strukture ili vrijednosti enumeracije u string. String za
formatiranje sadrži placeholder ({0}) u koji se smješta vrijednost koja se treba prikazati. Element za
formatiranje ima oblik: {index [,alignment] [:formatString]}

Relacije se definiraju kroz navigacijska svojstva klase. To su svojstva tipa druge klase prema kojoj se definira
relacija (navigacija).

Navigacijska svojstva omogućavaju navigaciju u oba smjera (od roditelja prema djetetu i obrnuto) vraćajući ili
referencirani objekt (kardinalnost jedan) ili kolekciju objekata (kardinalnost relacije više).

Kardinalnost se određuje iz brojnosti svojstva. Za više se stavlja da je svojstvo tipa List ili neke druge klase koja
implementira ICollection sučelje.

Code first omogućava i definiranje svih tipova relacija za što se mogu koristiti sva 3 pristupa (konvencije,
podatkovne anotacije i fluent API). Također, zaključuje o relacijama među objektima prema konvencijama na
temelju navigacijskih svojstava. Svako svojstvo koje se zove jednako kao primarni ključ, u drugom entitetu
smatra se stranim ključem. Detekcija stranih ključeva nije case sensitive. Ako je strani ključ nullable, relacija
je opcionalna.

Relacija 1-N je zadana (default) relacija.

Relacija 1-1 je neuobičajena i EF je ne očekuje. Zajebana je jer EF ne može odredit ko je roditelj, a ko dite pa se
takve relacije eksplicitno definiraju korištenjem ForeignKey atributa u klasi koja je dijete. ForeignKey treba
biti jedinstveno svojstvo iz klase roditelj u relaciji (uobičajeno se koristi ključ) i to se svojstvo koristi kao
primarni ključ u klasi djeteta.

Relacija N-M uobičajeno nije podržana u relacijskim bazama. Ovakve relacije se realiziraju asocijativnim
entitetima (međutablicama). EF može obraditi ove relacije, ali trebaju biti definirane sa List (ili bilo kojom
ICollection implementacijom) s obje strane relacije.

Klasa DbContext povezuje konceptualni model domene i fizičku pohranu


podataka. Omogućava postavljanje upita, brisanje, ubacivanje,
ažuriranje podataka radeći sa strogo tipiranim (strongly typed) CLR
objektima koji su instance entiteta modela. Upravlja objektima entiteta
tijekom izvršavanja app, što uključuje popunjavanje objekata podacima
iz baze, praćenje promjena i spremanje podataka u bazu.
Kompleksne tipove podataka u modelu treba definirati kao virtual tipove za podršku lazy loadinga.

Lazy loading je uzorak (design pattern) u programiranju prema kojem se inicijalizacija objekta odgađa sve do
trenutka dok taj objekt nije potreban. Pridonosi efikasnosti programa kada se pravilno koristi. Suprotan
predložak je eager loading. EF podržava lazy loading.

Kada se entitet pročita iz baze, podaci iz relacija nisu dohvaćeni. Dohvaćaju se automatski tek kada se prvi put
pristupa tim podacima. DbContext klasa podržava ovakav način dohvaćanja podataka.

Eager loading je uzorak u programiranju prema kojem se podaci iz relacija dohvaćaju zajedno s osnovnim
entitetom, što se obično realizira jednim join upitom koji dohvaća sve podatke. Ovakav način dohvaćanja
podataka se obično radi pozivom Include metode na osnovnom entitetu.

Explicit loading je (šta i ovi gori) prema kojem se relacijski podaci trebaju dohvaćati eksplicitno u kodu (nije
automatski) što se radi preko object state managera za entitet i pozivom Collection.Load ili Reference.Load.
Obično se koristi kada je lazy loading isključen.

OSM (Object State Manager) je interna komponenta konteksta. Zadužen je za upravljanje promjenama stanja
entiteta, praćenje relacija među entitetima te dodavanje ili brisanje entiteta.

Scaffolding je mehanizam koji omogućava automatsko generiranje osnovnog koda kontrolera i prikaza na
temelju modela na temelju predložaka. Sve zna di šta triba ić: kako će nazvat kontrolere, di ide koji dio koda
koje komponente, di smistit generirane dijelove koda,…

Inicijalizatori baze (database initializers) koriste za to da pri svakom pokretanju app, EF ponovno kreira bazu i
onda je pomoću Seed metode popuni podacima. Ovaj pristup koristi se samo pri razvoju app.

EF Power Tools je alat za vizualizaciju code first modela.

Kontroleri (upravljači) su središnji dio ASP.NET MVC predloška. Odgovaraju na zahtjeve korisnika prema app
(HTTP zahtjevi). Preusmjeravanje dolaznih HTTP zahtjeva se radi kroz mehanizam rutiranja. Kontroler je klasa
koja nasljeđuje klasu System.Web.Mvc.Controller. Uobičajeno je, ali nije obavezno da kontroler koristi
modele podataka i prikaz.

HTTP zahtjev prolazi kroz modul UrlRoutingModule koji odabire prvu


odgovarajuću rutu.

Iz odgovarajuće rute objekt dobiva IRouteHandler objekt koji je kod MVC


app obično instanca MvcRouteHandlera.

IRouteHandler kreira IHttpHandler objekt kojem prosljeđuje IHttpContext


objekt. IHttpHandler je za MVC aplikacije instanca MvcHandler objekta koji
odabire kontroler koji će obraditi zahtjev.

Kontroler izvršava akciju koju je MvcHandler pozvao.

Rezultat akcije prosljeđuje se na prikaz.

Akcije (actions) su metode unutar kontrolera koje se pozivaju preko HTTP zahtjeva. Ne smiju biti statičke i
moraju biti public. Ne mogu imati za parametre neograničene tipove i ne mogu se overloadati.

Neograničeni tipovi (unbounded generic type) su generički tipovi koji sadrže parametar tipa T koji još nije
specificiran (npr. List<T>). Zatvoreni tip je kada je tip specificiran (npr. List<int>).
Zadano je u MVCu da su sve public metode akcije.

Akcija Indeks() je definirana kao osnovna akcija koja će se pozvati ako ni jedna druga akcija nije navedena u
HTTP zahtjevu (npr. http://server/Prazni nije navedena akcija). Obično se povezuju sa samo jednom
korisničkom aktivnošću (npr. klik na link, upisivanje URLa u preglednik,...). Svaka korisnička akcija predstavlja
generiranje HTTP zahtjeva koji se prema URL i definiranim tablicama rutiranja povezuje s akcijom.

Create/ Update/ Delete podataka je operacija sa dva koraka: 1.) Prikaz forme (HttpGet)
2.) Prihvaćanje korisničkog ulaza (HttpPost)

ActionVerbs selector je atribut koji se koristi za definiranje izbora akcija na osnovu metode u HTTP zahtjevu.
MVC podržava ograničavanje izvođenja akcije prema metodi HTTP zahtjeva s: HttpGet, HttpPost, HttpPut,
HttpDelete, HttpOptions i HttpPatch selektorima akcijskih glagola.

ActionResult klasa predstavlja rezultat izvršene akcije, ViewResult je klasa koja generira odgovarajući prikaz.

Prenošenje podataka iz kontrolera u prikaz:

1.) Korištenje modela u prikazu koji se kreira pozivom funkcije View() u kontroleru (strongly-typed view)

2.) Korištenje ViewBag dinamičnog objekta koji je na raspolaganju samo u promatranoj akciji i nema
potrebe za tipiranjem podataka, već sve radi automatski.

3.) Korištenje TempData. Kolekcija tipa rječnik sa string ključevima i objekt vrijednostima. Omogućava
pamćenje podataka od jedne do druge akcije unutar istog ili između dva kontrolera.

Dinamički objekti nisu ograničeni statičkim tipom ili formatom, već se svojstva i metode takvih objekata
određuju prilikom izvođenja koda, a ne prilikom kompajliranja. Definiraju se ključnom riječi dynamic.

Prenošenje podataka iz HTTP zahtjeva u kontroler:

1.) Eksplicitno obrađujući ulazni zahtjev preko svojstva Request u klasi Controller što zahtjeva dosta koda.

2.) Povezivanje modela (Model Binding) je mehanizam koji olakšava prosljeđivanje podataka iz HTTP
zahtjeva u akcije kontrolera automatskim povezivanjem. Imena ulaznih parametara iz HTTP
zahtjeva mapiraju se u parametre akcije po imenu ovim redoslijedom:
1. Podaci s forme (poslani POST metodom)
2. Podaci iz rute
3. Podaci iz upitnog URIja

Bind atribut koristit se za definiranje vlastitog načina povezivanja. Exclude svojstvo atributa Bind sadrži listu
imena svojstava za koje povezivanje nije dozvoljeno, a Include sadrži listu svojstava za koje je povezivanje
dozvoljeno.

Sigurnost web app promatra se na dvije osnovne razine:


- zaštita na app razini, enkripcija podataka unutar app, autentifikacija i autorizacija korisnika
- zaštita na sistemskoj/ mrežnoj razini - VPN, SSL

Osnovni aspekti sigurnosti web app:


- zaštita podataka app od neautoriziranog dohvaćanja/ mijenjanja/ brisanja podataka
- zaštita funkcionalnosti same app
- zaštita od potpunog gubitka podataka
XSS (Cross-site scripting) napad se sastoji od umetanja različitog zlonamjernog klijentskog koda (uglavnom
JavaScript koda) u dinamički kreirane stranice na web serveru.

ModelState je svojstvo kontrolera preko kojeg se mogu dobiti informacije o povezanim podacima.

Filter je mehanizam koji omogućava modificiranje ponašanja akcije tako da omogući kroz mehanizam pipelinea
izvršavanje određene funkcionalnosti nad HTTP zahtjevom prije ili nakon izvršavanja funkcionalnosti akcije.
Vlastiti filteri mogu se definirati kada postoji potreba za izvršavanjem neke funkcionalnosti nad više akcija.
Mogu se postaviti nad pojedinom akcijom ili nad cijelom klasom kontrolera. Mogu biti globalni.

Akcija bez filtera Akcija s filterom

5 tipova filtera: - Autorizacijski filteri - izvršavaju se prije drugih filtera i prije nego što se kod akcije pozove na
izvršavanje. Odnose se na autentifikaciju i autorizaciju.
- Filteri resursa - izvršavaju se nakon autorizacijskih filtera i prije pozivanja modela pa se mogu
koristiti za upravljanje povezivanjem.
- Akcijski filteri - izvršavaju se prije i poslije akcije.
- Filteri rezultata - mogu se izvršiti prije i poslije vraćanja rezultata iz akcije.
- Filteri iznimki - izvršavaju se samo ako je akcija ili drugi filter generirao iznimku.

HandleError koristi se za baratanje iznimkama koje se podižu u akciji, a koje nisu definirane u kodu.
HandleErrorAttribute omogućava definiranje načina obrade iznimki podignutima u akciji. To je inače zadano
tako da MVC prikaže Error prikaz iz ~/Views/Shared.

ValidateAntiForgeryToken je filter koji se koristi za zaštitu app od CSFR (CSFR - cross site request forgeries)
napada. Radi se na app razini korištenjem slučajnih promjenjivih tokena prilikom generiranja i održavanja
sesije logiranog korisnika. CSFR napad je pokušaj da druga web stranica objavi neželjene podatke na našu
stranicu koristeći podatke koji su na prevaru dobiveni od korisnika.

Ovaj mehanizam se implementira tako da server pošalje klijentu HTTP cookie s tokenom, a drugi token koristi
kao hidden u formi. Kada klijent pošalje HTTP zahtjev, ukoliko ne sadrži cookie s odgovarajućom vrijednosti i
hidden token u formi, generira se greška.
Prikaz (pogled) je zadužen za kreiranje sučelja MVC app prema korisniku. Pohranjuje u datoteku s ekstenzijom
.cshtml u Views direktoriju projekta. Views direktorij sadržava jedan direktorij po kontroleru s istim imenom
kao i kontroler. Ime prikaza obično je isto kao i ime akcije u kontroleru koja će pozvati taj prikaz. Prikazima
se ne može direktno pristupati, već se uvijek renderiraju od strane kontrolera koji osigurava podatke za
prikaz.

Mehanizam prikaza (view engine) podržava različite načine za generiranje prikaza MVC app (koji je u biti
HTML kod u kombinaciji s JS i CSS kodom) koji se isporučuju u klijentski preglednik.

Razor sintaksa je markup sintaksa, bazirana na C# programskom jeziku koja omogućava kombiniranje HTML i
C# koda. Znak @ kaže Razor engineu da slijedi C# kod, a on će sam zaključiti kada kod prestaje.

Blok koda (code block) sadrži jednu ili više naredbi ograđenih vitičastim zagradama {}

Varijable se stvaraju korištenjem var naredbe, a vrijednost varijable dohvaća se s @ImeVarijable.

var je ključna riječ pri deklaraciji varijable. Automatski definira tip varijable prema tipu s desne strane znaka
jednako. Ovo je implicitni način definiranje tipa, za razliku od uobičajenog eksplicitnog s navođenjem tipa.
Prilikom deklaracije varijabli se odmah pridjeljuje vrijednost. Obično se koristi u LINQ upitima i za kreiranje
anonimnih tipova.

Povezivanje kontrolera i prikaza pozivom funkcije View:

- Klasa Controller ima ViewData svojstvo koje je instanca klase ViewDataDictionary koje služi za postavljanje
ili dohvaćanje rječnika (dictionary) za prikaz. ViewBag sadrži iste podatke kao i ViewData samo se s
njima lakše radi.
- ViewDataDictionary ima svojstvo Model koje se postavlja na onaj objekt (ili kolekciju) koji predamo pozivu
metode View prilikom kreiranja prikaza.
- Klasa WebViewPage ima svojstvo Model koje poprima rječnik iz kontrolera.
- @model direktiva u prikazu specificira tip objekta koji se predaje prikazu preko Model svojstva.
- radi IntelliSense

Povezivanje kontrolera i prikaza dinamički:

- koristi se kada se prikaz neće uvijek povezati s istim modelom.


- @model direktiva sadrži ključnu riječ dynamic.
- IntelliSense ne radi
- lambda izrazi nisu podržani

Views/Shared direktorij sadrži prikaze koji su zajednički (npr. prikaz greške, raspored prikaza svih stranica).

Rasporedi prikaza (layout) pomažu održavati konzistentnost izgleda unutar više prikaza u app. Obično se
koristi za definiranje zajedničkog predloška za app.

Povezivanje pojedinog prikaza s layoutom se radi automatski preko _ViewStart.cshtml prikaza koji u sebi sadrži
referencu na zadani layout. Razor mehanizam će izvršiti kod te datoteke prije ostalog koda unutar tog
direktorija što znači da se _ViewStart.cshtml izvršava prije prikaza koji je pozvan.

RenderBody() metoda u rasporedu prikaza se koristi za iscrtavanje sadržaja koji se povezuje s rasporedom
prikaza, a nije naveden u imenovanim sekcijama i obavezna je u rasporedu prikaza.
RenderSection(name, [required]) metoda u rasporedu prikaza omogućava iscrtavanje samo dijelova iz prikaza
koji se povezuje s rasporedom prikaza u kojem se koristi. Možete koristiti više sekcija.

Parcijalni prikazi se koriste ako postoji isti HTML sadržaj koji treba biti prikazan na više mjesta. Imenuju
znakom _ na početku imena. Ne mogu se prikazivati samostalno, već se prikazuju unutar nekog drugog
Viewa. Uključivanje parcijalnog prikaza u drugom prikazu radi se s @Html.Partial pomagačem (helper).

HTML pomagači (helpers) su metode koje se mogu pozvati na svojstvu Html (tipa klase HtmlHelper) u prikazu.
Namijenjeni su olakšavanju pisanja prikaza minimizacijom C# koda u HTMLu. Za rezultat generiraju HTML
kod. Postoje još i URL i AJAX pomagači.

Prema namjeni dijele se na: - akcijske pomagače - vezani uz akcije kontrolera (ActionLink)
- pomagače prikaza - olakšavaju prikazivanje podataka modela (DisplayFor)
- Begin Form pomagače - generiraju forme (BeginForm Method)
- pomagače za editing - stvaraju polja za unos podataka (EditorFor)
- validacijske pomagače - po pravilima modela stvaraju JS kod za validaciju
(ValidationSummary)

Dijele se još na pomagače koji se koriste s dinamičkim prikazima i strongly-typed prikazima.


(ima još ponešto o svakom od pomagača u prezentaciji, ali to nisan zapisala)

Responzivni dizajn je inteligentno prilagođavanje prikazanog sadržaja različitim dimenzijama ekrana. Podržan
je u svim verzijama ASP.NET MVCa kroz Bootstrap framework.

Bootstrap je web frontend framework, tj. okružje za razvoj sučelja web app prema korisniku, napisan u CSSu i
JavaScriptu. Prednosti su responzivni dizajn, podrška teme prikaza i gotove komponente.

Bundling je mehanizam koji grupira više datoteka u zajedničku kolekciju ukoliko se radi o datotekama
povezanih funkcionalnosti (obično JS ili CSS) koje će se onda dohvaćati preko samo jednog HTTP zahtjeva od
klijenta kao jedinstveni resurs. Ovo je prednost jer klijent šalje samo jedan HTTP zahtjev čime se ubrzava
dohvaćanje sadržaja s web servera.

You might also like