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

Generative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information DevelopersGenerative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information DevelopersRaghuram Pandurangan
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxA Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxLoriGlavin3
 
DSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningDSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningLars Bell
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024Stephanie Beckett
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupFlorian Wilhelm
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 3652toLead Limited
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationSlibray Presentation
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfAlex Barbosa Coqueiro
 
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxDigital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxLoriGlavin3
 
The State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxThe State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxLoriGlavin3
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenHervé Boutemy
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek SchlawackFwdays
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii SoldatenkoFwdays
 
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc
 
unit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptxunit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptxBkGupta21
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brandgvaughan
 
Take control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteTake control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteDianaGray10
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsSergiu Bodiu
 

Último (20)

Generative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information DevelopersGenerative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information Developers
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxA Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
 
DSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningDSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine Tuning
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project Setup
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck Presentation
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdf
 
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxDigital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
 
The State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxThe State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptx
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache Maven
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko
 
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
 
unit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptxunit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptx
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brand
 
Take control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteTake control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test Suite
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platforms
 

Play Framework vs Grails Smackdown - JavaOne 2013