Iskustva Grupe Memleak+: Studenti: Mirza Derviševid Nedim Šrndid Emir Pandžo Mladen Drmač Benjamin Kapetanovid
Iskustva Grupe Memleak+: Studenti: Mirza Derviševid Nedim Šrndid Emir Pandžo Mladen Drmač Benjamin Kapetanovid
net MVC
Iskustva grupe memleak+
Studenti: Mirza Dervievid Nedim rndid Emir Pando Mladen Drma Benjamin Kapetanovid Strana | 1
Sadraj
Sadraj ................................................................................................................................................2 Uvod ...................................................................................................................................................3 Asp.net MVC .......................................................................................................................................4 Procesiranje jednog zahtjeva ..............................................................................................................5 Asp.net MVC - Model .........................................................................................................................6 Odabir Database ORM-a: Entity framework vs LinqToSql vs NHibernate ..........................................6 Komparacija EF1, LinqToSql i NHibernate ORM-ova.........................................................................7 Bududnost .......................................................................................................................................7 Asp.net MVC - View ...........................................................................................................................8 Asp.net MVC - Controller ................................................................................................................. 11 Iskustva i problemi .......................................................................................................................... 12 Versioning baze: .......................................................................................................................... 12 Verzije SQL Servera: .................................................................................................................... 12 Entity Framework vs. Linq2SQL: ................................................................................................ 12 Koritenje razvojnog servera: ..................................................................................................... 12 Timski rad:................................................................................................................................... 13 ASP.NET MVC Framework: ......................................................................................................... 13 SVN klijenti: ................................................................................................................................. 13 JavaScript i MVC: ......................................................................................................................... 13 Deployment Asp.net MVC na IIS 6 serveru (Windows server 2003)................................................ 14 Software Design Patterns .................................................................................................................. 15 Model-View-Controller (MVC) Architectural Pattern ..................................................................... 15 Iterator Pattern ............................................................................................................................. 16 Factory Method ............................................................................................................................ 16 Lazy Initialization .......................................................................................................................... 16 Object Pool ................................................................................................................................... 16 Null Object .................................................................................................................................... 16 JavaScript Frameworks ..................................................................................................................... 17 jQuery Framework .................................................................................................................... 17 jNice.......................................................................................................................................... 18 Prototype Framework ............................................................................................................... 19 ScriptAculoUs ............................................................................................................................ 19 ASP.NET MVC i JavaScript.............................................................................................................. 21 Strana | 2
Uvod
Odabir teme za ovaj projekt bio je teak zadatak. Ideje koje smo razmotrili prije DevNet aplikacije su: Online code editor - online editor, slian google docs, koji je optimiziran za programiranje i omogudava real time simultanu kolaboraciju. Od ovog projekta smo odustali jer svi lanovi tima nisu smatrali da je ovaj projekat koristan i smislen. Online advanced clipboard server - Razvoj web i desktop aplikacije za napredni clipboard. Od ovog projekta smo odustali jer se sama ideja nije dovoljno sviala svim lanovima tima. Blog engine - razvoj blog engine-a slian wordpress-u. Od ove ideje smo odustali jer su lanovi tima glasali za temu DevNet. Druga bitna stvar je bila izbor tehnologije. Interesovanja lanova tima su dosta razliita, pa j e bilo potrebno pronadi tehnologiju koja je dovoljno zanimljiva i korisna za savladavanje, i koja nije previe poznata to vedem broju lanova. Na prijedlog kolege Emira, kao odgovor se nametnuo ASP.NET MVC framework. Glavni razlog za koritenje ASP.NET MVC-a je to to radi dosta nisko, moemo raditi u jeziku koji svi poznajemo (C#), i imamo priliku nauiti koristiti jedan novi, mlad framework, ije bi se poznavanje u bududnsti moglo jo bolje iskoristiti. Uz to, odluili smo koristiti sve popularnije Jav aScript framework-e. jQuery i prototype su se pokazali kao odlian izbor za custom ajax komponente koje smo razvijali, ovi frameworci dosta olakavaju razvoj iz perspektive to adresiraju mnoge probleme kompatibilnosti razliitih browsera.
Strana | 3
Asp.net MVC
ASP.net MVC je Microsoftov open source framework za razvoj web aplikacija. ASP.net MVC je baziran na MVC patternu (Model-View-Controller) koji razdvaja Model, View i Controller. ASP.net MVC je framework je baziran na ASP.net frameworu, ali ne koristi WebForms tehnologije. ASP.net MVC osnovne osobine: Kompletna kontrola nad HTML-om AJAX integracija (jQuery, script.aculo.us, ...) Razdvajanje oblasti (Model, View, Controller) Lake odravanje aplikacije tokom vremena Testabilnost arhitektura pogodna za test driven development Podrka za iste linkove
Strana | 4
Rutiranje
Kontroler
2 5
Pogled
Model
Podaci
Asp.net mvc request response model je neto kompleksniji u realnosti. Postoje dodatne komponente koje nisu prikazane dok su odreene navedene komponente opcionalne. Npr., Defaultni View engine (ili template language u terminologiji drugih platformi) je u potpunosti zamjenjiv sa drugim engine-ima. Postoje odreeni open source projekti koji mogu zamijeniti ViewEngine uz odreeni nivo konfiguracije. Takoer, Model komponenta u ASP.net mvc projektu je opcionalna. Programer nije prisiljen da je koristi (to moda npr. ima smisla za neke stateless web servise) dok prilikom koritenja iste ima veliku slobodu odabira tehnologija. Mogude je koristiti LinqToSql, EntityFramework, Nhibernate kao dio modela za pristup bazama podataka ili koristiti model koji uopte ne mora biti baziran na paradigmi relacionih baza podataka (npr. CouchDB, MongoDB, Amazon SimpleDB)
Strana | 5
NHibernate projekat nismo odabrali jer mu nedostaje podrka za LINQ upite, koji znaajano ubrzavaju i pojednostavljuju razvoj (prvenstveno zbog comile time sintaksne provjere upita i jednostavnijeg refactoringa) Incijalno smo eljeli koristiti napredni object relational mapping framework Microsoft Entity Framework koji podrava naslijeivanje entiteta i relacije. EF je veoma kompleksan framework i omogudava kreiranje modela koji za storage moe koristiti tabele i stored procedure koje ne odgovaraju modelu. Za premotavanje ovih razlika koristi se structural mapping. Takoer, EF ima podrku za vie razliitih baza podataka ukljuujudi MSSQL, Oracle, PostgreSQL i MySQL. Nakon odreenih problema sa EntityFrameworkom (mnoge jednostavne operacije nisu implementirane), odluili smo se ipak za LinqToSQL ORM. LinqToSQL ORM je veoma jednostavan i brz za koritenje. Krivulja uenja postoji, ali je znaajno manja u odnosu na vede ORM-ove kao to su EF i Nhibernate. Postoje znaajna ogranienja kao to su manjak podrke za naslijeivanje, ali mi smo smatrali da je LinqToSql ORM iji TradeOff najvie odgovara potrebama naeg projekta.
Strana | 6
Entity Framework 1 Prednosti: LINQ Podrka za vie baza podataka Podrka za naslijeivanje Mane: Prekomplikovan Prevelik overhead Neke jednostavne stvari nisu implementirane Zakljuak: Previe kompleksan, fale mnoge stvari
LinqToSql Prednosti: LINQ SQL upiti veoma optimizirani za MSSQL Mane: Bez podrke za druge baze podataka Nema naslijeivanja entiteta TablePerClass pattern Zakljuak: Brz agilan i jednostavan ORM
NHibernate Prednosti: Open source Odlina podrka za vie baza Podrka za naslijeivanje 3rd party alati Mane: Nema LINQ Krivulja uenja Konfiguracija Zakljuak: Odlina open source alternative bez dobre podrke za LINQ
Budunost
Entity framework 2 se trenutno nalazi u beta stanju razvoja. Mnoge mane i problemi koji su pratili Entity Framework 1 su rijeeni. Verzija 2 ovog frameworka donosi nove feauture kao to su LazyLoading (ili DefferedLoading), podrka za generisanje baze podataka iz konceptualnog modela, POCO (Plain Old CLR Object) i sl. Linq to Sql je projekat koji se nede vie znaajno razvijati, ali de nastaviti da bude podran od strane Microsofta u smislu ispravljanja bug-ova greaka i sl. NHibernate projekat de uskoro dobiti provider za LINQ (ovaj projekat je trenutno u ranoj beti razvoja). FluentHibernate je projekat koji treba da pojednostavi konfiguraciju Nhibernatea i smanji krivulju uenja.
Strana | 7
Naziv kontrolera, bez kljune rijei Controller (BlogPost), i akcije (Index) nam govori da demo za izvrenje ove akcije u address bar naeg browsera trebati upisati BlogPost/Index. Ovakav zahtjev de, u zavisnosti od permisija, vratiti ili defaultni view (prilikom kreiranja, view se vee za odreenu akciju), ili Error view, koji koristimo za prikaz greaka. Sam view je u sutini HTML ili XHTML dokument koji moe sadravati i skripte. Struktura view-a je pokazana na primjeru view-a koji prikazuje listu blogova (rezultat Index akcije). Pojedini dijelovi su skradeni zbog itljivosti:
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<IEnumerable<DevNet.Controllers.Blo gPostViewModel>>" %> <h2>Blog aggregator</h2> <table> <% foreach (var item in Model) { %> <tr> <td> <span id="blogTitleLink"> <b><%= Ajax.ActionLink(item.Title...);</b> </span><br /> <i><%= Html.Encode(item.blogPost.DateTime)) %></i> </td> </tr> <tr> <td> <%= Html.Encode(item.blogPost.Entry.Substring(0,200) %> </td> </tr> <tr>
Strana | 8
<td> Tags: <%= Html.Encode(item.Tags)%> </td> </tr> <tr> <td> Response.Write(Ajax.ActionLink( "(Edit)", "Edit", new { id = item.blogPost.Id }, new AjaxOptions { UpdateTargetId = "blogHandler" } )); } %> </td> </tr> <% } %> </table>
U listingu moemo vidjeti standardne stvari koje se prikazuju na view -u. Pored obinih HTML tagova, imamo mogudnost da koristimo skup objekata koji smo poslali view -u, sadranih u varijabli Model. Model implementira IEnumerable interface, pa moemo koristi ti iterator da dobijemo pojedine objekte i njihove atribute. Na osnovu direktive Inherits koju navodimo na poetku view -a, ASP.NET MVC zna kakve objekte da oekuje. U ovom sluaju radi se o strongly -typed nainu kreiranja odreenog view-a. Prilikom pregledanja ovog isjeka, mogu se primijetiti jo dvije zanimljive stvari. Prva je vezana za Model, kod kojeg se postavlja pitanje kako prikazati podatke koji nisu vezani za jednu vrstu objekata (u naem sluaju imamo jedan blog post i tagove koji su mu pridrueni). Rjeenje je dato u vidu ViewModela, koncepta po kojem imamo mogudnost da kreiramo custom Modele za pojedini view, i tako olakamo posao prikazivanja najrazliitijih vrsta podataka.ViewModel je zapravo klasa kojoj kao atribute podesimo tipove objekata koje elimo imati, i instanciramo jednu ili niz ovih klasa u akciji kontrolera, nakon ega jednostavno proslijedimo skup objekata do view-a. Druga stvar koja je vezana za prikaz je koncept PartialView-ova i Ajax.ActionLink metode. Koritenjem navedenih stvari mogude je dobiti AJAX na naoj stranici bez odstupanja od ASP.NET MVC paradigme. PartialView je po strukturi jednak obinom view-u, razlika je jedino u baznoj klasi. Dok kod view-a imamo nasljeivanje ViewPage kontrole:
Inherits="System.Web.Mvc.ViewPage,
kod partial view-a, kao to smo vidjeli, imamo nasljeivanje ViewUserControl kontrole:
Inherits="System.Web.Mvc.ViewUserControl
Samo ime govori da se partial view moe iskoristiti kao dio drugog view-a ili partial view-a , na sljededi nain:
<div id="blogList" class="blogListNew"> <% Html.RenderPartial("BlogPostList"); %> </div> <div id="blogHandler" class="blogHandler"> </div>
Strana | 9
Poto PartialView ini samo dio jedne stranice u browseru, ovime dobijamo dobru osnovu za implementaciju AJAX funkcionalnosti. Ostatak je dat Ajax.ActionLink metodom, kojom moemo pozvati eljenu akciju bilo kojeg kontrolera, i, koritenjem AjaxOptions -a, definisati eljeno ponaanje nakon izvrenja requesta. Svakako najzanimljivija opcija je UpdateTargetId, koja nam omogudava da zadamo id HTML taga koji de se update-ovati nakon to se request izvri. Time postiemo refresh samo jednog dijela stranice, to je viestruko korisno. Potencijalni problem kod ovog pristupa predstavlja injenica da se svi partial view -ovi ipak nalaze na jednom view-u, a on u Inherits direktivi moe imati samo jedan model. To znai da moemo imati problema ako na jednoj stranici imamo vie PartialView-ova koji primaju razliite modele. Jedno od mogudih rjeenja bi bilo kreiranje custom ViewModel -a koji bi sadravao sve ono to je potrebno svim PartialView-ovima, ali to rjeenje je nepraktino jer zahtijeva izmjenu ViewModela svaki put kad se na stranicu doda novi PartialView. Rjeenje do kojeg smo doli je kreiranje statikih metoda u kontroleru, i pozivanjem tih metoda prilikom poziva Html.RenderPartial metode:
<% if (Request.IsAuthenticated) Html.RenderPartial("../News/Index", DevNet.Controllers.NewsController.GetNewsData (this.Context.User.Identity.Name)); %>
Ovo rjeenje je praktinije i fleksibilnije jer postiemo reusability kakav ne bismo imali sa prethodno opisanom metodom. Jo demo spomenuti da je prilikom poetnih dogovora postojala diskusija vezano za nain implementiranja AJAX funkcionalnosti (PartialView i Ajax.ActionLink VS jQuery), i da je odlueno da se isprobaju obe opcije, nakon ega lanovima tima ostaje sloboda izbora naina implementacij e.
Strana | 10
Funkcionalnost GET i POST metoda unutar kontrolera se obavlja koristedi usku interakcijom sa modelima, pogledima te sa bazom podataka. Standardna metoda uobiajne GET metode nekog kontrolera ukljuduje slijedede korake: Prikupljanje informacija o trenutnom korisniku, te provjera prava pristupa nekom sadraju Prikupljanje podataka potrebnih podataka iz baze koristedi LinkToSQL Prikupljeni podaci se eventualno filtriraju Prikupljene podatci se smjetaju u model te se taj model alje pogledu
Svaki od kontrolera sadri runo razvijene metode kontrole pristupa. Zavisno od akcije postoje postoje dvije potrebne provjere (metode): Provjera pristupa za pregled sadraja: Ova metoda provjerava da li je korisnik koji vri akciju vlasnik sadraja ili lan grupe prijatelja. 1. Provjera pristupa za promjenu sadraja: Ova metoda doputa akciju samo ako je vrilac akcije vlasnik sadraja. Pored navedenih metoda, odreeni kontroleri sadre jo jedan bitan element, a to je custom ViewModel. Ako se vratimo na primjer Projects kontrolera, bila je potreba da se kreira ProjectViewModel koji je za razliku od autogenerisanog ProjectsModela sadravao i listu njegovih tagova i sve komentare.
Strana | 11
Iskustva i problemi
Versioning baze:
Kada smo poeli razvoj, odluili smo se za spiralni pristup. To je znailo da de i baza biti razvijana kako se projekat iri. Meutim, nismo uspjeli pronadi hosting za bazu, pa je svako od nas imao "svoju verziju" baze lokalno. Kada bi se desila izmjena strukture baze, osoba koja je izmjenu napravila poslala bi svoju verziju datoteke baze ostalima putem email-a. Ovo nam je stvorilo niz problema. Podaci su bili nekonzistenti svako je imao drugaije korisnike, blogove i dr. u svojoj bazi. Kada bi promijenili strukturu baze, dio koda, esto i tueg, se ne bi kompajlirao. Takoer, zbog naina na koji se u ASP.NET vri autentikacija korisnika, morali smo imati dvostruke podatke o korisnicima, u dvije odvojene tabele, dakle baza nije bila normalizirana. I ovo je doprinijelo pojavljivanju suptilnih greaka.
Strana | 12
Timski rad:
Dva lana tima su zaposlena, te esto nisu bila u stanju da prisustvuju sastancima tima. Zbog toga smo imali problema u usklaivanju ciljeva i ideja za rad na projektu. Komunikacija je bila oteana. Smatramo da isto online lanstvo u timu nije dovoljno za produktivan rad. Pri sastavljanju tima, svi lanovi nisu imali isti cilj uestvovanja.
SVN klijenti:
Dio tima je koristio AnkhSVN, koji podrava integraciju u VS2008 i "pametan je" (zna koje datoteke su dio projekta, a koje ne treba commitati), dok je drugi dio tima koristio "univerzalni" klijent, TortoiseSVN, koji nema ovu opciju. Iz ovog razloga, esto su se deavali problemi sa SVNom.
JavaScript i MVC:
Koritenje JavaScript u okviru View-ova naruava MVC pattern. Iako ovo nije predstavljalo znaajan problem pri praktinom radu, eventualno daljnje unaprjeenje aplikacije bi moglo biti tee zbog nerazdvajanja modela, pogleda i kontrolera.
Strana | 13
Strana | 14
Kontroleri u ASP.NET MVC predstavljaju C# klase, jedna klasa po stranici, koje imaju metode razliitih imena, zavisno od funkcionalnosti koju elimo postidi. Tako moemo imati kontroler Profile za rad sa korisnikim profilima, koji ima metode Details za pregled, Edit za promjenu, Create za kreiranje i Delete za brisanje profila.
Strana | 15
Iterator Pattern
Koristili smo Iterator pattern, ugraen u C#, za iteriranje nad kolekcijama razliitih tipova. Jedan od primjera jeste kretanje kroz kolekciju objekata koju dohvatimo iz baze pomodu Linq2SQL:
Moemo primijetiti da se listanje objekata u kolekciji kb radi pomodu foreach petlje, koja koristi iteratore. Tipovi koji nasljeuju iz interfejsa IEnumerable mogu da koriste iteriranje.
Factory Method
Factory method pattern smo koristili da kreiramo objekte. Jedan primjer je kreiranje objekta tipa DevNetDataContext:
DevNetDataContext predstavlja model podataka u bazi. Koristedi factory pattern lako smo kreirali instancu modela. Ovaj primjer factory patterna je sastavni dio ASP.NET MVC framework-a.
Lazy Initialization
Za pristup podacima koristili smo Linq2SQL, koji koristi lijenu inicijalizaciju, tako da sve podatke koje koristimo on uitava tek kada ih prvi put upotrijebimo.
Object Pool
Object pool pattern dozvoljava nam da izbjegavamo skupe alokacije i brisanja resursa tako to reciklira objekte koji se vie ne koriste. Ovaj dio posla je ugraen u sam .NET framework, tako da se nismo morali posebno truditi da implementiramo Object pool pattern.
Null Object
Koristili smo ugraene .NET null vrijednosti za pojedine tipove, kao to su String.Null i drugi.
Strana | 16
JavaScript Frameworks
Koritene su dva popularna JavaScript framework-a: jQuery (JSON i jNice) Prototype
jQuery Framework jQuery je JavaScript framework koja pojednostavljuje pristup HTML objektima, podrava upravljanje dogaajima (event handling) za sve objekte ukljuujudi i sam dokument te posjeduje veliki broj dodatnih plugina. Framework sam i ne bi bio toliko znaajan da iza njega ne stoji veliki OpenSource community koji svakodnevno unaprijeuje i razvija nove plugine. Neki od jQuery plugina se mogu svrstati u kategorije: Ajax, Animation & Effects, DOM, Drag&Drop, Events, Forms, Layout, Media, Menus, Navigation, Tables, Widgets i mnogi drugi. Koristedi se ovim dodacima od statike Web stranice se moe napraviti izuzetno dinamiki glatka interaktivna stranica. Definisanje plugina na dokumentu se vri unutar head skecije i jednostavno je ukoliko se ne koriste drugi JavaScript Frameworks. JavaScript sintaksa je sljededa:
<script type="text/javascript" src="jquery.js"></script>
S obzirom da se svakodnevno objavljuju novije i stabilnije verzije kao i popravke za kompatibilnost novih verzija pretraivada, vremenski je zahtjevan posao vriti redovan update. Iz tog razloga Google je ponudio interfejs pomodu kojeg se mogu definisati najaktuelnije stabilne verzije svih popularnih frameworka vrlo jednostavno.
Sintaksa je sljededa: <script src="http://www.google.com/jsapi"></script> <script> // Load jQuery google.load("jquery", "1"); </script>
Prva linija uitava Google JavaScript API dok druga inicira uitavanje jQuery -a. jQuery oficijelni Web Site takoer nudi mogudnost linkovanja biblioteke sa njihovog site -a:
<script src="http://code.jquery.com/jquery-latest.js"></script>
Strana | 17
Pogledajmo kako se pomodu jQuery uitava JSON sadraj preko nekog Web Servisa:
jQuery.getJSON(source, function(data){ jQuery.each(data.items, function(i,item){ //Obradi 'item' }); });
jQuery koristedi se AJAX-om preuzima JSON sadraj sa URL-a iz varijable 'source', a blok jQuery.each blok se izvrava za svaku stavku iz primljene JSON strukture. Na ovaj nain smo prikupili podatke o WorkExperience-u korisnika na njihovom profilu i WorkXP kartici. Pogledajmo kako se preuzimaju podaci preko Ajax jQuery klase:
var url = 'http://www.adresa.com/servis'; new Ajax.Request(url, { method: 'get', onSuccess: function(transport) { var data = transport.responseText; alert(data); } });
Ovaj primjer preuzima podatke sa web servisa i prikazuje poruku sa sadrajem tih podataka. jNice jNice je jQuery plugin za prilagoavanje izgleda formi vlastitim potrebama. Plugin funkcionie tako to nakon svoje deklaracije pretrai kompletan dokument po zadanom kriteriju (obino po imenu css klase) i sve pronaene objekte modificira po predefinisanom kriteriju. Problem se javlja ako je forma dodana (addChild) na dokument nakon uitavanja i izvravanja jNice skripte ili ukoliko forma nema podeenu odgovarajudu klasu. Problem se rjeava tako to se nakon kreiranja svih objekata, izvri odgoena JS funkcija koja de pretraiti sve HTML objekte i promijeniti klasu onima kojima elimo izmijeniti izgled. Nakon toga moemo inicijalizirati jNice plugin. U naem projektu, ovo je implementirano na dnu Site.Master-a.
Strana | 18
Prototype Framework
Drugi podjednako popularan i koristan framework koji ima veliki community i bogat skup biblioteka koje su bazirane na njemu. Prototype ima za glavni cilj olakati razvoj web aplikacija. Najpoznatija JavaScript biblioteka, Script.aculo.us je bazirana upravo na Prototype-u. Ostali pluginovi se, slino jQuery-u, mogu svrstati u kategorije Ajaxa, Animation & Effects, Charts, Data, DOM, Drag and Drop, Events, Extensions, Forms, Media, Menus, Tables, GUI, Utilities, Widgets, Overlays i mnogi drugi. Prototype se na dokument stavlja na sljededi nain:
On sadri sljedede komponente: Animation framework Drag & Drop Ajax controlls DOM Utilities
Strana | 19
Osnovne komponente Animation Framework-a se nalaze u klasi Effect koja sadri izmeu ostalog i Queues, Appear, BlindDown, BlindUp, DropOut, Fade, Fold, Grow, Move, Puff, Scale, ScrollTo, SlideUp, SlideDown, i mnoge druge efekte. Kako biste koristili bogat skup klasa ove biblioteke potrebno je da je deklariete u dokumentu na sljededi nain:
Primjetite znak dolar ($). Ovo je isto zamjena za document.getElementById('objekat') uz dodatne sigurnosne uslove koji se nalaze unutar samog frameworka. Neznatno je sporiji od izvorne JavaScript funkcije. Primjer iznad uzima HTML istoimeni objekat i poziva efekat Pulsate koji de da uradi dva puta brzi FadeOut i FadeIn na tom objektu. Drugi primjer (koriten u naoj web aplikaciji) je postepeno otkrivanje eljenog objekta (u naem sluaju tipa 'DIV' sa nazivom 'divTagovi':
new Effect.BlindDown('divTagovi');
Potrebno je napomenuti da i jQuery i Prototype imaju zajedniku osobinu da koriste simbol $ kao funkciju koja na osnovu ID-a vrada [HTML Object] bilo kojeg tipa. Upravo ovo predstavlja njihov veliki konflikt i razlog za est glavobolju. Naime, da bi ova dva plugina mogla na istoj stranici funkcionisati istovremeno, potrebno j e razrijeiti konflikt na sljededi nain:
<script src="prototype.js"></script> <script src="jquery.js"></script> <script> jQuery.noConflict(); </script>
Najprije se pozove Prototype a nakon toga jQuery te jQuery-ova funkcija za NoConflict koja rjeava preklapanje klasa i funkcija izmeu Prototype-a i jQuery-a. Postoje i druge konvencije za rjeavanje konflikta ali se ova oficijelno preporuuje.
Strana | 20
Pored navedenih, vedina biblitoeka posjeduje i svoje kompresovane ekvivalente zbog breg downloada i manje potronje bandwidth-a.
DevNet koristi ASP.mvc kako bi se vrio unos i izmjena podataka o korisnikim iskustvima (User Work Experience). Koristedi se MVC View-om, Javascripti se preko Input polja prosljeuje ID korisnika. jQuery preko JSON-a prikuplja Work Experience za dati UserID za Model koji je prosljeen preko View-a koristedi definisani WebServis. Javascript tada generie eXepreinece TimeLine i za svaki Item iz JSON pretrage. U svakoj iteraciji proraunava opseg TimeLine -a i odreuje tanu poziciju 'div' HTML elementa. Ovaj element je apsolutno pozicioniran na dokumentu, a relativno u odnosu na TimeLine objekat. Ukoliko je za neki WorkExperience povezan i Projekat kojim se korisnik bavio, odgovarajudi link se prikazuje u sredinjem dijelu prozora skupa sa ostalim informacijama o eXperience-u. Scriptaculous animation framework ini kompletan pregled da bude smooth. Centralni objekat (div) se otvara koristedi BlindDown kao i lijevi floating-div sa listom angamana. Svaki angaman na timeline pulsira on click, itd.
Strana | 22