Tecnologie emergenti per lo sviluppo di web applications: il caso di Ruby on Rails e AJAX
1. UNIVERSITÀ DEGLI STUDI DI MILANO
Facoltà di Scienze Matematiche, Fisiche e Naturali
Dipartimento di Tecnologie dell’informazione
Corso di laurea in Informatica
Tecnologie emergenti per lo sviluppo di Web Applications:
il caso di Ruby on Rails e AJAX
Candidato
Relatore
David Saitta
PROF. Marco Cremonini
Anno Accademico 2004/2005
2. Sviluppo di Web Applications
• Framework che implementano • UI Statiche
solo alcuni aspetti Le azioni dell’utente non modificano
la struttura della pagina corrente
• È necessario integrare con altri
• Usabilità limitata
framework, spesso non progettati
per lavorare insieme no drag-n-drop, no feedback immediato,
no componenti complessi e interattivi
• si perde tempo di sviluppo
• Request/Response
• Molti framework forniscono
Ogni azione dell’utente verso il server
funzionalità ma non un percorso (link, invio form) richiede un reload
logico e chiaro di utilizzo della pagina
3. Tecnologie Emergenti
AJAX
AJAX
on Asynchronous
Ruby on Rails JavaScript
RAILS And XML
• Struttura chiara
• basato sul pattern Model-View-Controller
• UI Interattive
• Ogni componente ha un suo posto preciso
La pagina si evolve per rispecchiare le
azioni dell’utente
• Full-stack Framework
• Singolo progetto omogeneo, tutti i
• Maggiore usabilità
componenti interagiscono pienamente tra
di loro supporto per il drag-n-drop, effetti grafici,
componenti complessi e interattivi
• Tempi di sviluppo ridotti
• No Refresh
• le modifiche vengono propagate subito
Per comunicare con il server non
• sviluppatori impegnati nel porting di
occorre il reload della pagina.
applicazioni professionali testimoniano come
(Async Request/Response)
abbiano scritto meno codice in Rails che
per i file di configurazione XML di Java
Hibernate/Struts e Tomcat
4. Ruby on Rails
• Ruby
• Linguaggio interpretato Object-Oriented stile Smalltalk
• Dinamico
Ruby on Rails
• Estendibile a runtime (reflection/metaprogramming)
• Unico linguaggio per tutti i livelli del framework HTTP, RSS, AROM,
•
SOAP
DRY: Don’t Repeat Yourself Apache, WeBrick or
Lighttpd
Requests
• Le definizioni devono essere fatte una Web Server
sola volta, in un posto specifico Invokes FastCGI,
• tree delle directory standard Forwards mod_ruby or SCGI
•
XHTML, CSS, JS,
“Convention over images, XML
Dispatcher
Responds
Configuration” Displays Handles validations
Loads
• ridurre la configurazione in favore Action CRUDs
Renders
View
delle convenzioni di comportamento Active
Controller
Record
• personalizzabile: configurare solo Responds
Delegates
ciò che non è convenzionale Action Data or
Queries
• es: nel modello classe User è associata Errors
WebServices
di default alla tabella users Redirects
Delivers
SQLite,
XML
Database
PostgreSQL,
Action MySQL, Oracle,
Mailer MSSql, ODBC
5. [M] Active Record
person = Person.new(attrs)
• Mapping
person.save # INSERT
person.name = “David”
(Don’t Repeat Yourself)
person.save # UPDATE
classi (Person) ➟ tabelle (People) person.destroy # DELETE
attributi ➟ colonne Project < ActiveRecord::Base
• •Associazioni
has_many :milestones
has_one :project_lead
belongs_to :company
Relazioni uno-a-uno, uno-a-molti, molti-a-molti
• project.has_milestones?
Complesse (tree, liste, single-table inheritance)
• project.create_project_lead
CRUD (Create, Retrieve, Update, Delete) project.company.name
• Caching
if post.save
• Validatori
# passed validation
else
post.errors.count
post.errors.on(“title”)
Standard, Custom, save/create/update post.errors.each { |e| e }
• Callbacks
end
Post < Active Record::Base
has_many :comments
Eventi generati prima e dopo save/create/update/destroy
def before_destroy
comments.destroy_all
end
end
6. [M] Active Record
Order.hbm.xml
JAVA/Hibernate <hibernate-mapping>
<class name=quot;models.Orderquot; table=quot;Ordersquot;
dynamic-update=quot;truequot; dynamic-insert=quot;falsequot;
Order.java
discriminator-value=quot;nullquot;>
public class Order
<id name=quot;idquot; column=quot;idquot; type=quot;java.lang.Longquot;
{
unsaved-value=quot;nullquot;>
private Set items;
<generator class=quot;identityquot;/>
private String name;
</id>
private Long id;
<set name=quot;itemsquot; lazy=quot;falsequot; inverse=quot;falsequot;
cascade=quot;nonequot; sort=quot;unsortedquot;>
public Long getId() { return id;}
<key column=quot;idquot;/>
public void setId(Long id){ this.id = id;}
<one-to-many class=quot;models.Itemquot;/>
</set>
public Set getItems() { return items;}
<property name=quot;namequot; type=quot;java.lang.Stringquot;
public void setItems(Set items) { this.items = items; }
update=quot;truequot; insert=quot;truequot;
public String getName() { return name; }
access=quot;propertyquot; column=quot;namequot;/>
public void setName(String name) { this.name = name; }
</class>
}
</hibernate-mapping>
order.rb
Rails class Order < ActiveRecord::Base
has_many :items
end
7. Action Controller
Action Controller
[C] Action Controller
• Actionsinsteadinstead of object, shared helper methods
ctions grouped in controller
grouped in controller
ction Action as method of object, shared helper methods
as method
• Rendering
• Assigns and codes codes
Actions
endering
def display
@customer = display
def
• @customer =
Customer.find(@params[“id”])
Le azioni sono metodi del Controller Customer.find(@params[“id”])
ssigns •and status status end
es: in Java/Struts ogni azione è una classe
che estende end
Action, un file XML descrive il mapping delle def update
action
def update
if person.save
•Path, Action,Action, Controller
•Rendering immagini)
if person.save
edirection
redirect_action “display”
Redirection
redirect_action “display”
else
else
render “customers/edit”
•HTML/XML/RAW(es: render “customers/edit”
end
rl, Url, Path, Controller end
•Redirection
••Filters seperation of concerns
FrontpageController
ilters Path, Action, Controller
• FrontpageController
Filters
before_filter :cache
Url, after_filter :compress :cache
before_filter
after_filter :compress
rocessing chain, chain, seperation of concerns WebserviceController
Processing WebserviceController
before_filter :token_auth
before_filter :token_auth
•PossibilitàAuthentication, Caching,
Before: Authentication, Caching, e l’output Auditing
di processare l’input Auditing
•
AdministrationController
•Before: Output compression
Before: Authentication, Caching AdministrationController
before_filter :ensure_login, :audit
After: Localization, before_filter :ensure_login,
•After: Localization, Compression
• After: Localization, Output compression SecretController < Administrati...
SecretController < Administrati
prepend_before_filter :encrypt
prepend_before_filter :encryp
8. AJAXAnd XML
Asynchrnous JavaScript
• È una tecnica: Web browser Server
insieme di tecnologie web Login
•
Business
XHTML/CSS XML/XSLT
logic
•
User's
User's
DOM (Document Object Model) Deliver data
partial
client app
•
model
data
XMLHttpRequest model
•
(JavaScript)
JavaScript Frequent
requests
for data
• Nuovo approccio allo sviluppo User
Client
web session
application
• sviluppo di framework complessi
• non richiede plugin Logout
• •Non è un concept astratto Exit
Yahoo Flickr page
• GMail, Google Maps, Google Groups Shared
•
data
Windows Live, Office Live model
• •WEB 2.0
termine coniato dalla O’Really nel 2004.
• da associare non tanto alle tecnologie quanto all’idea di evoluzione dell’usabilità del Web
9. Principi Base
• •Il Browser carica un’applicazione, non il contenuto
Il browser riceve dal server un engine JavaScript incaricato di
gestire le azioni dell’utente. L’engine decide se è necessario
chiedere informazioni al server (es: query DB)
• •Il server invia dati, non pagine
Ad ogni richiesta del browser, il server invia XML/HTML/JS.
• La pagina viene modificata, non ricaricata.
• L’interazione dell’utente con l’applicazione
deve essere fluida e continua
• Ogni azione dell’utente deve prevedere un feedback immediato
• Esperienza di usabilità più vicina a quella Desktop
• Maggiore interattività (componenti complessi, drag-n-drop)
• •Nuovo modo di sviluppare interfacce
L’usabilità e l’interazione con l’utente è fondamentale
• Bisogna dimenticarsi le limitazioni attuali del Web
10. AJAX on Rails
• •AJAX integrato in Ruby on Rails
The Rails Way
• •AJAX Framework Prototype.js
drag-n-drop, effetti visivi, remote call
• •Metodi helper per users”, :update=>”listUsersDiv”,
semplificare lo sviluppo
link_to_remote(“list all
:url=>{:controller=>:account, :action=>:list})
• observe_field
• periodically_call_remote
• form_remote_tag
• form_tag_with_upload_progress
• Normalmente non occorre scrivere codice JavaScript
11. Rails e AJAX
• Lo sviluppo dei Web Application sta avendo un
notevole incremento.
Avere a disposizione strumenti efficienti e chiari,
come Rails, permette di diminuire i tempi di
sviluppo e semplificare la mantenibilità del sistema
• Non bisogna solo concentrarsi sullo sviluppo dei
meccanismi lato server: l’interazione con
l’utente deve essere la parte più importante.
AJAX fornisce gli strumenti necessari per superare
le limitazioni attuali del Web