SlideShare uma empresa Scribd logo
1 de 80
Baixar para ler offline
Play vs. Grails
Smackdown
James Ward and Matt Raible
and
Changelog
September 24, 2013: Updated for .
March 24, 2013: Updated and for .
June 24, 2012: .
June 19, 2012: Published for .
@_JamesWard @mraible
statistics JavaOne
statistics load tests Devoxx France
Play Performance Fix
ÜberConf
Why a Smackdown?
Play 2 and Grails 2 are often hyped as the most productive JVM
Web Frameworks.
* We wanted to know how they enhanced the Developer Experience (DX).
Happy Trails Requirements
Server-side Templates
Play 2 with Java
Form Validation
Data Pagination
Authentication
Scheduled Jobs
Atom / RSS
Email Notifications
Unit / Integration Tests
Load Tests
Performance Tests
Stretch Goals: Search, Photo Upload to S3
Our Schedule
Week 1 - Data Model Definition
Week 2 - Data Layer & URL Design
Week 3 - Controllers & Auth
Week 4 - Views
Week 5 - Misc Polish
Intro to Play 2
“Play Framework is based on a lightweight,
stateless, web-friendly architecture. Built on Akka,
Play provides predictable and minimal resource
consumption (CPU, memory, threads) for highly-
scalable applications.”
My Top 10 Favorite Features
1. Just hit refresh workflow
2. Type safety
3. RESTful
4. Stateless
5. Reactive
6. Asset Compiler
7. First-class JSON
8. Java & Scala
9. Templates in Activator
10. LinkedIn, Gawker, etc
Intro to Grails 2
“ Powered by Spring, Grails outperforms the
competition. Dynamic, agile web development
without compromises. ”
My Top 10 Favorite Features
1. Documentation
2. Clean URLs
3. GORM
4. IntelliJ IDEA Support
5. Zero Turnaround
6. Excellent Testing Support
7. Groovy
8. GSPs
9. Resource Optimizer
10. Instant Deployment on Heroku
Our Setup
IntelliJ IDEA for Development
GitHub for Source Control
CloudBees for Continuous Integration
Heroku for Production
Later added: QA Person and BrowserMob
Code Walk Through
We developed the same app, in similar ways, so let's look at the
different layers.
↓
Database
URL Mapping
Models
Controllers
Views
Validation
IDE Support
Job
Feed
Email
Photo Upload
Testing
Demo Data
Configuration
Authentication
Database - Grails
Hibernate is the default persistence provider
Create models, Hibernate creates the schema for you
grails-app/conf/DataSource.groovy
environments{
development{
dataSource{
dbCreate="create-drop"//oneof'create','create-drop','update','val
idate',''
url="jdbc:postgresql://localhost:5432/happytrails"
}
}
Database - Play
EBean is the default persistence provider in Java projects
Evolutions can be auto-applied
Initial evolution sql is auto-created
Subsequent changes must be versioned
Auto-created schema file is database dependent
Play 2 supports multiple datasources (Play 1 does not)
conf/evolutions/default/2.sql
#---!Ups
ALTERTABLEaccountADDis_adminboolean;
UPDATEaccountSETis_admin=FALSE;
#---!Downs
ALTERTABLEaccountDROPis_admin;
Database - Play
Using Heroku Postgres in production rocks!
Postgres 9.1
Dataclips
Fork & Follow
Multi-Ingres
URL Mapping - Grails
grails-app/conf/UrlMappings.groovy
classUrlMappings{
staticmappings={
"/$controller/$action?/$id?"{
constraints{
//applyconstraintshere
}
}
"/"(controller:"home",action:"index")
"/login"(controller:"login",action:"auth")
"/login/authfail"(controller:"login",action:"authfail")
"/login/denied"(controller:"login",action:"denied")
"/logout"(controller:"logout")
"/signup"(controller:"register")
"/feed/$region"(controller:"region",action:"feed")
"/register/register"(controller:"register",action:"register")
"/register/resetPassword"(controller:"register",action:"resetPassword")
"/register/verifyRegistration"(controller:"register",action:"verifyRegistra
tion")
"/forgotPassword"(controller:"register",action:"forgotPassword")
"/region/create"(controller:"region",action:"create")
"/regions"(controller:"region",action:"list")
"/region/save"(controller:"region",action:"save")
"/region/subscribe"(controller:"region",action:"subscribe")
URL Mapping - Play
conf/routes
GET / controllers.ApplicationController.index()
GET /signup controllers.ApplicationController.signupForm()
POST /signup controllers.ApplicationController.signup()
GET /login controllers.ApplicationController.loginForm()
POST /login controllers.ApplicationController.login()
GET /logout controllers.ApplicationController.logout()
GET /addregion controllers.RegionController.addRegion()
POST /addregion controllers.RegionController.saveRegion()
GET /:region/feed controllers.RegionController.getRegionFeed(region)
GET /:region/subscribe controllers.RegionController.subscribe(region)
GET /:region/unsubscribe controllers.RegionController.unsubscribe(region)
GET /:region/addroute controllers.RegionController.addRoute(region)
POST /:region/addroute controllers.RegionController.saveRoute(region)
GET /:region/delete controllers.RegionController.deleteRegion(region)
GET /:region/:route/rate controllers.RouteController.saveRating(region, route, rating: java.lang.Integer)
POST /:region/:route/comment controllers.RouteController.saveComment(region, route)
GET /:region/:route/delete controllers.RouteController.deleteRoute(region, route)
GET /:region/:route controllers.RouteController.getRouteHtml(region, route)
GET /:region controllers.RegionController.getRegionHtml(region, sort ?= "name")
Models - Grails
All properties are persisted by default
Constraints
Mappings with hasMany and belongsTo
Override methods for lifecycle events
grails-app/domain/happytrails/Region.groovy
packagehappytrails
classRegion{
staticcharactersNumbersAndSpaces=/[a-zA-Z0-9]+/
staticsearchable=true
staticconstraints={
nameblank:false,unique:true,matches:charactersNumbersAndSpaces
seoNamenullable:true
routescascade:"all-delete-orphan"
}
statichasMany=[routes:Route]
Stringname
StringseoName
defbeforeValidate(){
Models - Play
EBean + JPA Annotations
Declarative Validations (JSR 303)
Query DSL
Lazy Loading (except in Scala Templates)
app/models/Direction.java
@Entity
publicclassDirectionextendsModel{
@Id
publicLongid;
@Column(nullable=false)
@Constraints.Required
publicIntegerstepNumber;
@Column(length=1024,nullable=false)
@Constraints.MaxLength(1024)
@Constraints.Required
publicStringinstruction;
@ManyToOne
publicRouteroute;
Controllers - Grails
grails-app/controllers/happytrails/HomeController.groovy
packagehappytrails
importorg.grails.comments.Comment
classHomeController{
defindex(){
params.max=Math.min(params.max?params.int('max'):10,100)
[regions:Region.list(params),total:Region.count(),
comments:Comment.list(max:10,sort:'dateCreated',order:'desc')]
}
}
Controllers - Play
Stateless - Composable - Interceptable
Clean connection between URLs and response code
app/controllers/RouteController.java
@With(CurrentUser.class)
public class RouteController extends Controller {
@Security.Authenticated(Secured.class)
public static Result saveRating(String urlFriendlyRegionName, String urlFriendlyRouteName, Integer rating) {
User user = CurrentUser.get();
Route route = getRoute(urlFriendlyRegionName, urlFriendlyRouteName);
if ((route == null) || (user == null)) {
return badRequest("User or Route not found");
}
if (rating != null) {
Rating existingRating = Rating.findByUserAndRoute(user, route);
if (existingRating != null) {
existingRating.value = rating;
existingRating.save();
}
else {
Rating newRating = new Rating(user, route, rating);
newRating.save();
}
}
return redirect(routes.RouteController.getRouteHtml(urlFriendlyRegionName, urlFriendlyRouteName));
}
Views - Grails
Groovy Server Pages, like JSPs
GSP Tags
Layouts and Templates
Optimized Resources
grails-app/views/region/show.gsp
<%@pageimport="happytrails.Region"%>
<!doctypehtml>
<html>
<head>
<metaname="layout"content="main">
<g:setvar="entityName"value="${message(code:'region.label',default:'Region')}
"/>
<title><g:messagecode="default.show.label"args="[entityName]"/></title>
<linkrel="alternate"type="application/atom+xml"title="${regionInstance.name}Up
dates"
href="${createLink(controller:'region',action:'feed',params:[region:re
gionInstance.seoName])}"/>
</head>
<body>
<g:setvar="breadcrumb"scope="request">
<ulclass="breadcrumb">
<li><aclass="home"href="${createLink(uri:'/')}"><g:messagecode="default.ho
Views - Play
Scala Templates
Composable
Compiled
app/views/region.scala.html
@(region:Region,sort:String)
@headContent={
<linkrel="alternate"type="application/rss+xml"title="@region.getNameRSSFeed"
href="@routes.RegionController.getRegionFeed(region.getUrlFriendlyName)"/>
}
@breadcrumbs={
<divclass="nav-collapse">
<ulclass="nav">
<li><ahref="@routes.ApplicationController.index()">Hike</a></li>
<liclass="active"><ahref="@routes.RegionController.getRegionHtml(region.
getUrlFriendlyName)">@region.getName</a></li>
</ul>
</div>
}
@main("UberTracks-Hike-"+region.getName,headContent,breadcrumbs){
<divclass="btn-group">
Validation - Grails
grails-app/controllers/happytrails/RouteController.groovy
def save() {
def routeInstance = new Route(params)
if (!routeInstance.save(flush: true)) {
render(view: "create", model: [routeInstance: routeInstance])
return
}
flash.message = message(code: 'default.created.message', args: [message(code: '
route.label', default: 'Route'), routeInstance.name])
redirect(action: "show", id: routeInstance.id)
}
grails-app/views/route/create.gsp
<g:hasErrors bean="${routeInstance}">
<div class="alert alert-error" role="alert">
<g:eachError bean="${routeInstance}" var="error">
<div <g:if test="${error in org.springframework.validation.FieldError}"
>data-field-id="${error.field}"</g:if>><g:message error="${error}"/></div>
</g:eachError>
</div>
</g:hasErrors>
Validation - Play
app/controllers/RouteController.java
publicstaticResultsignup(){
Form<User>signupForm=form(User.class).bindFromRequest();
if(signupForm.hasErrors()){
returnbadRequest(views.html.signupForm.render(signupForm));
}
app/views/signupForm.scala.html
@if(signupForm.hasGlobalErrors){
<pclass="erroralertalert-error">@signupForm.globalError.message</p>
}
@helper.form(action=routes.ApplicationController.signup(),'class->"form-horizonta
l"){
@helper.inputText(signupForm("fullName"),'_label->"FullName")
@helper.inputText(signupForm("emailAddress"),'_label->"EmailAddress")
@helper.inputPassword(signupForm("password"),'_label->"Password")
<divclass="controls">
<inputtype="submit"class="btnbtn-primary"value="CreateAccount"/>
</div>
}
IDE Support - Grails
IntelliJ Rocks!
IDE Support - Play
$ play idea
$ play eclipsify
Java!!!
Debugging Support via Remote Debugger
Limited Testing within IDE
Job - Grails
grails-app/jobs/happytrails/DailyRegionDigestEmailJob.groovy
packagehappytrails
importorg.grails.comments.Comment
classDailyRegionDigestEmailJob{
defmailService
statictriggers={
//simplerepeatInterval:5000l//executejoboncein5seconds
cronname:'cronTrigger',startDelay:10000,cronExpression:'007?*MON-FRI'
//7AMMon-Fri
}
defexecute(){
List<RegionUserDigest>digests=getRegionUserDigests()
for(digestindigests){
Stringmessage=createMessage(digest)
println"Sendingdigestemailto"+digest.user.username
Job - Play
Plain old `static void main`
Independent of web app
app/jobs/DailyRegionDigestEmailJob.java
publicclassDailyRegionDigestEmailJob{
publicstaticvoidmain(String[]args){
Applicationapplication=newApplication(newFile(args[0]),DailyRegionDigest
EmailJob.class.getClassLoader(),null,Mode.Prod());
Play.start(application);
List<RegionUserDigest>regionUserDigests=getRegionUserDigests();
Feed - Grails
1. grails install-plugin feeds
2. Add feed() method to controller
grails-app/controllers/happytrails/RegionController.groovy
deffeed={
defregion=Region.findBySeoName(params.region)
if(!region){
response.status=404
return
}
render(feedType:"atom"){
title="HappyTrailsFeedfor"+region.name
link=createLink(absolute: true,controller:'region',action:'feed',p
arams:['region',region.seoName])
description="NewRoutesandReviewsfor"+region.name
region.routes.each(){route->
entry(route.name){
link=createLink(absolute:true,controller:'route',action:'sh
ow',id:route.id)
route.description
}
}
}
Feed - Play
No direct RSS/Atom support
Dependency: "rome" % "rome" % "1.0"
app/jobs/DailyRegionDigestEmailJob.java
Regionregion=Region.findByUrlFriendlyName(urlFriendlyRegionName);
SyndFeedfeed=newSyndFeedImpl();
feed.setFeedType("rss_2.0");
feed.setTitle("UberTracks-"+region.getName());
feed.setLink("http://hike.ubertracks.com");//todo:externalizeURL
feed.setDescription("UpdatesforHikeUberTracks-"+region.getName());
Listentries=newArrayList();
for(Routeroute:region.routes){
SyndEntryentry=newSyndEntryImpl();
entry.setTitle("Route-"+route.getName());
Email - Grails
* powered by the (built-in)
grails-app/jobs/happytrails/DailyRegionDigestEmailJob.groovy
println"Sendingdigestemailto"+digest.user.username
mailService.sendMail{
todigest.getUser().username
subject"UpdatesfromÃ​berTracks"+digest.regions
bodymessage
}
mail plugin
Email - Play
SendGrid Heroku Add-on
Dependency:
"com.typesafe" %% "play-plugins-mailer" % "2.0.2"
app/jobs/DailyRegionDigestEmailJob.java
MailerAPImail=play.Play.application().plugin(MailerPlugin.class).email();
mail.setSubject("UberTracksRegionUpdates");
mail.addRecipient(regionUserDigest.user.getEmailAddress());
mail.addFrom("noreply@ubertracks.com");
mail.send(emailContent);
conf/prod.conf
smtp.host=smtp.sendgrid.net
smtp.port=587
smtp.ssl=true
smtp.user=${SENDGRID_USERNAME}
smtp.password=${SENDGRID_PASSWORD}
Photo Upload - Grails
Photo Upload - Play
Amazon S3 for Persistent File Storage
app/models/S3Photo.java
PutObjectRequestputObjectRequest=newPutObjectRequest(bucket,key,inputStream,objectM
etadata);
putObjectRequest.withCannedAcl(CannedAccessControlList.PublicRead);
if(S3Blob.amazonS3==null){
Logger.error("CloudnotsavePhotobecauseamazonS3wasnull");
}
else{
S3Blob.amazonS3.putObject(putObjectRequest);
}
app/controllers/RegionController.java
Http.MultipartFormData.FilePartphotoFilePart=request().body()
.asMultipartFormData().getFile("photo");
Testing - Grails
Unit Tests with @TestFor and @Mock
Test URL Mappings with UrlMappingsUnitTestMixin
Integration Testing with GroovyTestCase
Functional Testing with Geb
* Grails plugins often aren't in test scope.
test/unit/happytrails/RouteTests.groovy
packagehappytrails
importgrails.test.mixin.*
@TestFor(Route)
classRouteTests{
voidtestConstraints(){
defregion=newRegion(name:"Colorado")
defwhiteRanch=newRoute(name:"WhiteRanch",distance:12.0,location:"Gol
den,CO",region:region)
mockForConstraintsTests(Route,[whiteRanch])
//validationshouldfailifrequiredpropertiesarenull
defroute=newRoute()
assert!route.validate()
assert"nullable"==route.errors["name"]
Testing - Play
Standard JUnit
Unit Tests & Functional Tests
FakeApplication, FakeRequest, inMemoryDatabase
Test: Controllers, Views, Routing, Real Server, Browser
test/ApplicationControllerTest.java
@Test
publicvoidindex(){
running(fakeApplication(inMemoryDatabase()),newRunnable(){
publicvoidrun(){
DemoData.loadDemoData();
Resultresult=callAction(routes.ref.ApplicationController.index());
assertThat(status(result)).isEqualTo(OK);
assertThat(contentAsString(result)).contains(DemoData.CRESTED_BUTTE_COLORADO_R
EGION);
assertThat(contentAsString(result)).contains("<li>");
}
});
}
Demo Data - Grails
grails-app/conf/BootStrap.groovy
import happytrails.User
import happytrails.Region
import happytrails.Route
import happytrails.RegionSubscription
class BootStrap {
def init = { servletContext ->
if (!User.count()) {
User user = new User(username: "mraible@gmail.com", password: "happyhour",
name: "Matt Raible", enabled: true).save(failOnError: true)
User commentor = new User(username: "mraible+comments@gmail.com", password: "happyhour",
name: "Fitz Raible", enabled: true).save(failOnError: true)
Region frontRange = new Region(name: "Colorado Front Range").save(failOnError: true)
// Add routes
def whiteRanch = new Route(name: "White Ranch", distance: 10, location: "Golden, CO",
description: "Long uphill climb", region: frontRange).save(failOnError: true)
// Add comments
whiteRanch.addComment(commentor, "Coming down is the best!")
// Add a few ratings
whiteRanch.rate(user, 3)
Demo Data - Play
app/Global.java
publicvoidonStart(Applicationapplication){
//Ebean.getServer(null).getAdminLogging().setDebugGeneratedSql(true);
S3Blob.initialize(application);
//loadthedemodataindevmodeifnootherdataexists
if(Play.isDev()&&(User.find.all().size()==0)){
DemoData.loadDemoData();
}
super.onStart(application);
}
Configuration - Grails
grails-app/conf/Config.groovy
grails.app.context="/"
grails.project.groupId=appName//changethistoalterthedefaultpackagenameand
Mavenpublishingdestination
grails.mime.file.extensions=true//enablestheparsingoffileextensionsfromURLs
intotherequestformat
grails.mime.use.accept.header=false
grails.mime.types=[html:['text/html','application/xhtml+xml'],
xml:['text/xml','application/xml'],
text:'text/plain',
js:'text/javascript',
rss:'application/rss+xml',
atom:'application/atom+xml',
css:'text/css',
csv:'text/csv',
all:'*/*',
json:['application/json','text/json'],
form:'application/x-www-form-urlencoded',
multipartForm:'multipart/form-data'
]
Configuration - Play
Based on the TypeSafe Config Library
Override config with Java Properties:
-Dfoo=bar
Environment Variable substitution
Run with different config files:
-Dconfig.file=conf/prod.conf
conf/prod.conf
include"application.conf"
application.secret=${APPLICATION_SECRET}
db.default.driver=org.postgresql.Driver
db.default.url=${DATABASE_URL}
applyEvolutions.default=true
Authentication - Grails
Spring Security UI Plugin, “I love you!”
grails-app/conf/Config.groovy
grails.mail.default.from="BikeÃ​berTracks<bike@ubertracks.com>"
grails.plugins.springsecurity.ui.register.emailFrom=grails.mail.default.from
grails.plugins.springsecurity.ui.register.emailSubject='WelcometoÃ​berTracks!'
grails.plugins.springsecurity.ui.forgotPassword.emailFrom=grails.mail.default.from
grails.plugins.springsecurity.ui.forgotPassword.emailSubject='PasswordReset'
grails.plugins.springsecurity.controllerAnnotations.staticRules=[
'/user/**':['ROLE_ADMIN'],
'/role/**':['ROLE_ADMIN'],
'/registrationCode/**':['ROLE_ADMIN'],
'/securityInfo/**':['ROLE_ADMIN']
]
//AddedbytheSpringSecurityCoreplugin:
grails.plugins.springsecurity.userLookup.userDomainClassName='happytrails.User'
grails.plugins.springsecurity.userLookup.authorityJoinClassName='happytrails.UserRol
e'
grails.plugins.springsecurity.authority.className='happytrails.Role'
Authentication - Play
Uses cookies to remain stateless
app/controllers/Secured.java
publicclassSecuredextendsSecurity.Authenticator{
@Override
publicStringgetUsername(Contextctx){
//todo:needtomakesuretheuserisvalid,notjustthetoken
returnctx.session().get("token");
}
app/controllers/RegionController.java
@Security.Authenticated(Secured.class)
publicstaticResultaddRegion(){
returnok(views.html.regionForm.render(form(Region.class)));
}
Application Comparison
YSlow
PageSpeed
Lines of Code
Load Testing
Which Loads Faster?
Security Testing
YSlow
PageSpeed
Lines of Code
Load Testing with
BrowserMob
Bike (Grails) Hike (Play)
Load Testing - 1 Dyno
Load Testing - 1 Dyno
Bike (Grails) Hike (Play)
Load Testing - 5 Dynos
Load Testing - 5 Dynos
Load Testing - 2 Dynos (March
2013)
Grails
Play Framework
0 700 1,400 2,100 2,800
Requests / Second
Load Testing - 2 Dynos (Sept
2013)
Grails
Play Framework
0 70 140 210 280
Requests / Second
Load Testing - 5 Dynos + 100
users
Which Loads Faster?
Which Actually Loads Faster?
Pen Testing with OWASP ZAP
Grails 2 vs. Play 2
Jobs
LinkedIn Skills
Google Trends
Indeed
Mailing List Traffic
Books on Amazon
2012 Releases
Stack Overflow
Hacker News
Jobs
September 22, 2013
Grails
Play Framework
Spring MVC
0 400 800 1,200 1,600
Dice
Monster
Indeed
LinkedIn Skills
September 22, 2013
# People
4,000 8,000 12,000 16,000 20,000
Grails
Play Framework
Spring MVC
Google Trends
Grails Play
Indeed Job Trends
User Mailing List Traffic
Grails
Play Framework
700 900 1,100 1,300 1,500
March
April
May
June
July
August
Books on Amazon
September 2013
Grails
Play Framework
3
11
2013 Releases
Grails
Play Framework
8
10
2012 Releases
Grails
Play Framework
6
9
StackOverflow Questions
grails
playframework
5149
12978
Hacker News
Grails 2.0 released
Play Framework 2.0 Final released
6
195
Conclusions: Code
From a code perspective, very similar frameworks.
Code authoring good in both.
Grails Plugin Ecosystem is excellent.
TDD-Style Development easy with both.
Type-safety in Play 2 was really useful, especially
routes and upgrades.
Conclusions: Statistical
Analysis
Grails has better support for FEO (YSlow, PageSpeed)
Grails has less LOC! (4 more files, but 20% less code)
Apache Bench with 10K requests (2 Dynos):
Requests per second: {Play: 242, Grails:
257}
Caching significantly helps!
Conclusions: Ecosystem
Analysis
"Play" is difficult to search for.
Grails is more mature.
Play has momentum issues.
LinkedIn: more people know Grails than Spring MVC.
Play had 3x user mailing list traffic, but gap is
narrowing.
We had similar experiences with documentation and
questions.
Outdated documentation is a problem for both.
Play has way more hype!
Questions?
Source:
Branches: grails2, play2_java
Presentation*: master/preso
Contact Us:
* Presentation created with , and .
http://ubertracks.com
https://github.com/jamesward/happytrails
jamesward.com
raibledesigns.com
Reveal.js Google Charts GitHub Files
Action!
Learn something new*!
* Or prove that we're wrong...

Mais conteúdo relacionado

Mais procurados

Get Hip with JHipster - Colorado Springs OSS Meetup April 2016
Get Hip with JHipster - Colorado Springs OSS Meetup April 2016Get Hip with JHipster - Colorado Springs OSS Meetup April 2016
Get Hip with JHipster - Colorado Springs OSS Meetup April 2016Matt Raible
 
Get Hip with JHipster: Spring Boot + AngularJS + Bootstrap - Devoxx 2015
Get Hip with JHipster: Spring Boot + AngularJS + Bootstrap - Devoxx 2015Get Hip with JHipster: Spring Boot + AngularJS + Bootstrap - Devoxx 2015
Get Hip with JHipster: Spring Boot + AngularJS + Bootstrap - Devoxx 2015Matt Raible
 
Getting Started with Angular - Stormpath Webinar, January 2017
Getting Started with Angular - Stormpath Webinar, January 2017Getting Started with Angular - Stormpath Webinar, January 2017
Getting Started with Angular - Stormpath Webinar, January 2017Matt Raible
 
The Modern Java Web Developer Bootcamp - Devoxx 2013
The Modern Java Web Developer Bootcamp - Devoxx 2013The Modern Java Web Developer Bootcamp - Devoxx 2013
The Modern Java Web Developer Bootcamp - Devoxx 2013Matt Raible
 
Comparing Hot JavaScript Frameworks: AngularJS, Ember.js and React.js - Sprin...
Comparing Hot JavaScript Frameworks: AngularJS, Ember.js and React.js - Sprin...Comparing Hot JavaScript Frameworks: AngularJS, Ember.js and React.js - Sprin...
Comparing Hot JavaScript Frameworks: AngularJS, Ember.js and React.js - Sprin...Matt Raible
 
What's New in Spring 3.1
What's New in Spring 3.1What's New in Spring 3.1
What's New in Spring 3.1Matt Raible
 
Testing Angular 2 Applications - HTML5 Denver 2016
Testing Angular 2 Applications - HTML5 Denver 2016Testing Angular 2 Applications - HTML5 Denver 2016
Testing Angular 2 Applications - HTML5 Denver 2016Matt Raible
 
Java Web Application Security - Utah JUG 2011
Java Web Application Security - Utah JUG 2011Java Web Application Security - Utah JUG 2011
Java Web Application Security - Utah JUG 2011Matt Raible
 
The Art of Angular in 2016 - Devoxx France 2016
The Art of Angular in 2016 - Devoxx France 2016The Art of Angular in 2016 - Devoxx France 2016
The Art of Angular in 2016 - Devoxx France 2016Matt Raible
 
Clojure Web Development
Clojure Web DevelopmentClojure Web Development
Clojure Web DevelopmentHong Jiang
 
The Art of Angular in 2016 - vJUG24
The Art of Angular in 2016 - vJUG24The Art of Angular in 2016 - vJUG24
The Art of Angular in 2016 - vJUG24Matt Raible
 
Choosing a Java Web Framework
Choosing a Java Web FrameworkChoosing a Java Web Framework
Choosing a Java Web FrameworkWill Iverson
 
The Modern Java Web Developer - JavaOne 2013
The Modern Java Web Developer - JavaOne 2013The Modern Java Web Developer - JavaOne 2013
The Modern Java Web Developer - JavaOne 2013Matt Raible
 
A Gentle Introduction to Angular Schematics - Angular SF 2019
A Gentle Introduction to Angular Schematics - Angular SF 2019A Gentle Introduction to Angular Schematics - Angular SF 2019
A Gentle Introduction to Angular Schematics - Angular SF 2019Matt Raible
 
The Art of AngularJS in 2015 - Angular Summit 2015
The Art of AngularJS in 2015 - Angular Summit 2015The Art of AngularJS in 2015 - Angular Summit 2015
The Art of AngularJS in 2015 - Angular Summit 2015Matt Raible
 
A Gentle Introduction to Angular Schematics - Devoxx Belgium 2019
A Gentle Introduction to Angular Schematics - Devoxx Belgium 2019A Gentle Introduction to Angular Schematics - Devoxx Belgium 2019
A Gentle Introduction to Angular Schematics - Devoxx Belgium 2019Matt Raible
 
Play Framework on Google App Engine - Productivity Stack
Play Framework on Google App Engine - Productivity StackPlay Framework on Google App Engine - Productivity Stack
Play Framework on Google App Engine - Productivity StackMarcin Stepien
 
Microservices for the Masses with Spring Boot, JHipster, and JWT - Rich Web 2016
Microservices for the Masses with Spring Boot, JHipster, and JWT - Rich Web 2016Microservices for the Masses with Spring Boot, JHipster, and JWT - Rich Web 2016
Microservices for the Masses with Spring Boot, JHipster, and JWT - Rich Web 2016Matt Raible
 
Testing Mobile JavaScript
Testing Mobile JavaScriptTesting Mobile JavaScript
Testing Mobile JavaScriptjeresig
 
Web Frameworks of the Future: Flex, GWT, Grails and Rails
Web Frameworks of the Future: Flex, GWT, Grails and RailsWeb Frameworks of the Future: Flex, GWT, Grails and Rails
Web Frameworks of the Future: Flex, GWT, Grails and RailsMatt Raible
 

Mais procurados (20)

Get Hip with JHipster - Colorado Springs OSS Meetup April 2016
Get Hip with JHipster - Colorado Springs OSS Meetup April 2016Get Hip with JHipster - Colorado Springs OSS Meetup April 2016
Get Hip with JHipster - Colorado Springs OSS Meetup April 2016
 
Get Hip with JHipster: Spring Boot + AngularJS + Bootstrap - Devoxx 2015
Get Hip with JHipster: Spring Boot + AngularJS + Bootstrap - Devoxx 2015Get Hip with JHipster: Spring Boot + AngularJS + Bootstrap - Devoxx 2015
Get Hip with JHipster: Spring Boot + AngularJS + Bootstrap - Devoxx 2015
 
Getting Started with Angular - Stormpath Webinar, January 2017
Getting Started with Angular - Stormpath Webinar, January 2017Getting Started with Angular - Stormpath Webinar, January 2017
Getting Started with Angular - Stormpath Webinar, January 2017
 
The Modern Java Web Developer Bootcamp - Devoxx 2013
The Modern Java Web Developer Bootcamp - Devoxx 2013The Modern Java Web Developer Bootcamp - Devoxx 2013
The Modern Java Web Developer Bootcamp - Devoxx 2013
 
Comparing Hot JavaScript Frameworks: AngularJS, Ember.js and React.js - Sprin...
Comparing Hot JavaScript Frameworks: AngularJS, Ember.js and React.js - Sprin...Comparing Hot JavaScript Frameworks: AngularJS, Ember.js and React.js - Sprin...
Comparing Hot JavaScript Frameworks: AngularJS, Ember.js and React.js - Sprin...
 
What's New in Spring 3.1
What's New in Spring 3.1What's New in Spring 3.1
What's New in Spring 3.1
 
Testing Angular 2 Applications - HTML5 Denver 2016
Testing Angular 2 Applications - HTML5 Denver 2016Testing Angular 2 Applications - HTML5 Denver 2016
Testing Angular 2 Applications - HTML5 Denver 2016
 
Java Web Application Security - Utah JUG 2011
Java Web Application Security - Utah JUG 2011Java Web Application Security - Utah JUG 2011
Java Web Application Security - Utah JUG 2011
 
The Art of Angular in 2016 - Devoxx France 2016
The Art of Angular in 2016 - Devoxx France 2016The Art of Angular in 2016 - Devoxx France 2016
The Art of Angular in 2016 - Devoxx France 2016
 
Clojure Web Development
Clojure Web DevelopmentClojure Web Development
Clojure Web Development
 
The Art of Angular in 2016 - vJUG24
The Art of Angular in 2016 - vJUG24The Art of Angular in 2016 - vJUG24
The Art of Angular in 2016 - vJUG24
 
Choosing a Java Web Framework
Choosing a Java Web FrameworkChoosing a Java Web Framework
Choosing a Java Web Framework
 
The Modern Java Web Developer - JavaOne 2013
The Modern Java Web Developer - JavaOne 2013The Modern Java Web Developer - JavaOne 2013
The Modern Java Web Developer - JavaOne 2013
 
A Gentle Introduction to Angular Schematics - Angular SF 2019
A Gentle Introduction to Angular Schematics - Angular SF 2019A Gentle Introduction to Angular Schematics - Angular SF 2019
A Gentle Introduction to Angular Schematics - Angular SF 2019
 
The Art of AngularJS in 2015 - Angular Summit 2015
The Art of AngularJS in 2015 - Angular Summit 2015The Art of AngularJS in 2015 - Angular Summit 2015
The Art of AngularJS in 2015 - Angular Summit 2015
 
A Gentle Introduction to Angular Schematics - Devoxx Belgium 2019
A Gentle Introduction to Angular Schematics - Devoxx Belgium 2019A Gentle Introduction to Angular Schematics - Devoxx Belgium 2019
A Gentle Introduction to Angular Schematics - Devoxx Belgium 2019
 
Play Framework on Google App Engine - Productivity Stack
Play Framework on Google App Engine - Productivity StackPlay Framework on Google App Engine - Productivity Stack
Play Framework on Google App Engine - Productivity Stack
 
Microservices for the Masses with Spring Boot, JHipster, and JWT - Rich Web 2016
Microservices for the Masses with Spring Boot, JHipster, and JWT - Rich Web 2016Microservices for the Masses with Spring Boot, JHipster, and JWT - Rich Web 2016
Microservices for the Masses with Spring Boot, JHipster, and JWT - Rich Web 2016
 
Testing Mobile JavaScript
Testing Mobile JavaScriptTesting Mobile JavaScript
Testing Mobile JavaScript
 
Web Frameworks of the Future: Flex, GWT, Grails and Rails
Web Frameworks of the Future: Flex, GWT, Grails and RailsWeb Frameworks of the Future: Flex, GWT, Grails and Rails
Web Frameworks of the Future: Flex, GWT, Grails and Rails
 

Semelhante a Play Framework vs Grails Smackdown - JavaOne 2013

Running your Java EE 6 Apps in the Cloud - JavaOne India 2011
Running your Java EE 6 Apps in the Cloud - JavaOne India 2011Running your Java EE 6 Apps in the Cloud - JavaOne India 2011
Running your Java EE 6 Apps in the Cloud - JavaOne India 2011Arun Gupta
 
JavaOne India 2011 - Running your Java EE 6 Apps in the Cloud
JavaOne India 2011 - Running your Java EE 6 Apps in the CloudJavaOne India 2011 - Running your Java EE 6 Apps in the Cloud
JavaOne India 2011 - Running your Java EE 6 Apps in the CloudArun Gupta
 
Web Performance Part 4 "Client-side performance"
Web Performance Part 4  "Client-side performance"Web Performance Part 4  "Client-side performance"
Web Performance Part 4 "Client-side performance"Binary Studio
 
Running your Java EE 6 applications in the Cloud (FISL 12)
Running your Java EE 6 applications in the Cloud (FISL 12)Running your Java EE 6 applications in the Cloud (FISL 12)
Running your Java EE 6 applications in the Cloud (FISL 12)Arun Gupta
 
Running your Java EE 6 Applications in the Cloud
Running your Java EE 6 Applications in the CloudRunning your Java EE 6 Applications in the Cloud
Running your Java EE 6 Applications in the CloudArun Gupta
 
Running your Java EE 6 applications in the Cloud
Running your Java EE 6 applications in the CloudRunning your Java EE 6 applications in the Cloud
Running your Java EE 6 applications in the CloudArun Gupta
 
JFokus 2011 - Running your Java EE 6 apps in the Cloud
JFokus 2011 - Running your Java EE 6 apps in the CloudJFokus 2011 - Running your Java EE 6 apps in the Cloud
JFokus 2011 - Running your Java EE 6 apps in the CloudArun Gupta
 
Lean microservices through ahead of time compilation (Tobias Piper, Loveholid...
Lean microservices through ahead of time compilation (Tobias Piper, Loveholid...Lean microservices through ahead of time compilation (Tobias Piper, Loveholid...
Lean microservices through ahead of time compilation (Tobias Piper, Loveholid...London Microservices
 
Dynamic Languages Web Frameworks Indicthreads 2009
Dynamic Languages Web Frameworks Indicthreads 2009Dynamic Languages Web Frameworks Indicthreads 2009
Dynamic Languages Web Frameworks Indicthreads 2009Arun Gupta
 
Running your Java EE 6 applications in the Cloud @ Silicon Valley Code Camp 2010
Running your Java EE 6 applications in the Cloud @ Silicon Valley Code Camp 2010Running your Java EE 6 applications in the Cloud @ Silicon Valley Code Camp 2010
Running your Java EE 6 applications in the Cloud @ Silicon Valley Code Camp 2010Arun Gupta
 
20151010 my sq-landjavav2a
20151010 my sq-landjavav2a20151010 my sq-landjavav2a
20151010 my sq-landjavav2aIvan Ma
 
Jwis2011 ruo ando
Jwis2011 ruo andoJwis2011 ruo ando
Jwis2011 ruo andoRuo Ando
 
Running your Java EE 6 applications in the clouds
Running your Java EE 6 applications in the clouds Running your Java EE 6 applications in the clouds
Running your Java EE 6 applications in the clouds Arun Gupta
 
GR8Conf 2011: Adopting Grails
GR8Conf 2011: Adopting GrailsGR8Conf 2011: Adopting Grails
GR8Conf 2011: Adopting GrailsGR8Conf
 
Adopting Grails - GR8Conf Europe
Adopting Grails - GR8Conf EuropeAdopting Grails - GR8Conf Europe
Adopting Grails - GR8Conf EuropeKlausBaumecker
 
Haj 4344-java se 9 and the application server-1
Haj 4344-java se 9 and the application server-1Haj 4344-java se 9 and the application server-1
Haj 4344-java se 9 and the application server-1Kevin Sutter
 
Continuous Deployment: The Dirty Details
Continuous Deployment: The Dirty DetailsContinuous Deployment: The Dirty Details
Continuous Deployment: The Dirty DetailsMike Brittain
 
Accelerating Deep Learning Training with BigDL and Drizzle on Apache Spark wi...
Accelerating Deep Learning Training with BigDL and Drizzle on Apache Spark wi...Accelerating Deep Learning Training with BigDL and Drizzle on Apache Spark wi...
Accelerating Deep Learning Training with BigDL and Drizzle on Apache Spark wi...Databricks
 

Semelhante a Play Framework vs Grails Smackdown - JavaOne 2013 (20)

Running your Java EE 6 Apps in the Cloud - JavaOne India 2011
Running your Java EE 6 Apps in the Cloud - JavaOne India 2011Running your Java EE 6 Apps in the Cloud - JavaOne India 2011
Running your Java EE 6 Apps in the Cloud - JavaOne India 2011
 
JavaOne India 2011 - Running your Java EE 6 Apps in the Cloud
JavaOne India 2011 - Running your Java EE 6 Apps in the CloudJavaOne India 2011 - Running your Java EE 6 Apps in the Cloud
JavaOne India 2011 - Running your Java EE 6 Apps in the Cloud
 
Web Performance Part 4 "Client-side performance"
Web Performance Part 4  "Client-side performance"Web Performance Part 4  "Client-side performance"
Web Performance Part 4 "Client-side performance"
 
Running your Java EE 6 applications in the Cloud (FISL 12)
Running your Java EE 6 applications in the Cloud (FISL 12)Running your Java EE 6 applications in the Cloud (FISL 12)
Running your Java EE 6 applications in the Cloud (FISL 12)
 
Running your Java EE 6 Applications in the Cloud
Running your Java EE 6 Applications in the CloudRunning your Java EE 6 Applications in the Cloud
Running your Java EE 6 Applications in the Cloud
 
Running your Java EE 6 applications in the Cloud
Running your Java EE 6 applications in the CloudRunning your Java EE 6 applications in the Cloud
Running your Java EE 6 applications in the Cloud
 
JFokus 2011 - Running your Java EE 6 apps in the Cloud
JFokus 2011 - Running your Java EE 6 apps in the CloudJFokus 2011 - Running your Java EE 6 apps in the Cloud
JFokus 2011 - Running your Java EE 6 apps in the Cloud
 
Lean microservices through ahead of time compilation (Tobias Piper, Loveholid...
Lean microservices through ahead of time compilation (Tobias Piper, Loveholid...Lean microservices through ahead of time compilation (Tobias Piper, Loveholid...
Lean microservices through ahead of time compilation (Tobias Piper, Loveholid...
 
Dynamic Languages Web Frameworks Indicthreads 2009
Dynamic Languages Web Frameworks Indicthreads 2009Dynamic Languages Web Frameworks Indicthreads 2009
Dynamic Languages Web Frameworks Indicthreads 2009
 
Running your Java EE 6 applications in the Cloud @ Silicon Valley Code Camp 2010
Running your Java EE 6 applications in the Cloud @ Silicon Valley Code Camp 2010Running your Java EE 6 applications in the Cloud @ Silicon Valley Code Camp 2010
Running your Java EE 6 applications in the Cloud @ Silicon Valley Code Camp 2010
 
20151010 my sq-landjavav2a
20151010 my sq-landjavav2a20151010 my sq-landjavav2a
20151010 my sq-landjavav2a
 
Jwis2011 ruo ando
Jwis2011 ruo andoJwis2011 ruo ando
Jwis2011 ruo ando
 
Grails 2.0 Update
Grails 2.0 UpdateGrails 2.0 Update
Grails 2.0 Update
 
Running your Java EE 6 applications in the clouds
Running your Java EE 6 applications in the clouds Running your Java EE 6 applications in the clouds
Running your Java EE 6 applications in the clouds
 
GR8Conf 2011: Adopting Grails
GR8Conf 2011: Adopting GrailsGR8Conf 2011: Adopting Grails
GR8Conf 2011: Adopting Grails
 
Adopting Grails - GR8Conf Europe
Adopting Grails - GR8Conf EuropeAdopting Grails - GR8Conf Europe
Adopting Grails - GR8Conf Europe
 
Grails 101
Grails 101Grails 101
Grails 101
 
Haj 4344-java se 9 and the application server-1
Haj 4344-java se 9 and the application server-1Haj 4344-java se 9 and the application server-1
Haj 4344-java se 9 and the application server-1
 
Continuous Deployment: The Dirty Details
Continuous Deployment: The Dirty DetailsContinuous Deployment: The Dirty Details
Continuous Deployment: The Dirty Details
 
Accelerating Deep Learning Training with BigDL and Drizzle on Apache Spark wi...
Accelerating Deep Learning Training with BigDL and Drizzle on Apache Spark wi...Accelerating Deep Learning Training with BigDL and Drizzle on Apache Spark wi...
Accelerating Deep Learning Training with BigDL and Drizzle on Apache Spark wi...
 

Mais de Matt Raible

Keep Identities in Sync the SCIMple Way - ApacheCon NA 2022
Keep Identities in Sync the SCIMple Way - ApacheCon NA 2022Keep Identities in Sync the SCIMple Way - ApacheCon NA 2022
Keep Identities in Sync the SCIMple Way - ApacheCon NA 2022Matt Raible
 
Micro Frontends for Java Microservices - Belfast JUG 2022
Micro Frontends for Java Microservices - Belfast JUG 2022Micro Frontends for Java Microservices - Belfast JUG 2022
Micro Frontends for Java Microservices - Belfast JUG 2022Matt Raible
 
Micro Frontends for Java Microservices - Dublin JUG 2022
Micro Frontends for Java Microservices - Dublin JUG 2022Micro Frontends for Java Microservices - Dublin JUG 2022
Micro Frontends for Java Microservices - Dublin JUG 2022Matt Raible
 
Micro Frontends for Java Microservices - Cork JUG 2022
Micro Frontends for Java Microservices - Cork JUG 2022Micro Frontends for Java Microservices - Cork JUG 2022
Micro Frontends for Java Microservices - Cork JUG 2022Matt Raible
 
Comparing Native Java REST API Frameworks - Seattle JUG 2022
Comparing Native Java REST API Frameworks - Seattle JUG 2022Comparing Native Java REST API Frameworks - Seattle JUG 2022
Comparing Native Java REST API Frameworks - Seattle JUG 2022Matt Raible
 
Reactive Java Microservices with Spring Boot and JHipster - Spring I/O 2022
Reactive Java Microservices with Spring Boot and JHipster - Spring I/O 2022Reactive Java Microservices with Spring Boot and JHipster - Spring I/O 2022
Reactive Java Microservices with Spring Boot and JHipster - Spring I/O 2022Matt Raible
 
Comparing Native Java REST API Frameworks - Devoxx France 2022
Comparing Native Java REST API Frameworks - Devoxx France 2022Comparing Native Java REST API Frameworks - Devoxx France 2022
Comparing Native Java REST API Frameworks - Devoxx France 2022Matt Raible
 
Lock That Sh*t Down! Auth Security Patterns for Apps, APIs, and Infra - Devne...
Lock That Sh*t Down! Auth Security Patterns for Apps, APIs, and Infra - Devne...Lock That Sh*t Down! Auth Security Patterns for Apps, APIs, and Infra - Devne...
Lock That Sh*t Down! Auth Security Patterns for Apps, APIs, and Infra - Devne...Matt Raible
 
Native Java with Spring Boot and JHipster - Garden State JUG 2021
Native Java with Spring Boot and JHipster - Garden State JUG 2021Native Java with Spring Boot and JHipster - Garden State JUG 2021
Native Java with Spring Boot and JHipster - Garden State JUG 2021Matt Raible
 
Java REST API Framework Comparison - PWX 2021
Java REST API Framework Comparison - PWX 2021Java REST API Framework Comparison - PWX 2021
Java REST API Framework Comparison - PWX 2021Matt Raible
 
Web App Security for Java Developers - PWX 2021
Web App Security for Java Developers - PWX 2021Web App Security for Java Developers - PWX 2021
Web App Security for Java Developers - PWX 2021Matt Raible
 
Mobile App Development with Ionic, React Native, and JHipster - Connect.Tech ...
Mobile App Development with Ionic, React Native, and JHipster - Connect.Tech ...Mobile App Development with Ionic, React Native, and JHipster - Connect.Tech ...
Mobile App Development with Ionic, React Native, and JHipster - Connect.Tech ...Matt Raible
 
Lock That Shit Down! Auth Security Patterns for Apps, APIs, and Infra - Joker...
Lock That Shit Down! Auth Security Patterns for Apps, APIs, and Infra - Joker...Lock That Shit Down! Auth Security Patterns for Apps, APIs, and Infra - Joker...
Lock That Shit Down! Auth Security Patterns for Apps, APIs, and Infra - Joker...Matt Raible
 
Web App Security for Java Developers - UberConf 2021
Web App Security for Java Developers - UberConf 2021Web App Security for Java Developers - UberConf 2021
Web App Security for Java Developers - UberConf 2021Matt Raible
 
Java REST API Framework Comparison - UberConf 2021
Java REST API Framework Comparison - UberConf 2021Java REST API Framework Comparison - UberConf 2021
Java REST API Framework Comparison - UberConf 2021Matt Raible
 
Native Java with Spring Boot and JHipster - SF JUG 2021
Native Java with Spring Boot and JHipster - SF JUG 2021Native Java with Spring Boot and JHipster - SF JUG 2021
Native Java with Spring Boot and JHipster - SF JUG 2021Matt Raible
 
Lock That Shit Down! Auth Security Patterns for Apps, APIs, and Infra - Sprin...
Lock That Shit Down! Auth Security Patterns for Apps, APIs, and Infra - Sprin...Lock That Shit Down! Auth Security Patterns for Apps, APIs, and Infra - Sprin...
Lock That Shit Down! Auth Security Patterns for Apps, APIs, and Infra - Sprin...Matt Raible
 
Reactive Java Microservices with Spring Boot and JHipster - Denver JUG 2021
Reactive Java Microservices with Spring Boot and JHipster - Denver JUG 2021Reactive Java Microservices with Spring Boot and JHipster - Denver JUG 2021
Reactive Java Microservices with Spring Boot and JHipster - Denver JUG 2021Matt Raible
 
Get Hip with JHipster - Colorado Springs Open Source User Group 2021
Get Hip with JHipster - Colorado Springs Open Source User Group 2021Get Hip with JHipster - Colorado Springs Open Source User Group 2021
Get Hip with JHipster - Colorado Springs Open Source User Group 2021Matt Raible
 
JHipster and Okta - JHipster Virtual Meetup December 2020
JHipster and Okta - JHipster Virtual Meetup December 2020JHipster and Okta - JHipster Virtual Meetup December 2020
JHipster and Okta - JHipster Virtual Meetup December 2020Matt Raible
 

Mais de Matt Raible (20)

Keep Identities in Sync the SCIMple Way - ApacheCon NA 2022
Keep Identities in Sync the SCIMple Way - ApacheCon NA 2022Keep Identities in Sync the SCIMple Way - ApacheCon NA 2022
Keep Identities in Sync the SCIMple Way - ApacheCon NA 2022
 
Micro Frontends for Java Microservices - Belfast JUG 2022
Micro Frontends for Java Microservices - Belfast JUG 2022Micro Frontends for Java Microservices - Belfast JUG 2022
Micro Frontends for Java Microservices - Belfast JUG 2022
 
Micro Frontends for Java Microservices - Dublin JUG 2022
Micro Frontends for Java Microservices - Dublin JUG 2022Micro Frontends for Java Microservices - Dublin JUG 2022
Micro Frontends for Java Microservices - Dublin JUG 2022
 
Micro Frontends for Java Microservices - Cork JUG 2022
Micro Frontends for Java Microservices - Cork JUG 2022Micro Frontends for Java Microservices - Cork JUG 2022
Micro Frontends for Java Microservices - Cork JUG 2022
 
Comparing Native Java REST API Frameworks - Seattle JUG 2022
Comparing Native Java REST API Frameworks - Seattle JUG 2022Comparing Native Java REST API Frameworks - Seattle JUG 2022
Comparing Native Java REST API Frameworks - Seattle JUG 2022
 
Reactive Java Microservices with Spring Boot and JHipster - Spring I/O 2022
Reactive Java Microservices with Spring Boot and JHipster - Spring I/O 2022Reactive Java Microservices with Spring Boot and JHipster - Spring I/O 2022
Reactive Java Microservices with Spring Boot and JHipster - Spring I/O 2022
 
Comparing Native Java REST API Frameworks - Devoxx France 2022
Comparing Native Java REST API Frameworks - Devoxx France 2022Comparing Native Java REST API Frameworks - Devoxx France 2022
Comparing Native Java REST API Frameworks - Devoxx France 2022
 
Lock That Sh*t Down! Auth Security Patterns for Apps, APIs, and Infra - Devne...
Lock That Sh*t Down! Auth Security Patterns for Apps, APIs, and Infra - Devne...Lock That Sh*t Down! Auth Security Patterns for Apps, APIs, and Infra - Devne...
Lock That Sh*t Down! Auth Security Patterns for Apps, APIs, and Infra - Devne...
 
Native Java with Spring Boot and JHipster - Garden State JUG 2021
Native Java with Spring Boot and JHipster - Garden State JUG 2021Native Java with Spring Boot and JHipster - Garden State JUG 2021
Native Java with Spring Boot and JHipster - Garden State JUG 2021
 
Java REST API Framework Comparison - PWX 2021
Java REST API Framework Comparison - PWX 2021Java REST API Framework Comparison - PWX 2021
Java REST API Framework Comparison - PWX 2021
 
Web App Security for Java Developers - PWX 2021
Web App Security for Java Developers - PWX 2021Web App Security for Java Developers - PWX 2021
Web App Security for Java Developers - PWX 2021
 
Mobile App Development with Ionic, React Native, and JHipster - Connect.Tech ...
Mobile App Development with Ionic, React Native, and JHipster - Connect.Tech ...Mobile App Development with Ionic, React Native, and JHipster - Connect.Tech ...
Mobile App Development with Ionic, React Native, and JHipster - Connect.Tech ...
 
Lock That Shit Down! Auth Security Patterns for Apps, APIs, and Infra - Joker...
Lock That Shit Down! Auth Security Patterns for Apps, APIs, and Infra - Joker...Lock That Shit Down! Auth Security Patterns for Apps, APIs, and Infra - Joker...
Lock That Shit Down! Auth Security Patterns for Apps, APIs, and Infra - Joker...
 
Web App Security for Java Developers - UberConf 2021
Web App Security for Java Developers - UberConf 2021Web App Security for Java Developers - UberConf 2021
Web App Security for Java Developers - UberConf 2021
 
Java REST API Framework Comparison - UberConf 2021
Java REST API Framework Comparison - UberConf 2021Java REST API Framework Comparison - UberConf 2021
Java REST API Framework Comparison - UberConf 2021
 
Native Java with Spring Boot and JHipster - SF JUG 2021
Native Java with Spring Boot and JHipster - SF JUG 2021Native Java with Spring Boot and JHipster - SF JUG 2021
Native Java with Spring Boot and JHipster - SF JUG 2021
 
Lock That Shit Down! Auth Security Patterns for Apps, APIs, and Infra - Sprin...
Lock That Shit Down! Auth Security Patterns for Apps, APIs, and Infra - Sprin...Lock That Shit Down! Auth Security Patterns for Apps, APIs, and Infra - Sprin...
Lock That Shit Down! Auth Security Patterns for Apps, APIs, and Infra - Sprin...
 
Reactive Java Microservices with Spring Boot and JHipster - Denver JUG 2021
Reactive Java Microservices with Spring Boot and JHipster - Denver JUG 2021Reactive Java Microservices with Spring Boot and JHipster - Denver JUG 2021
Reactive Java Microservices with Spring Boot and JHipster - Denver JUG 2021
 
Get Hip with JHipster - Colorado Springs Open Source User Group 2021
Get Hip with JHipster - Colorado Springs Open Source User Group 2021Get Hip with JHipster - Colorado Springs Open Source User Group 2021
Get Hip with JHipster - Colorado Springs Open Source User Group 2021
 
JHipster and Okta - JHipster Virtual Meetup December 2020
JHipster and Okta - JHipster Virtual Meetup December 2020JHipster and Okta - JHipster Virtual Meetup December 2020
JHipster and Okta - JHipster Virtual Meetup December 2020
 

Último

Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxKatpro Technologies
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processorsdebabhi2
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUK Journal
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreternaman860154
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Drew Madelung
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfEnterprise Knowledge
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Enterprise Knowledge
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonetsnaman860154
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024The Digital Insurer
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Scriptwesley chun
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking MenDelhi Call girls
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdfhans926745
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Servicegiselly40
 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024Results
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEarley Information Science
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityPrincipled Technologies
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘RTylerCroy
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonAnna Loughnan Colquhoun
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Igalia
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking MenDelhi Call girls
 

Último (20)

Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreter
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
 

Play Framework vs Grails Smackdown - JavaOne 2013