More Related Content Similar to Grails 2.0.0.M1の話 Similar to Grails 2.0.0.M1の話 (20) More from Tsuyoshi Yamamoto More from Tsuyoshi Yamamoto (20) Grails 2.0.0.M1の話 3. • 仕事
• newcast inc. ってデザイン会社で、
印刷系パッケージソフト開発。あと経営。
• 主に、Grails,Groovy,Java,Obj-C,人材等を扱います。
• Grailsの経歴
• 2006/7 旧Grailsドキュメント翻訳。
• 2006/12 Acegiプラグインを公開。
• 2007/10 ”Grails eXchange 2007”に、スピーカーとして参
加。
• 2008/8 Grails徹底入門 共著。
• 2006 - 201X Grails日本語リリースノートを即配信を趣味と
してる。 3
5. • 7/1 富士山 山開き
• 7/2 キャラ・スーンの誕生日(ZZ)
ミーア・キャンベルの誕生日(SEED DESTINY)
• 7/3 2005年にGrails最初のコミットされた日!
• 7/4 アメリカ独立記念日!
• 7/5 @tyama 誕生日!
• 7/6「プログラミングGroovy」発売!
• 7/7 七夕!
• 7/8 質屋の日! 5
11. • ある程度の。
• 最新のWeb開発アーキテクチャを知る事ができる。
• 最先端・流行のJava開発を知る事ができる。
• Grailsでの開発
• 開発効率の追求。(究極なDRY)
• シンプルかつ柔軟。(DSL)
• DDD。
• ただし!
• 柔軟過ぎて質の悪いアプリケーションも構築できる。
• 意外と作り手によっては、おかしな物になる。
11
16. •コア+その他。 •DB
Groovy 1.8, Spring 3.1 M1, Hibernate 基本データベースをH2への変更
3.6,Servlet 3.0, Tomcat 7への更新。 DBコンソール
Javaエージェントで開発時リロード改善 複数データソースサポート
パフォーマンス強化・速度向上! マイグレーションとリバースエンジニア
新しいコンソールUIとインタラクティブ リング
(interactive)モード
•テスト
スカッフォルドUIがHTML5に! MixinベースUnitテスト
エラーレポートとスタックトレース表示 Spockもサポートした新しいテストAPI
•リソース Unitテストスカッフォールディング
静的リソースハンドリング機能 強化されたユニットテストのコンソール
PrototypeからjQueryへ への書き出し
•GORM •プラグイン
GORM API大幅改良、機能強化 バイナリープラグイン
AST変換を使用したGORM API プラグイン使用統計トラッキング
抽象クラス継承のサポート プラグイン開発用のAST変換API
16
22. • Groovy 1.8, Spring 3.1, Hibernate 3.6,
Servlet 3.0, Tomcat 7への更新。
• Javaエージェントで開発時リロード改善
• パフォーマンス強化・速度向上!
• スカッフォルドUIがHTML5に!
• 新しいコンソールUIとインタラクティブ
(interactive)モード
• エラーレポートとスタックトレース表示
22
23. • Groovy 1.8
• 超強化されたGroovyをバンドル
• Spring 3.1
• SpringプロファイルとGrails環境のブリッジ。
• Servlet 3.0
• Asyncとか個人的には注目してる。
• Tomcat 7
• Hibernate 3.6
23
29. • grails (Ent) で、インタラクティブモードに突入
するので。
% grails --help
% grails -version
29
34. • 静的リソースハンドリング機能
• resourcesプラグインがコアへ (プラグイン提供)
• http://grails.org/plugin/resources
• PrototypeからjQueryへ
• リソースの改善と平行して、jQueryへの移行
も行われた。
34
35. • js,cssをモジュール管理
• リソースをDSLで定義
modules = {
core {
dependsOn 'jquery, utils'
resource url: '/js/core.js', disposition: 'head'
resource url: '/js/ui.js'
resource url: '/css/main.css',
resource url: '/css/branding.css'
resource url: '/css/print.css', attrs: [media: 'print']
}
utils { <html>
dependsOn 'jquery' <head>
resource url: '/js/utils.js' <r:require module="jquery"/>
} <r:layoutResources/>
forms { </head>
dependsOn 'core,utils'
<body>
resource url: '/css/forms.css'
…
resource url: '/js/forms.js'
<r:layoutResources/>
}
</body>
}
</html>
35
36. • 連動するプラグイン
• キャッシュ
• http://grails.org/plugin/cached-resources
• gzip
• http://grails.org/plugin/zipped-resources
36
39. • How?
main.gsp <g:layoutHead/>
<r:layoutResources/>
JS
AJAX
<g:javascript library="jquery" plugin="jquery"/>
<g:javascript library="jquery"/>
<r:require modules="jquery"/>
2.0
<r:require modules="jquery"/>
Config.groovy
grails.views.javascript.library="jquery"
39
42. • HSQDB → H2
• BuildConfigに、
runtime 'hsqldb:hsqldb:1.8.0.10'
• 何ならこれを期に、H2にしてしまおう!
• jdbcの設定も変えないとね!
42
44. • 基本は開発モードのみで使用可能。
指定する事で productionモードでも可能。
(セキュリティ必要)
environments {
production {
grails.serverURL = "http://www.changeme.com"
grails.dbconsole.enabled = true
grails.dbconsole.urlRoot = '/admin/dbconsole'
}
development {
grails.serverURL = "http://localhost:8080/${appName}"
}
test {
grails.serverURL = "http://localhost:8080/${appName}"
}
}
44
45. DataSource.groovy
dataSource { pooled = true ドメインに定義
driverClassName = 'org.h2.Driver'
url = 'jdbc:h2:mem:testDb' class Book {
username = 'sa' String title
password = '' static mapping = {
dbCreate = 'update'
datasource 'ALL'
}
}
dataSource_ds2 { }
pooled = true
driverClassName = 'org.h2.Driver'
url = 'jdbc:h2:mem:testDb2' class Comment {
username = 'sa' String message
password = '' static mapping = {
dialect = org.hibernate.dialect.H2Dialect
datasource 'ds2'
dbCreate = 'update'
} }
}
def book = Book.ds2.get(100)
45
46. • プラグインで提供。
詳しくはドキュメントを読みましょう!
• http://grails.org/plugin/database-migration
• http://grails.org/plugin/db-reverse-engineer
46
47. • GORM APIがJavaから使用可能に。
• GORMでの抽象クラス継承のサポート。
• OrCreateとOrSaveクエリーの実装追加。
• 名前付きクエリから関係先の名前付きクエリを
参照。
• 共有制約とコマンドオブジェクト。
47
48. • GORM APIは、Groovy ASTによって、GORM
エンティティのバイトコードとして注入されま
す。これによりGORMのメソッドは、Javaコー
ドから、呼び出したり見たりできます。
Book book = new Book();
book.setTitle("The Stand")
book.save();
System.out.println(Book.count());
System.out.println(Book.list());
48
49. • GORMが抽象クラス継承をサポートしました。
関連リンクやクエリ等を抽象クラスに定義する
ことができます。
abstract Media {
String title
…
}
class Book extends Media {
}
class Album extends Media {
}
class Account {
static hasMany = [purchasedMedia:Media]
}
..
def allMedia = Media.list()
49
50. • ドメインクラスに、findWhereやfindByメソッドに似
た、nullを返さない、findOrCreateWhere,
findOrSaveWhere, findOrCreateBy,
findOrSaveByのクエリーをサポート。
• 実行結果にインスタンスが見つからない場合は、指定
された値で、新規にインスタンスを作成して返しま
す。findOrSaveWhereとfindOrSaveByの場合はイン
スタンスを保存してからインスタンスを返します。
def book = Book.findOrCreateWhere(author: 'Douglas Adams',
title: "The Hitchiker's Guide To The Galaxy")
def book = Book.findOrSaveWhere(author: 'Daniel Suarez',
title: 'Daemon')
def book = Book.findOrCreateByAuthorAndTitle(
'Daniel Suarez', 'Daemon')
d e f b o o k = B o o k . f i n d O r S a v e B y A u t h o r A n d T i t l e (' D a n i e l S u a r e z ' , ' D a e m o n ' )
50
51. • 名前付きクエリがドメインクラスのリレーショ
ンを含んでいる場合、そのリレーション先の名
前付きクエリを使用することが可能に。
class Author {
static hasMany = [publications:Publication]
static namedQueries = {
authorsWithRecentPublications {
publications {
//
recentPublications()
}
}
}
}
class Publication {
Author author
static namedQueries = {
recentPublications {//
def now = new Date()
gt 'datePublished', now - 10
}
}
}
51
52. • コマンドオブジェクトが共有制約をサポートし
ました。
実装方法は以前に追加されたドメインクラスと
同じです。
grails.gorm.default.constraints = {
'*'(nullable: true, size: 1..20)
}
grails.gorm.default.constraints = {
myShared(nullable: true, size: 1..20)
}
class User {
...
static constraints = {
login(shared: "myShared")
}
}
52
57. • コントローラテストの方法が、
公式ドキュメントの "9.1" に詳しく掲載!
• リロード良くなったので、
新コンソール(インタラクティブ)でテストしよ
う!
• ドメインテスト注意点。
• Car.findAllByMaker(.....)とかの、フィールド
(この場合maker)にはインデックス定義必要。
mappings に maker index:true 。
57
60. • プラグイン使用統計トラッキング
• プラグイン使用レポートを収集する機能が実
装されました。近いうちにプラグイン使用統
計がGrailsのサイトで公開されます。
• プラグイン開発用のAST変換API
• @Artefact ??
• バイナリープラグイン
60
63. • 今まではアクションがクロージャで実装されて
ました。今後はメソッドで実装を推奨します!
(もちろんクロージャもサポートしてます)
• メソッドにすることによっての利点
• メモリ効率
• ステートレスコントローラの使用 (シングルトンスコープ指定)
• サブクラスでのアクションのオーバーライドが可能。スー
パークラスのアクションメソッド呼び出しが可能。
super.actionName()
• クロージャはフィールドのため複雑だったスタンダードなプ
ロキシを使用したメソッドのインターセプトが可能。
63
64. def index() {
redirect(action: "list", params: params)
}
def list() {
params.max = Math.min(params.max ? params.int('max') : 10, 100)
[bookList: Book.list(params), bookTotal: Book.count()]
}
クロージャを使用したい場合、旧版対応:
AST変換を使用してクロージャをメソッドに変換したバイト
コードを生成
grails.compile.artefacts.closures.convert = true
64
66. • 非同期処理。AsyncContext
BuildConfigにサーブレットバージョン指定
grails.servlet.version = "3.0"
使用方法: def ctx = startAsync()
def index() {
def ctx = startAsync()
ctx.start {
new Book(title:"The Stand").save()
render template:"books", model:[books:Book.list()]
ctx.complete()
}
}
66
67. Link Generation API
Grailsのルールでリンクを生成するAPI
LinkGenerator grailsLinkGenerator
def generateLink() {
! grailsLinkGenerator.link(controller:"book", action:"list")
}
Page Rendering API
Webリクエスト以外の場所でGSPをレンダリングするAPI
PageRenderer groovyPageRenderer
void welcomeUser(User user) {
! def contents = groovyPageRenderer.render(
view:"/emails/welcomeLetter", model:[user: user])
! sendEmail {
! ! to user.email
! ! body contents
! }
}
67
68. • フィルターでのコントローラ・アクション・URI
の除外指定が実装されました。
filter1(actionExclude: 'log*') {
before = {
//
}
}
filter2(controllerExclude: 'auth') {
before = {
//
}
}
filter3(uriExclude: '/secure*') {
before = {
// …
}
}
68
70. • 依存ライブラリ・プラグインにSNAPSHOTが有
る場合の自動更新
• パーマネントリダイレクト(301)のサポート
• redirect() メソッドにtrueを指定すると、リダイレクトは、301の
HTTPステータスで送信され、その逆であれば、302で送信されます。
• JsonBuilderは非推奨となりました。
• 全てのスタティックホルダーは非推奨。
• GORMエンティティを拡張した抽象クラスは必
ずsrc/groovyに入れましょう。
70