SlideShare une entreprise Scribd logo
1  sur  31
Ziya Askerov
JAVA WEB TECHNOLOGIES
WHAT IS FRAMEWORK ?
DYNAMIC AND STATIC LANGUAGES
-Difference between dynamic and static programming languages
checking types before operations to prevent errors
-Static Type Checking & Dinamic Type Checking
-Runtime checking and Compile time checking
-Static Languages Java, C, C++ ,C#
-Dynamic Languages Groovy, Javascript, Python, Ruby
WHAT IS GROOVY
Is an agile and dynamic language for the Java Virtual Machine
Makes modern programming features available to Java developers
with almost-zero learning curve
Increases developer productivity
Compiles straight to Java bytecode so you can use it anywhere you can
use Java
Seamlessly integrates with all existing Java classes and libraries
WHAT IS GRAILS
-Full stack MVC framework for web apps
-Exploits the awesome power of Groovy
-Leverages proven staples
Hibernate
Spring
Sitemesh
-Works on JVM
GRAILS ARCHITECTURE
WHY GRAILS
Java web development as it stands today is dramatically more complicated than it
needs to be
Most modern web frameworks in the Java space are over complicated and don't
embrace the Don't Repeat Yourself (DRY) principles
- An easy to use Object Relational Mapping (ORM) layer built on Hibernate
- An expressive view technology called Groovy Server Pages (GSP)
- A controller layer built on Spring MVC
- A transactional service layer built on Spring's transaction abstraction
WHY GRAILS
Based on battle tested and proven Java frameworks (Spring, Hibernate,
SiteMesh, Quartz, etc)
Based on Groovy language
GORM(Grails Object Relational Mapping)
Doesn’t stop you from using the power of underlying frameworks
Easy to set-up and get started
Minimal server restart required while development
Convention over Configuration / No painful XML configuration & XML Management
Tag Lib Authoring mechanism
Tons of available plugins
CONVENTION OVER CONFIGURATION
-Some frameworks need multiple configuration files, each with many settings
-A large number of configuration files with lots of parameters is often difficult to maintain
-Convention over Configuration (Coding by convention) is a software design paradigm
which seeks to decrease the number of decisions that developers need to make
-Gaining simplicity, but not necessarily losing flexibility
-Like a software consulting 
GRAILS AND SECURITY
Web security problems typically occur due to developer naivety or mistakes, and there is a
little Grails can do to avoid common mistakes and make writing secure applications easier
to write.
-All standard database access via GORM domain objects is automatically SQL escaped to
prevent SQL injection attacks
-Grails link creating tags (link, form, createLink, createLinkTo and others) all use appropriate
escaping mechanisms to prevent code injection
-Grails provides codecs to let you trivially escape data when rendered as HTML, JavaScript
and URLs to prevent injection attacks here.
-XSRF attacks prevention
-Cross Site Scripting (XSS) Prevention
GRAILS AND MVC
GRAILS Object Relational Mapping (GORM)
GORM is Grails' object relational mapping (ORM) implementation.
Under the hood it uses Hibernate
BASIC CRUD
class Person {
String name
Integer age
Date lastVisit
}
def p = new Person(name: "Fred", age: 40, lastVisit: new Date())
p.save()
def p = Person.get(1)
p.name = "Bob“
p.save()
def p = Person.get(1)
p.delete()
constructor
def results = Person.findAll()
One-to-many
Many-to-many
Association in GORM
One-to-one
One-to-one
class Face {
Nose nose
}
class Nose {
}
class Face {
Nose nose
}
class Nose {
static belongsTo = [face:Face]
}
class Author {
static hasMany = [books: Book]
String name
}
class Book {
static belongsTo = [author: Author]
String title
}
class Book {
static belongsTo = Author
static hasMany = [authors:Author]
String title
}
class Author {
static hasMany = [books:Book]
String name
}
Eager and Lazy Fetching
Associations in GORM are by default lazy
class Airport {
String name
static hasMany = [flights: Flight]
}
class Flight {
String number Location destination
static belongsTo = [airport: Airport]
}
class Location {
String city
String country
}
Given the above domain classes and the following code:
def airport = Airport.findByName("Gatwick")
for (flight in airport.flights) {
println flight.destination.city
}
Pessimistic and Optimistic Locking
-By default gorm classes are configured for optimistic locking.
-Optimistic locking is a feature of hibernate which involves storing a version value in a special version
Column in the database that is incremented after each update.
-Pessimistic locking is equivalent to doing a sql "select * for update" statement and locking a row in the database
Pessimistic Locking
Optimistic Locking
def airport = Airport.get(10)
try {
airport.name = "Heathrow" airport.save(flush: true)
} catch (org.springframework.dao.OptimisticLockingFailureException e)
{
// deal with exception
}
def airport = Airport.get(10)
airport.lock()
// lock for update airport.name = "Heathrow"
airport.save()
def airport = Airport.lock(10) // lock for update
airport.name = "Heathrow"
airport.save()
def airport = Airport.findByName("Heathrow", [lock: true])
Querying with GORM
GORM supports a number of powerful ways to query from dynamic finders, to criteria to Hibernate's object oriented query
language HQL. Depending on the complexity of the query you have the following options in order of flexibility and power:
-Dynamic Finders
-Where Queries
-Criteria Queries
-Hibernate Query Language (HQL)
Dynamic Finders
Pagination and Sorting
class Book {
String title
Date releaseDate
Author author
}
class Author {
String name
}
def book = Book.findByTitle("The Stand")
book = Book.findByTitleLike("Harry Pot%")
book = Book.findByReleaseDateBetween(firstDate, secondDate)
book = Book.findByReleaseDateGreaterThan(someDate)
book = Book.findByTitleLikeOrReleaseDateLessThan("%Something%", someDa
def books = Book.findAllByTitleLike("Harry Pot%", [max: 3, offset: 2, sort:
"title", order: "desc"])
Boolean logic (AND/OR)
def books = Book.findAllByTitleLikeOrReleaseDateGreaterThan( "%Java%", new Date() - 3
def books = Book.findAllByTitleLikeAndReleaseDateGreaterThan( "%Java%", new Date() -
The possible comparators include:
•InList - In the list of given values
•LessThan - less than a given value
•LessThanEquals - less than or equal a give value
•GreaterThan - greater than a given value
•GreaterThanEquals - greater than or equal a given value
•Like - Equivalent to a SQL like expression
•Ilike - Similar to a Like, except case insensitive
•NotEqual - Negates equality
•InRange - Between the from and to values of a Groovy Range
•Rlike - Performs a Regexp LIKE in MySQL or Oracle otherwise falls back to Like
•Between - Between two values (requires two arguments)
•IsNotNull - Not a null value (doesn't take an argument)
•IsNull - Is a null value (doesn't take an argument)
Dynamic Finders
Where Queries
Criteria
def query = Person.where {
firstName == "Bart"
}
Person bart = query.find()
def query = Person.where {
(lastName != "Simpson" && firstName != "Fred")|| (firstName == "Bart" && age > 9)
}
def results = query.list(sort:"firstName")
def c = Account.createCriteria()
def results = c {
between("balance", 500, 1000)
eq("branch", "London") or {
like("holderFirstName", "Fred%")
like("holderFirstName", "Barney%")
}
maxResults(10)
order("holderLastName", "desc")
}
Querying with GORM
Validation on the GRAILS
Validation on the Client attributes
bindable
blank
creditCard
email
inList
matches
max
maxSize
min
minSize
notEqual
nullable
range
scale
size
unique
url
validator
widget
def user = new User(params)
if (user.hasErrors()) {
if (user.errors.hasFieldErrors("login")) {
println user.errors.getFieldError("login").rejectedValue
}
}
class User {
String login
String password
String email
Integer age
static constraints = {
}
}
class User { ...
static constraints = {
login size: 5..15, blank: false, unique: true
password size: 5..15, blank: false
email email: true, blank: false
age min: 18
}
} All Constraints
<g:hasErrors bean="${user}">
<ul>
<g:eachError var="err" bean="${user}">
<li>${err}</li>
</g:eachError>
</ul>
</g:hasErrors>
Constraints
Validation of Domain Class
GRAILS TAGS
<g:form name="myForm" action="myaction" id="1">...</g:form>
<g:select name="user.company.id" from="${Company.list()}"
value="${user?.company.id}" optionKey="id" />
<g:include action="list" params="[sort: 'title', order: 'asc', author:
currentBook.author]" />
<g:paginate next="Forward" prev="Back" maxsteps="0"
controller="book" action="list" total="${bookCount}" />
<g:each in="${books}">
<p>Title: ${it.title}</p>
<p>Author: ${it.author}</p>
</g:each>
<g:if test="${name == 'fred'}">
Hello Fred!
</g:if>
<g:elseif test="${name == 'bob'}">
Hello bob!
</g:elseif>
actionSubmit
actionSubmitImage
applyLayout
checkBox
collect
cookie
country
countrySelect
createLink
createLinkTo
currencySelect
datePicker
each
eachError
else
elseif
external
field
fieldValue
findAll
form
formatBoolean
formatDate
formatNumber
grep
hasErrors
header
hiddenField
uploadForm
while
if
img
include
isAvailable
isNotAvailable
javascript
join
layoutBody
layoutHead
layoutTitle
link
localeSelect
message
meta
pageProperty
paginate
passwordField
radio
radioGroup
render
renderErrors
resource
select
set
sortableColumn
submitButton
textArea
textField
timeZoneSelect
unless
GRAILS TAGS
PROJECT STRUCTURE & CONFIGURATION
BootStrap.groovy
BuildConfig.groovy
Config.groovy
DataSource.groovy
UrlMappings.groovy
class BootStrap {
def init = { servletContext ->
}
def destroy = {
}
}
DataSource.groovy
Plugins
Grails is first and foremost a web application framework, but it is also a platform
-Spring Security Core Plugin
-Spring Security UI Plugin
-Quartz Plugin
-Quartz Monitor Plugin
-Mail Plugin
-XSS sanitizer Plugin
class User {
transient springSecurityService
String username
String password
boolean enabled = true
boolean accountExpired
boolean accountLocked
boolean passwordExpired
static transients = ['springSecurityService']
static constraints = {
username blank: false, unique: true password blank: false
}
static mapping = {
password column: '`password`‘
}
Set<Role> getAuthorities() {
UserRole.findAllByUser(this).collect { it.role }
}
def beforeInsert() {
encodePassword()
}
def beforeUpdate() {
if (isDirty('password')) {
encodePassword() }
}
protected void encodePassword() {
password = springSecurityService?.passwordEncoder ?
springSecurityService.encodePassword(password) : password
}
}
Authentication & Authorization with Spring Security
Defining Secured Annotations with Spring Security
package com.mycompany.myapp
import grails.plugin.springsecurity.annotation.Secured
class SecureAnnotatedController {
@Secured(['ROLE_ADMIN'])
def index() {
render 'you have ROLE_ADMIN'
}
@Secured(['ROLE_ADMIN', 'ROLE_SUPERUSER'])
def adminEither() {
render 'you have ROLE_ADMIN or SUPERUSER'
}
def anybody() {
render 'anyone can see this' }
}
package com.mycompany.myapp
import grails.plugin.springsecurity.annotation.Secur
@Secured(['ROLE_ADMIN'])
class SecureClassAnnotatedController {
def index() {
render 'index: you have ROLE_ADMIN' }
def otherAction() {
render 'otherAction: you have ROLE_ADMIN‘
}
@Secured(['ROLE_SUPERUSER'])
def super() {
render 'super: you have ROLE_SUPERUSER' }
}
<sec:ifLoggedIn> Welcome Back! </sec:ifLoggedIn>
<sec:ifNotLoggedIn>
<g:link controller='login' action='auth'>Login</g:link>
</sec:ifNotLoggedIn>
<sec:ifAllGranted roles="ROLE_ADMIN,ROLE_SUPERVISOR">secure stuff here</sec:ifAllGrante
<sec:ifAnyGranted roles="ROLE_ADMIN,ROLE_SUPERVISOR">secure stuff here</sec:ifAnyGrante
<sec:ifNotGranted roles="ROLE_USER">non-user stuff here</sec:ifNotGranted>
Spring Security Tag Lib
authoritiesToRoles()
getPrincipalAuthorities()
parseAuthoritiesString()
ifAllGranted()
ifNotGranted()
ifAnyGranted()
getSecurityConfig()
loadSecondaryConfig()
reloadSecurityConfig()
isAjax()
Spring Security Utils
-Based on battle tested and proven Java frameworks (Spring, Hibernate, SiteMesh, Quartz, etc)
-Based on Groovy language
-A very responsive and supporting community and mailing list
-GORM
-Doesn’t stop you from using the power of underlying frameworks
-Easy to set-up and get started
-Minimal server restart required while development
-Standard Project template and artifacts
-DRY / Convention over Configuration / No painful XML configuration & XML Management
-REST support built-in
-Tag Lib Authoring mechanism
-Integrates easily with already written Java code
-Tons of available plugins
-Hundreds of small things that make development fun with Groovy and Grails
II Launch Your Startup With Groovy & Grails

Contenu connexe

Tendances

Using Ruby on Rails with legacy Oracle databases
Using Ruby on Rails with legacy Oracle databasesUsing Ruby on Rails with legacy Oracle databases
Using Ruby on Rails with legacy Oracle databasesRaimonds Simanovskis
 
JAX-RS and CDI Bike the (Reactive) Bridge
JAX-RS and CDI Bike the (Reactive) BridgeJAX-RS and CDI Bike the (Reactive) Bridge
JAX-RS and CDI Bike the (Reactive) BridgeJosé Paumard
 
Crafting Quality PHP Applications (ConFoo YVR 2017)
Crafting Quality PHP Applications (ConFoo YVR 2017)Crafting Quality PHP Applications (ConFoo YVR 2017)
Crafting Quality PHP Applications (ConFoo YVR 2017)James Titcumb
 
Why Every Tester Should Learn Ruby
Why Every Tester Should Learn RubyWhy Every Tester Should Learn Ruby
Why Every Tester Should Learn RubyRaimonds Simanovskis
 
Enterprise JavaScript ... what the heck?
Enterprise JavaScript ... what the heck?Enterprise JavaScript ... what the heck?
Enterprise JavaScript ... what the heck?Nedelcho Delchev
 
InterConnect: Java, Node.js and Swift - Which, Why and When
InterConnect: Java, Node.js and Swift - Which, Why and WhenInterConnect: Java, Node.js and Swift - Which, Why and When
InterConnect: Java, Node.js and Swift - Which, Why and WhenChris Bailey
 
A Practitioner’s guide to Hardened JavaScript
A Practitioner’s guide to Hardened JavaScriptA Practitioner’s guide to Hardened JavaScript
A Practitioner’s guide to Hardened JavaScriptTom Van Cutsem
 
Advanced realm in swift
Advanced realm in swiftAdvanced realm in swift
Advanced realm in swiftYusuke Kita
 
Rails-like JavaScript Using CoffeeScript, Backbone.js and Jasmine
Rails-like JavaScript Using CoffeeScript, Backbone.js and JasmineRails-like JavaScript Using CoffeeScript, Backbone.js and Jasmine
Rails-like JavaScript Using CoffeeScript, Backbone.js and JasmineRaimonds Simanovskis
 
Testing Backbone applications with Jasmine
Testing Backbone applications with JasmineTesting Backbone applications with Jasmine
Testing Backbone applications with JasmineLeon van der Grient
 
JRuby @ Boulder Ruby
JRuby @ Boulder RubyJRuby @ Boulder Ruby
JRuby @ Boulder RubyNick Sieger
 
Alberto Paro - Hands on Scala.js
Alberto Paro - Hands on Scala.jsAlberto Paro - Hands on Scala.js
Alberto Paro - Hands on Scala.jsScala Italy
 
Mastering Java Bytecode With ASM - 33rd degree, 2012
Mastering Java Bytecode With ASM - 33rd degree, 2012Mastering Java Bytecode With ASM - 33rd degree, 2012
Mastering Java Bytecode With ASM - 33rd degree, 2012Anton Arhipov
 
Reactive Access to MongoDB from Scala
Reactive Access to MongoDB from ScalaReactive Access to MongoDB from Scala
Reactive Access to MongoDB from ScalaHermann Hueck
 
Object Oriented Exploitation: New techniques in Windows mitigation bypass
Object Oriented Exploitation: New techniques in Windows mitigation bypassObject Oriented Exploitation: New techniques in Windows mitigation bypass
Object Oriented Exploitation: New techniques in Windows mitigation bypassSam Thomas
 
Java script Techniques Part I
Java script Techniques Part IJava script Techniques Part I
Java script Techniques Part ILuis Atencio
 

Tendances (20)

Using Ruby on Rails with legacy Oracle databases
Using Ruby on Rails with legacy Oracle databasesUsing Ruby on Rails with legacy Oracle databases
Using Ruby on Rails with legacy Oracle databases
 
Old code doesn't stink
Old code doesn't stinkOld code doesn't stink
Old code doesn't stink
 
JAX-RS and CDI Bike the (Reactive) Bridge
JAX-RS and CDI Bike the (Reactive) BridgeJAX-RS and CDI Bike the (Reactive) Bridge
JAX-RS and CDI Bike the (Reactive) Bridge
 
Crafting Quality PHP Applications (ConFoo YVR 2017)
Crafting Quality PHP Applications (ConFoo YVR 2017)Crafting Quality PHP Applications (ConFoo YVR 2017)
Crafting Quality PHP Applications (ConFoo YVR 2017)
 
Why Every Tester Should Learn Ruby
Why Every Tester Should Learn RubyWhy Every Tester Should Learn Ruby
Why Every Tester Should Learn Ruby
 
Tech friday 22.01.2016
Tech friday 22.01.2016Tech friday 22.01.2016
Tech friday 22.01.2016
 
Enterprise JavaScript ... what the heck?
Enterprise JavaScript ... what the heck?Enterprise JavaScript ... what the heck?
Enterprise JavaScript ... what the heck?
 
Rails on Oracle 2011
Rails on Oracle 2011Rails on Oracle 2011
Rails on Oracle 2011
 
InterConnect: Java, Node.js and Swift - Which, Why and When
InterConnect: Java, Node.js and Swift - Which, Why and WhenInterConnect: Java, Node.js and Swift - Which, Why and When
InterConnect: Java, Node.js and Swift - Which, Why and When
 
A Practitioner’s guide to Hardened JavaScript
A Practitioner’s guide to Hardened JavaScriptA Practitioner’s guide to Hardened JavaScript
A Practitioner’s guide to Hardened JavaScript
 
Advanced realm in swift
Advanced realm in swiftAdvanced realm in swift
Advanced realm in swift
 
Rails-like JavaScript Using CoffeeScript, Backbone.js and Jasmine
Rails-like JavaScript Using CoffeeScript, Backbone.js and JasmineRails-like JavaScript Using CoffeeScript, Backbone.js and Jasmine
Rails-like JavaScript Using CoffeeScript, Backbone.js and Jasmine
 
Testing Backbone applications with Jasmine
Testing Backbone applications with JasmineTesting Backbone applications with Jasmine
Testing Backbone applications with Jasmine
 
JRuby @ Boulder Ruby
JRuby @ Boulder RubyJRuby @ Boulder Ruby
JRuby @ Boulder Ruby
 
Alberto Paro - Hands on Scala.js
Alberto Paro - Hands on Scala.jsAlberto Paro - Hands on Scala.js
Alberto Paro - Hands on Scala.js
 
Mastering Java Bytecode With ASM - 33rd degree, 2012
Mastering Java Bytecode With ASM - 33rd degree, 2012Mastering Java Bytecode With ASM - 33rd degree, 2012
Mastering Java Bytecode With ASM - 33rd degree, 2012
 
Reactive Access to MongoDB from Scala
Reactive Access to MongoDB from ScalaReactive Access to MongoDB from Scala
Reactive Access to MongoDB from Scala
 
Object Oriented Exploitation: New techniques in Windows mitigation bypass
Object Oriented Exploitation: New techniques in Windows mitigation bypassObject Oriented Exploitation: New techniques in Windows mitigation bypass
Object Oriented Exploitation: New techniques in Windows mitigation bypass
 
Java script Techniques Part I
Java script Techniques Part IJava script Techniques Part I
Java script Techniques Part I
 
遇見 Ruby on Rails
遇見 Ruby on Rails遇見 Ruby on Rails
遇見 Ruby on Rails
 

En vedette

Documentos primaria-sesiones-unidad02-integradas-cuarto grado-u2-4to_integrad...
Documentos primaria-sesiones-unidad02-integradas-cuarto grado-u2-4to_integrad...Documentos primaria-sesiones-unidad02-integradas-cuarto grado-u2-4to_integrad...
Documentos primaria-sesiones-unidad02-integradas-cuarto grado-u2-4to_integrad...Teresa Clotilde Ojeda Sánchez
 
PPT on Employee Relation-1- New
PPT on Employee Relation-1- NewPPT on Employee Relation-1- New
PPT on Employee Relation-1- Newlinagadekar
 
150427 教育評価論(日吉)第3講
150427 教育評価論(日吉)第3講150427 教育評価論(日吉)第3講
150427 教育評価論(日吉)第3講Koyo Yamamori
 
Environmental code of practice for aboveground storage tank containing petrol...
Environmental code of practice for aboveground storage tank containing petrol...Environmental code of practice for aboveground storage tank containing petrol...
Environmental code of practice for aboveground storage tank containing petrol...Jin Chen
 
Ledlux India BEST LED LIGHTS IN INDIA
Ledlux India BEST LED LIGHTS IN INDIALedlux India BEST LED LIGHTS IN INDIA
Ledlux India BEST LED LIGHTS IN INDIALEDLUX INDIA
 
Защита при създаване на PHP приложения в Интернет (презентация)
Защита при създаване на PHP приложения в Интернет (презентация)Защита при създаване на PHP приложения в Интернет (презентация)
Защита при създаване на PHP приложения в Интернет (презентация)Anton Shumanski
 
Something informative for lpg gas
Something informative for lpg gasSomething informative for lpg gas
Something informative for lpg gasJAY THAKAR
 
routing protocols-giai thua tim duong
routing protocols-giai thua tim duongrouting protocols-giai thua tim duong
routing protocols-giai thua tim duongLà Thế Thôi
 
Documentos primaria-sesiones-unidad02-integradas-cuarto grado-u2-4to_integrad...
Documentos primaria-sesiones-unidad02-integradas-cuarto grado-u2-4to_integrad...Documentos primaria-sesiones-unidad02-integradas-cuarto grado-u2-4to_integrad...
Documentos primaria-sesiones-unidad02-integradas-cuarto grado-u2-4to_integrad...Teresa Clotilde Ojeda Sánchez
 
Mon jour de paques
Mon jour de paquesMon jour de paques
Mon jour de paquesbexmorris
 
Documentos primaria-sesiones-unidad02-integradas-cuarto grado-u2-4to_integrad...
Documentos primaria-sesiones-unidad02-integradas-cuarto grado-u2-4to_integrad...Documentos primaria-sesiones-unidad02-integradas-cuarto grado-u2-4to_integrad...
Documentos primaria-sesiones-unidad02-integradas-cuarto grado-u2-4to_integrad...Teresa Clotilde Ojeda Sánchez
 
Los ecosistemas
Los ecosistemasLos ecosistemas
Los ecosistemasnilemaarii
 
Documentos primaria-sesiones-unidad02-integradas-cuarto grado-u2-4to_integrad...
Documentos primaria-sesiones-unidad02-integradas-cuarto grado-u2-4to_integrad...Documentos primaria-sesiones-unidad02-integradas-cuarto grado-u2-4to_integrad...
Documentos primaria-sesiones-unidad02-integradas-cuarto grado-u2-4to_integrad...Teresa Clotilde Ojeda Sánchez
 

En vedette (20)

Chuong2
Chuong2Chuong2
Chuong2
 
Chlorrid directions
Chlorrid directionsChlorrid directions
Chlorrid directions
 
Documentos primaria-sesiones-unidad02-integradas-cuarto grado-u2-4to_integrad...
Documentos primaria-sesiones-unidad02-integradas-cuarto grado-u2-4to_integrad...Documentos primaria-sesiones-unidad02-integradas-cuarto grado-u2-4to_integrad...
Documentos primaria-sesiones-unidad02-integradas-cuarto grado-u2-4to_integrad...
 
gestion del talento humano
 gestion del talento humano gestion del talento humano
gestion del talento humano
 
PPT on Employee Relation-1- New
PPT on Employee Relation-1- NewPPT on Employee Relation-1- New
PPT on Employee Relation-1- New
 
150427 教育評価論(日吉)第3講
150427 教育評価論(日吉)第3講150427 教育評価論(日吉)第3講
150427 教育評価論(日吉)第3講
 
Plata ag
Plata agPlata ag
Plata ag
 
Environmental code of practice for aboveground storage tank containing petrol...
Environmental code of practice for aboveground storage tank containing petrol...Environmental code of practice for aboveground storage tank containing petrol...
Environmental code of practice for aboveground storage tank containing petrol...
 
Ledlux India BEST LED LIGHTS IN INDIA
Ledlux India BEST LED LIGHTS IN INDIALedlux India BEST LED LIGHTS IN INDIA
Ledlux India BEST LED LIGHTS IN INDIA
 
logo
logologo
logo
 
Защита при създаване на PHP приложения в Интернет (презентация)
Защита при създаване на PHP приложения в Интернет (презентация)Защита при създаване на PHP приложения в Интернет (презентация)
Защита при създаване на PHP приложения в Интернет (презентация)
 
Something informative for lpg gas
Something informative for lpg gasSomething informative for lpg gas
Something informative for lpg gas
 
routing protocols-giai thua tim duong
routing protocols-giai thua tim duongrouting protocols-giai thua tim duong
routing protocols-giai thua tim duong
 
Documentos primaria-sesiones-unidad02-integradas-cuarto grado-u2-4to_integrad...
Documentos primaria-sesiones-unidad02-integradas-cuarto grado-u2-4to_integrad...Documentos primaria-sesiones-unidad02-integradas-cuarto grado-u2-4to_integrad...
Documentos primaria-sesiones-unidad02-integradas-cuarto grado-u2-4to_integrad...
 
Mon jour de paques
Mon jour de paquesMon jour de paques
Mon jour de paques
 
Documentos primaria-sesiones-unidad02-integradas-cuarto grado-u2-4to_integrad...
Documentos primaria-sesiones-unidad02-integradas-cuarto grado-u2-4to_integrad...Documentos primaria-sesiones-unidad02-integradas-cuarto grado-u2-4to_integrad...
Documentos primaria-sesiones-unidad02-integradas-cuarto grado-u2-4to_integrad...
 
Coolidge dam jan05 casehis f (5)
Coolidge dam jan05 casehis f (5)Coolidge dam jan05 casehis f (5)
Coolidge dam jan05 casehis f (5)
 
Los ecosistemas
Los ecosistemasLos ecosistemas
Los ecosistemas
 
Cas0 3 ppt slide
Cas0 3 ppt slideCas0 3 ppt slide
Cas0 3 ppt slide
 
Documentos primaria-sesiones-unidad02-integradas-cuarto grado-u2-4to_integrad...
Documentos primaria-sesiones-unidad02-integradas-cuarto grado-u2-4to_integrad...Documentos primaria-sesiones-unidad02-integradas-cuarto grado-u2-4to_integrad...
Documentos primaria-sesiones-unidad02-integradas-cuarto grado-u2-4to_integrad...
 

Similaire à Grails

Alberto Maria Angelo Paro - Isomorphic programming in Scala and WebDevelopmen...
Alberto Maria Angelo Paro - Isomorphic programming in Scala and WebDevelopmen...Alberto Maria Angelo Paro - Isomorphic programming in Scala and WebDevelopmen...
Alberto Maria Angelo Paro - Isomorphic programming in Scala and WebDevelopmen...Codemotion
 
HTML5 for the Silverlight Guy
HTML5 for the Silverlight GuyHTML5 for the Silverlight Guy
HTML5 for the Silverlight GuyDavid Padbury
 
JRuby + Rails = Awesome Java Web Framework at Jfokus 2011
JRuby + Rails = Awesome Java Web Framework at Jfokus 2011JRuby + Rails = Awesome Java Web Framework at Jfokus 2011
JRuby + Rails = Awesome Java Web Framework at Jfokus 2011Nick Sieger
 
Scripting Oracle Develop 2007
Scripting Oracle Develop 2007Scripting Oracle Develop 2007
Scripting Oracle Develop 2007Tugdual Grall
 
WebNet Conference 2012 - Designing complex applications using html5 and knock...
WebNet Conference 2012 - Designing complex applications using html5 and knock...WebNet Conference 2012 - Designing complex applications using html5 and knock...
WebNet Conference 2012 - Designing complex applications using html5 and knock...Fabio Franzini
 
Javascript first-class citizenery
Javascript first-class citizeneryJavascript first-class citizenery
Javascript first-class citizenerytoddbr
 
Connecting the Worlds of Java and Ruby with JRuby
Connecting the Worlds of Java and Ruby with JRubyConnecting the Worlds of Java and Ruby with JRuby
Connecting the Worlds of Java and Ruby with JRubyNick Sieger
 
Event-driven IO server-side JavaScript environment based on V8 Engine
Event-driven IO server-side JavaScript environment based on V8 EngineEvent-driven IO server-side JavaScript environment based on V8 Engine
Event-driven IO server-side JavaScript environment based on V8 EngineRicardo Silva
 
Porting legacy apps to Griffon
Porting legacy apps to GriffonPorting legacy apps to Griffon
Porting legacy apps to GriffonJames Williams
 
Charla EHU Noviembre 2014 - Desarrollo Web
Charla EHU Noviembre 2014 - Desarrollo WebCharla EHU Noviembre 2014 - Desarrollo Web
Charla EHU Noviembre 2014 - Desarrollo WebMikel Torres Ugarte
 
Painless Persistence in a Disconnected World
Painless Persistence in a Disconnected WorldPainless Persistence in a Disconnected World
Painless Persistence in a Disconnected WorldChristian Melchior
 
[Coscup 2012] JavascriptMVC
[Coscup 2012] JavascriptMVC[Coscup 2012] JavascriptMVC
[Coscup 2012] JavascriptMVCAlive Kuo
 
Top Ten Java Defense for Web Applications v2
Top Ten Java Defense for Web Applications v2Top Ten Java Defense for Web Applications v2
Top Ten Java Defense for Web Applications v2Jim Manico
 
Works with persistent graphs using OrientDB
Works with persistent graphs using OrientDB Works with persistent graphs using OrientDB
Works with persistent graphs using OrientDB graphdevroom
 
ClojureScript - Making Front-End development Fun again - John Stevenson - Cod...
ClojureScript - Making Front-End development Fun again - John Stevenson - Cod...ClojureScript - Making Front-End development Fun again - John Stevenson - Cod...
ClojureScript - Making Front-End development Fun again - John Stevenson - Cod...Codemotion
 
Groovy - Grails as a modern scripting language for Web applications
Groovy - Grails as a modern scripting language for Web applicationsGroovy - Grails as a modern scripting language for Web applications
Groovy - Grails as a modern scripting language for Web applicationsIndicThreads
 
Groovy Update - JavaPolis 2007
Groovy Update - JavaPolis 2007Groovy Update - JavaPolis 2007
Groovy Update - JavaPolis 2007Guillaume Laforge
 

Similaire à Grails (20)

Jet presentation
Jet presentationJet presentation
Jet presentation
 
Alberto Maria Angelo Paro - Isomorphic programming in Scala and WebDevelopmen...
Alberto Maria Angelo Paro - Isomorphic programming in Scala and WebDevelopmen...Alberto Maria Angelo Paro - Isomorphic programming in Scala and WebDevelopmen...
Alberto Maria Angelo Paro - Isomorphic programming in Scala and WebDevelopmen...
 
HTML5 for the Silverlight Guy
HTML5 for the Silverlight GuyHTML5 for the Silverlight Guy
HTML5 for the Silverlight Guy
 
JRuby + Rails = Awesome Java Web Framework at Jfokus 2011
JRuby + Rails = Awesome Java Web Framework at Jfokus 2011JRuby + Rails = Awesome Java Web Framework at Jfokus 2011
JRuby + Rails = Awesome Java Web Framework at Jfokus 2011
 
Grails 101
Grails 101Grails 101
Grails 101
 
Scripting Oracle Develop 2007
Scripting Oracle Develop 2007Scripting Oracle Develop 2007
Scripting Oracle Develop 2007
 
WebNet Conference 2012 - Designing complex applications using html5 and knock...
WebNet Conference 2012 - Designing complex applications using html5 and knock...WebNet Conference 2012 - Designing complex applications using html5 and knock...
WebNet Conference 2012 - Designing complex applications using html5 and knock...
 
Javascript first-class citizenery
Javascript first-class citizeneryJavascript first-class citizenery
Javascript first-class citizenery
 
Connecting the Worlds of Java and Ruby with JRuby
Connecting the Worlds of Java and Ruby with JRubyConnecting the Worlds of Java and Ruby with JRuby
Connecting the Worlds of Java and Ruby with JRuby
 
Event-driven IO server-side JavaScript environment based on V8 Engine
Event-driven IO server-side JavaScript environment based on V8 EngineEvent-driven IO server-side JavaScript environment based on V8 Engine
Event-driven IO server-side JavaScript environment based on V8 Engine
 
Porting legacy apps to Griffon
Porting legacy apps to GriffonPorting legacy apps to Griffon
Porting legacy apps to Griffon
 
Charla EHU Noviembre 2014 - Desarrollo Web
Charla EHU Noviembre 2014 - Desarrollo WebCharla EHU Noviembre 2014 - Desarrollo Web
Charla EHU Noviembre 2014 - Desarrollo Web
 
Painless Persistence in a Disconnected World
Painless Persistence in a Disconnected WorldPainless Persistence in a Disconnected World
Painless Persistence in a Disconnected World
 
Full Stack Scala
Full Stack ScalaFull Stack Scala
Full Stack Scala
 
[Coscup 2012] JavascriptMVC
[Coscup 2012] JavascriptMVC[Coscup 2012] JavascriptMVC
[Coscup 2012] JavascriptMVC
 
Top Ten Java Defense for Web Applications v2
Top Ten Java Defense for Web Applications v2Top Ten Java Defense for Web Applications v2
Top Ten Java Defense for Web Applications v2
 
Works with persistent graphs using OrientDB
Works with persistent graphs using OrientDB Works with persistent graphs using OrientDB
Works with persistent graphs using OrientDB
 
ClojureScript - Making Front-End development Fun again - John Stevenson - Cod...
ClojureScript - Making Front-End development Fun again - John Stevenson - Cod...ClojureScript - Making Front-End development Fun again - John Stevenson - Cod...
ClojureScript - Making Front-End development Fun again - John Stevenson - Cod...
 
Groovy - Grails as a modern scripting language for Web applications
Groovy - Grails as a modern scripting language for Web applicationsGroovy - Grails as a modern scripting language for Web applications
Groovy - Grails as a modern scripting language for Web applications
 
Groovy Update - JavaPolis 2007
Groovy Update - JavaPolis 2007Groovy Update - JavaPolis 2007
Groovy Update - JavaPolis 2007
 

Dernier

Moving Beyond Twitter/X and Facebook - Social Media for local news providers
Moving Beyond Twitter/X and Facebook - Social Media for local news providersMoving Beyond Twitter/X and Facebook - Social Media for local news providers
Moving Beyond Twitter/X and Facebook - Social Media for local news providersDamian Radcliffe
 
GDG Cloud Southlake 32: Kyle Hettinger: Demystifying the Dark Web
GDG Cloud Southlake 32: Kyle Hettinger: Demystifying the Dark WebGDG Cloud Southlake 32: Kyle Hettinger: Demystifying the Dark Web
GDG Cloud Southlake 32: Kyle Hettinger: Demystifying the Dark WebJames Anderson
 
Best VIP Call Girls Noida Sector 75 Call Me: 8448380779
Best VIP Call Girls Noida Sector 75 Call Me: 8448380779Best VIP Call Girls Noida Sector 75 Call Me: 8448380779
Best VIP Call Girls Noida Sector 75 Call Me: 8448380779Delhi Call girls
 
Low Rate Young Call Girls in Sector 63 Mamura Noida ✔️☆9289244007✔️☆ Female E...
Low Rate Young Call Girls in Sector 63 Mamura Noida ✔️☆9289244007✔️☆ Female E...Low Rate Young Call Girls in Sector 63 Mamura Noida ✔️☆9289244007✔️☆ Female E...
Low Rate Young Call Girls in Sector 63 Mamura Noida ✔️☆9289244007✔️☆ Female E...SofiyaSharma5
 
CALL ON ➥8923113531 🔝Call Girls Lucknow Lucknow best sexual service Online
CALL ON ➥8923113531 🔝Call Girls Lucknow Lucknow best sexual service OnlineCALL ON ➥8923113531 🔝Call Girls Lucknow Lucknow best sexual service Online
CALL ON ➥8923113531 🔝Call Girls Lucknow Lucknow best sexual service Onlineanilsa9823
 
Call Girls In Pratap Nagar Delhi 💯Call Us 🔝8264348440🔝
Call Girls In Pratap Nagar Delhi 💯Call Us 🔝8264348440🔝Call Girls In Pratap Nagar Delhi 💯Call Us 🔝8264348440🔝
Call Girls In Pratap Nagar Delhi 💯Call Us 🔝8264348440🔝soniya singh
 
Call Girls Ludhiana Just Call 98765-12871 Top Class Call Girl Service Available
Call Girls Ludhiana Just Call 98765-12871 Top Class Call Girl Service AvailableCall Girls Ludhiana Just Call 98765-12871 Top Class Call Girl Service Available
Call Girls Ludhiana Just Call 98765-12871 Top Class Call Girl Service AvailableSeo
 
Call Girls Dubai Prolapsed O525547819 Call Girls In Dubai Princes$
Call Girls Dubai Prolapsed O525547819 Call Girls In Dubai Princes$Call Girls Dubai Prolapsed O525547819 Call Girls In Dubai Princes$
Call Girls Dubai Prolapsed O525547819 Call Girls In Dubai Princes$kojalkojal131
 
₹5.5k {Cash Payment}New Friends Colony Call Girls In [Delhi NIHARIKA] 🔝|97111...
₹5.5k {Cash Payment}New Friends Colony Call Girls In [Delhi NIHARIKA] 🔝|97111...₹5.5k {Cash Payment}New Friends Colony Call Girls In [Delhi NIHARIKA] 🔝|97111...
₹5.5k {Cash Payment}New Friends Colony Call Girls In [Delhi NIHARIKA] 🔝|97111...Diya Sharma
 
Lucknow ❤CALL GIRL 88759*99948 ❤CALL GIRLS IN Lucknow ESCORT SERVICE❤CALL GIRL
Lucknow ❤CALL GIRL 88759*99948 ❤CALL GIRLS IN Lucknow ESCORT SERVICE❤CALL GIRLLucknow ❤CALL GIRL 88759*99948 ❤CALL GIRLS IN Lucknow ESCORT SERVICE❤CALL GIRL
Lucknow ❤CALL GIRL 88759*99948 ❤CALL GIRLS IN Lucknow ESCORT SERVICE❤CALL GIRLimonikaupta
 
AWS Community DAY Albertini-Ellan Cloud Security (1).pptx
AWS Community DAY Albertini-Ellan Cloud Security (1).pptxAWS Community DAY Albertini-Ellan Cloud Security (1).pptx
AWS Community DAY Albertini-Ellan Cloud Security (1).pptxellan12
 
All Time Service Available Call Girls Mg Road 👌 ⏭️ 6378878445
All Time Service Available Call Girls Mg Road 👌 ⏭️ 6378878445All Time Service Available Call Girls Mg Road 👌 ⏭️ 6378878445
All Time Service Available Call Girls Mg Road 👌 ⏭️ 6378878445ruhi
 
Hot Call Girls |Delhi |Hauz Khas ☎ 9711199171 Book Your One night Stand
Hot Call Girls |Delhi |Hauz Khas ☎ 9711199171 Book Your One night StandHot Call Girls |Delhi |Hauz Khas ☎ 9711199171 Book Your One night Stand
Hot Call Girls |Delhi |Hauz Khas ☎ 9711199171 Book Your One night Standkumarajju5765
 
Call Now ☎ 8264348440 !! Call Girls in Sarai Rohilla Escort Service Delhi N.C.R.
Call Now ☎ 8264348440 !! Call Girls in Sarai Rohilla Escort Service Delhi N.C.R.Call Now ☎ 8264348440 !! Call Girls in Sarai Rohilla Escort Service Delhi N.C.R.
Call Now ☎ 8264348440 !! Call Girls in Sarai Rohilla Escort Service Delhi N.C.R.soniya singh
 
Call Girls In Sukhdev Vihar Delhi 💯Call Us 🔝8264348440🔝
Call Girls In Sukhdev Vihar Delhi 💯Call Us 🔝8264348440🔝Call Girls In Sukhdev Vihar Delhi 💯Call Us 🔝8264348440🔝
Call Girls In Sukhdev Vihar Delhi 💯Call Us 🔝8264348440🔝soniya singh
 
Hot Service (+9316020077 ) Goa Call Girls Real Photos and Genuine Service
Hot Service (+9316020077 ) Goa  Call Girls Real Photos and Genuine ServiceHot Service (+9316020077 ) Goa  Call Girls Real Photos and Genuine Service
Hot Service (+9316020077 ) Goa Call Girls Real Photos and Genuine Servicesexy call girls service in goa
 
Call Girls In Model Towh Delhi 💯Call Us 🔝8264348440🔝
Call Girls In Model Towh Delhi 💯Call Us 🔝8264348440🔝Call Girls In Model Towh Delhi 💯Call Us 🔝8264348440🔝
Call Girls In Model Towh Delhi 💯Call Us 🔝8264348440🔝soniya singh
 
Call Now ☎ 8264348440 !! Call Girls in Shahpur Jat Escort Service Delhi N.C.R.
Call Now ☎ 8264348440 !! Call Girls in Shahpur Jat Escort Service Delhi N.C.R.Call Now ☎ 8264348440 !! Call Girls in Shahpur Jat Escort Service Delhi N.C.R.
Call Now ☎ 8264348440 !! Call Girls in Shahpur Jat Escort Service Delhi N.C.R.soniya singh
 

Dernier (20)

(INDIRA) Call Girl Pune Call Now 8250077686 Pune Escorts 24x7
(INDIRA) Call Girl Pune Call Now 8250077686 Pune Escorts 24x7(INDIRA) Call Girl Pune Call Now 8250077686 Pune Escorts 24x7
(INDIRA) Call Girl Pune Call Now 8250077686 Pune Escorts 24x7
 
Moving Beyond Twitter/X and Facebook - Social Media for local news providers
Moving Beyond Twitter/X and Facebook - Social Media for local news providersMoving Beyond Twitter/X and Facebook - Social Media for local news providers
Moving Beyond Twitter/X and Facebook - Social Media for local news providers
 
GDG Cloud Southlake 32: Kyle Hettinger: Demystifying the Dark Web
GDG Cloud Southlake 32: Kyle Hettinger: Demystifying the Dark WebGDG Cloud Southlake 32: Kyle Hettinger: Demystifying the Dark Web
GDG Cloud Southlake 32: Kyle Hettinger: Demystifying the Dark Web
 
Best VIP Call Girls Noida Sector 75 Call Me: 8448380779
Best VIP Call Girls Noida Sector 75 Call Me: 8448380779Best VIP Call Girls Noida Sector 75 Call Me: 8448380779
Best VIP Call Girls Noida Sector 75 Call Me: 8448380779
 
Low Rate Young Call Girls in Sector 63 Mamura Noida ✔️☆9289244007✔️☆ Female E...
Low Rate Young Call Girls in Sector 63 Mamura Noida ✔️☆9289244007✔️☆ Female E...Low Rate Young Call Girls in Sector 63 Mamura Noida ✔️☆9289244007✔️☆ Female E...
Low Rate Young Call Girls in Sector 63 Mamura Noida ✔️☆9289244007✔️☆ Female E...
 
CALL ON ➥8923113531 🔝Call Girls Lucknow Lucknow best sexual service Online
CALL ON ➥8923113531 🔝Call Girls Lucknow Lucknow best sexual service OnlineCALL ON ➥8923113531 🔝Call Girls Lucknow Lucknow best sexual service Online
CALL ON ➥8923113531 🔝Call Girls Lucknow Lucknow best sexual service Online
 
Call Girls In Pratap Nagar Delhi 💯Call Us 🔝8264348440🔝
Call Girls In Pratap Nagar Delhi 💯Call Us 🔝8264348440🔝Call Girls In Pratap Nagar Delhi 💯Call Us 🔝8264348440🔝
Call Girls In Pratap Nagar Delhi 💯Call Us 🔝8264348440🔝
 
Call Girls Ludhiana Just Call 98765-12871 Top Class Call Girl Service Available
Call Girls Ludhiana Just Call 98765-12871 Top Class Call Girl Service AvailableCall Girls Ludhiana Just Call 98765-12871 Top Class Call Girl Service Available
Call Girls Ludhiana Just Call 98765-12871 Top Class Call Girl Service Available
 
Call Girls Dubai Prolapsed O525547819 Call Girls In Dubai Princes$
Call Girls Dubai Prolapsed O525547819 Call Girls In Dubai Princes$Call Girls Dubai Prolapsed O525547819 Call Girls In Dubai Princes$
Call Girls Dubai Prolapsed O525547819 Call Girls In Dubai Princes$
 
₹5.5k {Cash Payment}New Friends Colony Call Girls In [Delhi NIHARIKA] 🔝|97111...
₹5.5k {Cash Payment}New Friends Colony Call Girls In [Delhi NIHARIKA] 🔝|97111...₹5.5k {Cash Payment}New Friends Colony Call Girls In [Delhi NIHARIKA] 🔝|97111...
₹5.5k {Cash Payment}New Friends Colony Call Girls In [Delhi NIHARIKA] 🔝|97111...
 
Lucknow ❤CALL GIRL 88759*99948 ❤CALL GIRLS IN Lucknow ESCORT SERVICE❤CALL GIRL
Lucknow ❤CALL GIRL 88759*99948 ❤CALL GIRLS IN Lucknow ESCORT SERVICE❤CALL GIRLLucknow ❤CALL GIRL 88759*99948 ❤CALL GIRLS IN Lucknow ESCORT SERVICE❤CALL GIRL
Lucknow ❤CALL GIRL 88759*99948 ❤CALL GIRLS IN Lucknow ESCORT SERVICE❤CALL GIRL
 
AWS Community DAY Albertini-Ellan Cloud Security (1).pptx
AWS Community DAY Albertini-Ellan Cloud Security (1).pptxAWS Community DAY Albertini-Ellan Cloud Security (1).pptx
AWS Community DAY Albertini-Ellan Cloud Security (1).pptx
 
All Time Service Available Call Girls Mg Road 👌 ⏭️ 6378878445
All Time Service Available Call Girls Mg Road 👌 ⏭️ 6378878445All Time Service Available Call Girls Mg Road 👌 ⏭️ 6378878445
All Time Service Available Call Girls Mg Road 👌 ⏭️ 6378878445
 
Rohini Sector 22 Call Girls Delhi 9999965857 @Sabina Saikh No Advance
Rohini Sector 22 Call Girls Delhi 9999965857 @Sabina Saikh No AdvanceRohini Sector 22 Call Girls Delhi 9999965857 @Sabina Saikh No Advance
Rohini Sector 22 Call Girls Delhi 9999965857 @Sabina Saikh No Advance
 
Hot Call Girls |Delhi |Hauz Khas ☎ 9711199171 Book Your One night Stand
Hot Call Girls |Delhi |Hauz Khas ☎ 9711199171 Book Your One night StandHot Call Girls |Delhi |Hauz Khas ☎ 9711199171 Book Your One night Stand
Hot Call Girls |Delhi |Hauz Khas ☎ 9711199171 Book Your One night Stand
 
Call Now ☎ 8264348440 !! Call Girls in Sarai Rohilla Escort Service Delhi N.C.R.
Call Now ☎ 8264348440 !! Call Girls in Sarai Rohilla Escort Service Delhi N.C.R.Call Now ☎ 8264348440 !! Call Girls in Sarai Rohilla Escort Service Delhi N.C.R.
Call Now ☎ 8264348440 !! Call Girls in Sarai Rohilla Escort Service Delhi N.C.R.
 
Call Girls In Sukhdev Vihar Delhi 💯Call Us 🔝8264348440🔝
Call Girls In Sukhdev Vihar Delhi 💯Call Us 🔝8264348440🔝Call Girls In Sukhdev Vihar Delhi 💯Call Us 🔝8264348440🔝
Call Girls In Sukhdev Vihar Delhi 💯Call Us 🔝8264348440🔝
 
Hot Service (+9316020077 ) Goa Call Girls Real Photos and Genuine Service
Hot Service (+9316020077 ) Goa  Call Girls Real Photos and Genuine ServiceHot Service (+9316020077 ) Goa  Call Girls Real Photos and Genuine Service
Hot Service (+9316020077 ) Goa Call Girls Real Photos and Genuine Service
 
Call Girls In Model Towh Delhi 💯Call Us 🔝8264348440🔝
Call Girls In Model Towh Delhi 💯Call Us 🔝8264348440🔝Call Girls In Model Towh Delhi 💯Call Us 🔝8264348440🔝
Call Girls In Model Towh Delhi 💯Call Us 🔝8264348440🔝
 
Call Now ☎ 8264348440 !! Call Girls in Shahpur Jat Escort Service Delhi N.C.R.
Call Now ☎ 8264348440 !! Call Girls in Shahpur Jat Escort Service Delhi N.C.R.Call Now ☎ 8264348440 !! Call Girls in Shahpur Jat Escort Service Delhi N.C.R.
Call Now ☎ 8264348440 !! Call Girls in Shahpur Jat Escort Service Delhi N.C.R.
 

Grails

  • 4. DYNAMIC AND STATIC LANGUAGES -Difference between dynamic and static programming languages checking types before operations to prevent errors -Static Type Checking & Dinamic Type Checking -Runtime checking and Compile time checking -Static Languages Java, C, C++ ,C# -Dynamic Languages Groovy, Javascript, Python, Ruby
  • 5. WHAT IS GROOVY Is an agile and dynamic language for the Java Virtual Machine Makes modern programming features available to Java developers with almost-zero learning curve Increases developer productivity Compiles straight to Java bytecode so you can use it anywhere you can use Java Seamlessly integrates with all existing Java classes and libraries
  • 6.
  • 7. WHAT IS GRAILS -Full stack MVC framework for web apps -Exploits the awesome power of Groovy -Leverages proven staples Hibernate Spring Sitemesh -Works on JVM
  • 9. WHY GRAILS Java web development as it stands today is dramatically more complicated than it needs to be Most modern web frameworks in the Java space are over complicated and don't embrace the Don't Repeat Yourself (DRY) principles - An easy to use Object Relational Mapping (ORM) layer built on Hibernate - An expressive view technology called Groovy Server Pages (GSP) - A controller layer built on Spring MVC - A transactional service layer built on Spring's transaction abstraction
  • 10. WHY GRAILS Based on battle tested and proven Java frameworks (Spring, Hibernate, SiteMesh, Quartz, etc) Based on Groovy language GORM(Grails Object Relational Mapping) Doesn’t stop you from using the power of underlying frameworks Easy to set-up and get started Minimal server restart required while development Convention over Configuration / No painful XML configuration & XML Management Tag Lib Authoring mechanism Tons of available plugins
  • 11. CONVENTION OVER CONFIGURATION -Some frameworks need multiple configuration files, each with many settings -A large number of configuration files with lots of parameters is often difficult to maintain -Convention over Configuration (Coding by convention) is a software design paradigm which seeks to decrease the number of decisions that developers need to make -Gaining simplicity, but not necessarily losing flexibility -Like a software consulting 
  • 12. GRAILS AND SECURITY Web security problems typically occur due to developer naivety or mistakes, and there is a little Grails can do to avoid common mistakes and make writing secure applications easier to write. -All standard database access via GORM domain objects is automatically SQL escaped to prevent SQL injection attacks -Grails link creating tags (link, form, createLink, createLinkTo and others) all use appropriate escaping mechanisms to prevent code injection -Grails provides codecs to let you trivially escape data when rendered as HTML, JavaScript and URLs to prevent injection attacks here. -XSRF attacks prevention -Cross Site Scripting (XSS) Prevention
  • 14. GRAILS Object Relational Mapping (GORM) GORM is Grails' object relational mapping (ORM) implementation. Under the hood it uses Hibernate BASIC CRUD class Person { String name Integer age Date lastVisit } def p = new Person(name: "Fred", age: 40, lastVisit: new Date()) p.save() def p = Person.get(1) p.name = "Bob“ p.save() def p = Person.get(1) p.delete() constructor def results = Person.findAll()
  • 15. One-to-many Many-to-many Association in GORM One-to-one One-to-one class Face { Nose nose } class Nose { } class Face { Nose nose } class Nose { static belongsTo = [face:Face] } class Author { static hasMany = [books: Book] String name } class Book { static belongsTo = [author: Author] String title } class Book { static belongsTo = Author static hasMany = [authors:Author] String title } class Author { static hasMany = [books:Book] String name }
  • 16. Eager and Lazy Fetching Associations in GORM are by default lazy class Airport { String name static hasMany = [flights: Flight] } class Flight { String number Location destination static belongsTo = [airport: Airport] } class Location { String city String country } Given the above domain classes and the following code: def airport = Airport.findByName("Gatwick") for (flight in airport.flights) { println flight.destination.city }
  • 17. Pessimistic and Optimistic Locking -By default gorm classes are configured for optimistic locking. -Optimistic locking is a feature of hibernate which involves storing a version value in a special version Column in the database that is incremented after each update. -Pessimistic locking is equivalent to doing a sql "select * for update" statement and locking a row in the database Pessimistic Locking Optimistic Locking def airport = Airport.get(10) try { airport.name = "Heathrow" airport.save(flush: true) } catch (org.springframework.dao.OptimisticLockingFailureException e) { // deal with exception } def airport = Airport.get(10) airport.lock() // lock for update airport.name = "Heathrow" airport.save() def airport = Airport.lock(10) // lock for update airport.name = "Heathrow" airport.save() def airport = Airport.findByName("Heathrow", [lock: true])
  • 18. Querying with GORM GORM supports a number of powerful ways to query from dynamic finders, to criteria to Hibernate's object oriented query language HQL. Depending on the complexity of the query you have the following options in order of flexibility and power: -Dynamic Finders -Where Queries -Criteria Queries -Hibernate Query Language (HQL) Dynamic Finders Pagination and Sorting class Book { String title Date releaseDate Author author } class Author { String name } def book = Book.findByTitle("The Stand") book = Book.findByTitleLike("Harry Pot%") book = Book.findByReleaseDateBetween(firstDate, secondDate) book = Book.findByReleaseDateGreaterThan(someDate) book = Book.findByTitleLikeOrReleaseDateLessThan("%Something%", someDa def books = Book.findAllByTitleLike("Harry Pot%", [max: 3, offset: 2, sort: "title", order: "desc"]) Boolean logic (AND/OR) def books = Book.findAllByTitleLikeOrReleaseDateGreaterThan( "%Java%", new Date() - 3 def books = Book.findAllByTitleLikeAndReleaseDateGreaterThan( "%Java%", new Date() -
  • 19. The possible comparators include: •InList - In the list of given values •LessThan - less than a given value •LessThanEquals - less than or equal a give value •GreaterThan - greater than a given value •GreaterThanEquals - greater than or equal a given value •Like - Equivalent to a SQL like expression •Ilike - Similar to a Like, except case insensitive •NotEqual - Negates equality •InRange - Between the from and to values of a Groovy Range •Rlike - Performs a Regexp LIKE in MySQL or Oracle otherwise falls back to Like •Between - Between two values (requires two arguments) •IsNotNull - Not a null value (doesn't take an argument) •IsNull - Is a null value (doesn't take an argument) Dynamic Finders
  • 20. Where Queries Criteria def query = Person.where { firstName == "Bart" } Person bart = query.find() def query = Person.where { (lastName != "Simpson" && firstName != "Fred")|| (firstName == "Bart" && age > 9) } def results = query.list(sort:"firstName") def c = Account.createCriteria() def results = c { between("balance", 500, 1000) eq("branch", "London") or { like("holderFirstName", "Fred%") like("holderFirstName", "Barney%") } maxResults(10) order("holderLastName", "desc") } Querying with GORM
  • 21. Validation on the GRAILS Validation on the Client attributes bindable blank creditCard email inList matches max maxSize min minSize notEqual nullable range scale size unique url validator widget def user = new User(params) if (user.hasErrors()) { if (user.errors.hasFieldErrors("login")) { println user.errors.getFieldError("login").rejectedValue } } class User { String login String password String email Integer age static constraints = { } } class User { ... static constraints = { login size: 5..15, blank: false, unique: true password size: 5..15, blank: false email email: true, blank: false age min: 18 } } All Constraints <g:hasErrors bean="${user}"> <ul> <g:eachError var="err" bean="${user}"> <li>${err}</li> </g:eachError> </ul> </g:hasErrors> Constraints Validation of Domain Class
  • 22. GRAILS TAGS <g:form name="myForm" action="myaction" id="1">...</g:form> <g:select name="user.company.id" from="${Company.list()}" value="${user?.company.id}" optionKey="id" /> <g:include action="list" params="[sort: 'title', order: 'asc', author: currentBook.author]" /> <g:paginate next="Forward" prev="Back" maxsteps="0" controller="book" action="list" total="${bookCount}" /> <g:each in="${books}"> <p>Title: ${it.title}</p> <p>Author: ${it.author}</p> </g:each> <g:if test="${name == 'fred'}"> Hello Fred! </g:if> <g:elseif test="${name == 'bob'}"> Hello bob! </g:elseif>
  • 24. PROJECT STRUCTURE & CONFIGURATION BootStrap.groovy BuildConfig.groovy Config.groovy DataSource.groovy UrlMappings.groovy class BootStrap { def init = { servletContext -> } def destroy = { } }
  • 26. Plugins Grails is first and foremost a web application framework, but it is also a platform -Spring Security Core Plugin -Spring Security UI Plugin -Quartz Plugin -Quartz Monitor Plugin -Mail Plugin -XSS sanitizer Plugin
  • 27. class User { transient springSecurityService String username String password boolean enabled = true boolean accountExpired boolean accountLocked boolean passwordExpired static transients = ['springSecurityService'] static constraints = { username blank: false, unique: true password blank: false } static mapping = { password column: '`password`‘ } Set<Role> getAuthorities() { UserRole.findAllByUser(this).collect { it.role } } def beforeInsert() { encodePassword() } def beforeUpdate() { if (isDirty('password')) { encodePassword() } } protected void encodePassword() { password = springSecurityService?.passwordEncoder ? springSecurityService.encodePassword(password) : password } } Authentication & Authorization with Spring Security
  • 28. Defining Secured Annotations with Spring Security package com.mycompany.myapp import grails.plugin.springsecurity.annotation.Secured class SecureAnnotatedController { @Secured(['ROLE_ADMIN']) def index() { render 'you have ROLE_ADMIN' } @Secured(['ROLE_ADMIN', 'ROLE_SUPERUSER']) def adminEither() { render 'you have ROLE_ADMIN or SUPERUSER' } def anybody() { render 'anyone can see this' } } package com.mycompany.myapp import grails.plugin.springsecurity.annotation.Secur @Secured(['ROLE_ADMIN']) class SecureClassAnnotatedController { def index() { render 'index: you have ROLE_ADMIN' } def otherAction() { render 'otherAction: you have ROLE_ADMIN‘ } @Secured(['ROLE_SUPERUSER']) def super() { render 'super: you have ROLE_SUPERUSER' } }
  • 29. <sec:ifLoggedIn> Welcome Back! </sec:ifLoggedIn> <sec:ifNotLoggedIn> <g:link controller='login' action='auth'>Login</g:link> </sec:ifNotLoggedIn> <sec:ifAllGranted roles="ROLE_ADMIN,ROLE_SUPERVISOR">secure stuff here</sec:ifAllGrante <sec:ifAnyGranted roles="ROLE_ADMIN,ROLE_SUPERVISOR">secure stuff here</sec:ifAnyGrante <sec:ifNotGranted roles="ROLE_USER">non-user stuff here</sec:ifNotGranted> Spring Security Tag Lib authoritiesToRoles() getPrincipalAuthorities() parseAuthoritiesString() ifAllGranted() ifNotGranted() ifAnyGranted() getSecurityConfig() loadSecondaryConfig() reloadSecurityConfig() isAjax() Spring Security Utils
  • 30.
  • 31. -Based on battle tested and proven Java frameworks (Spring, Hibernate, SiteMesh, Quartz, etc) -Based on Groovy language -A very responsive and supporting community and mailing list -GORM -Doesn’t stop you from using the power of underlying frameworks -Easy to set-up and get started -Minimal server restart required while development -Standard Project template and artifacts -DRY / Convention over Configuration / No painful XML configuration & XML Management -REST support built-in -Tag Lib Authoring mechanism -Integrates easily with already written Java code -Tons of available plugins -Hundreds of small things that make development fun with Groovy and Grails II Launch Your Startup With Groovy & Grails