Step-by-Step for a Simple Twitter with Play Framework, AJAX, CRUD and Heroku
Step-by-Step for a Simple Twitter with Play Framework, AJAX, CRUD and Heroku
Join the DZone community and get the full member experience.
Join For Free
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.
Opinions expressed by DZone contributors are their own.
{{ parent.title || parent.header.title}}
{{ parent.tldr }}
{{ parent.linkDescription }}
{{ parent.urlSource.name }}