Статьи

Простой Твиттер: Play Framework, AJAX, CRUD на Heroku

Итак, большой анонс — Heroku начала предлагать встроенную поддержку приложений Play Framework! Если вы этого не слышали, ознакомьтесь с постом Джеспера Йоргенсена в блоге Heroku.

Итак, для презентации я настраиваю очень простой клон Twitter; это должно быть просто, но в то же время отображает достаточно производительности, что Play! обеспечивает. Я собираюсь пройти шаги по настройке демо-приложения, которое должно охватывать то, что было объявлено в блоге Heroku, но с чуть большей глубиной.

Первый шаг давайте создадим приложение

1
play new twitter

Добавить зависимость к модулю CRUD (conf / dependencies.yml)

1
- play -> crud

Получить зависимости

1
play dependencies

Интеграция с IDE

(для затмения)

1
play eclipsify

(для IntelliJ)

1
play idealize

(для Netbeans)

1
play netbeansify

Создать модель (app / models / Tweet.java)

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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;
    }
 
}

Определить базу данных для моделей JPA (conf / application.conf)

1
db=${DATABASE_URL}

Добавить действия контроллера (app / controllers / Application.java)

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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);
    }
}

Определить основной вид (app / views / Application / index.html)

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#{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>

Определить представление «Создать действие» (app / views / Application / create.html)

1
<li><code>${tweet.tweet} (${tweet.createDate.since()})</li>

Создать модульный тест для модели Tweet

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
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);
    }
 
}

Создать CRUD Admin для Tweet Model

1
2
3
package controllers;
     public class Tweets extends CRUD {
}

Добавить маршруты (конф / маршруты)

1
2
3
* /admin module:crud
 
GET /rest/tweets Application.tweets

Определить сообщения для CRUD Admin (conf / messages)

1
2
tweet=Tweet
createDate=Date Created

Определить профиль

1
web: play run –%$FRAMEWORK_ID –http.port=$PORT -DusePrecompiled=$USE_PRECOMPILED -DDATABASE_URL=mem

Запустить в разработке

1
play run –%dev -DusePrecompiled=false -DDATABASE_URL=mem

Создать приложение на Heroku

1
heroku create play-twitter –stack cedar

heroku create play-twitter — стек кедра

Настройка Git Repository

1
git init; git add .; git commit -a -m “Initial Commit”; git remote add heroku [email protected]:play-twitter.git

Настройка переменных среды Heroku

1
heroku config:add FRAMEWORK_ID=prod; heroku config:add USE_PRECOMPILED=true

Развернуть в Heroku

1
git push heroku master

Если что-то пошло не так, вы всегда можете проверить журнал

1
heroku logs

Чтобы настроить реальную базу данных на Heroku

1
heroku addons:add shared-database

Вы можете посмотреть живую демонстрацию здесь , интерфейс администратора здесь или клонировать исходный код на Github .

Ссылка: шаг за шагом для простого Twitter с Play Framework, AJAX, CRUD и Heroku от нашего партнера по JCG Фелипе Оливейры из Geek Are Totally In .

Статьи по Теме :