Step-by-Step for a Simple Twitter with Play Framework, AJAX, CRUD and Heroku
So the big announcement is out---Heroku started offering native support to Play Framework applications! If you haven't heard it, checkout the post from Jesper Joergensen on Heroku's blog.
So for the presentation, I am setting up a very basic Twitter clone; it's meant to be simple yet it displays just enough of the productivity that Play! provides. I am gonna go through the steps to setup the demo application which should cover what was announced on Heroku's blog post but with a little more depth.
play new twitter
- play -> crud
play dependencies
play eclipsify (for Eclipse), play idealize (for IntelliJ) or play netbeansify (for Netbeans).
package models;
import java.util.Date;
import java.util.List;
import javax.persistence.Entity;
import play.data.validation.MaxSize;
import play.data.validation.Required;
import play.db.jpa.Model;
@Entity
public class Tweet extends Model {
@Required
@MaxSize(140)
public String tweet;
@Required
public Date createDate = new Date();
public static List findLatest() {
return Tweet.find("order by createDate desc").fetch();
}
@Override
public String toString() {
return this.tweet;
}
}
db=${DATABASE_URL}
package controllers;
import java.util.List;
import models.Tweet;
import play.mvc.Controller;
public class Application extends Controller {
public static void index() {
List tweets = Tweet.findLatest();
render(tweets);
}
public static void create(String msg) {
Tweet tweet = new Tweet();
tweet.tweet = msg;
tweet.save();
render(tweet);
}
public static void tweets() {
List tweets = Tweet.findLatest();
renderJSON(tweets);
}
}
#{extends 'main.html' /}
#{set title:'Home' /}
<!-- Create Tweet Form -->
<form> <input name="tweet" type="text" />
<input type="submit" value="Tweet" /> </form><!-- Latest Tweets List -->
<ul> #{list tweets}
<li>${_.tweet} (${_.createDate.since()})</li><p><p>
#{/list}</ul>
<!-- JS -->
<script type="text/javascript">
// Capture Form Submit Event
$('form').submit(function() {
// Define Create Action
var createAction = #{jsAction @create(':tweet') /}
// Call Create Action
$.post(createAction({tweet: $('input:first').val()}), function(data) {
// Prepend Results to the List
$('ul').prepend(data);
$('input:first').val('');
});
// Don't let the browser redirect
return false;
});
</script>
<!-- Single Item Render (after save action) -->
<li><code>${tweet.tweet} (${tweet.createDate.since()})</li>
import models.Tweet;
import org.junit.Assert;
import org.junit.Test;
import play.test.UnitTest;
public class TweetTest extends UnitTest {
@Test
public void testModelSave() {
long count = Tweet.count();
Tweet t = new Tweet();
t.tweet = "my sample tweet";
t.save();
long count2 = Tweet.count();
Assert.assertEquals(count + 1, count2);
}
}
package controllers;
public class Tweets extends CRUD {
}
* /admin module:crud
tweet=Tweet
createDate=Date Created
web: play run --%$FRAMEWORK_ID --http.port=$PORT -DusePrecompiled=$USE_PRECOMPILED -DDATABASE_URL=mem
play run --%dev -DusePrecompiled=false -DDATABASE_URL=mem
heroku create play-twitter --stack cedar
git init; git add .; git commit -a -m "Initial Commit"; git remote add heroku git@heroku.com:play-twitter.git
heroku config:add FRAMEWORK_ID=prod; heroku config:add USE_PRECOMPILED=true
git push heroku master
heroku logs
heroku addons:add shared-database
You can checkout a live demo here, the admin interface here or clone the source code on Github.
Voila! Now Go Play!
Originally posted at geeks.aretotally.in/twitter-playframework-heroku.
(Note: Opinions expressed in this article and its replies are the opinions of their respective authors and not those of DZone, Inc.)






Comments
John David replied on Thu, 2012/01/26 - 3:24am
Hi,
great post thanks!
I’m trying to deploy a Play app on Heroku, I have a little problem with the shared database.
When I deploy the app with “git push” I have this message :
WARNING: Cannot replace DATABASE_URL in configuration (db=${DATABASE_URL})
Did I miss something?
Java Eclipse