Java EE 事始め!

主にJava EEについて、つらつらとマイペースに書いていきます。「Java EEを勉強するときに、一番最初に読んでもらえるブログ」を目指して頑張ります!

MVC 1.0(Java EE 8)をとりあえず動かしてみた

MVC 1.0とは?

Java EE 8は、来年(2016年)の第3四半期にリリースが予定されています。
その中に含まれる予定の、アクションベースMVCフレームワークの仕様が「MVC 1.0」です。
参照実装は「Ozark」です。
Ozark, the JavaEE MVC RI — Project Kenai

環境

プロジェクトは[Maven]→[Webアプリケーション]で作ってください。
プロジェクト名は「OzarkSample」とします。

Maven依存関係

プロジェクトを作成したら、pom.xmlに下記の依存関係を追加してください。

<dependencies>
  <dependency>
    <groupId>com.oracle.ozark</groupId>
    <artifactId>ozark</artifactId>
    <version>1.0.0-m01</version>
    <scope>compile</scope>
    </dependency>
  <dependency>
    <groupId>javax</groupId>
    <artifactId>javaee-web-api</artifactId>
    <version>7.0</version>
    <scope>provided</scope>
  </dependency>
</dependencies>

JAX-RSの有効化

package ozarksample;

import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;

@ApplicationPath("api")
public class MyApplication extends Application { 
}

MVC 1.0は、JAX-RSベースのフレームワークです。
javax.ws.rs.core.Applicationのサブクラスを作ると、JAX-RSが有効化されます。
クラスの中身は空でOKです。
@ApplicationPath("api")は、このアプリケーションのURLを指定しています。
つまり「http://localhost:8080/コンテキストパス/api/・・・」となります。

コントローラーの作成

package ozarksample.controller;

import com.oracle.ozark.engine.JspViewEngine;
import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import javax.mvc.Controller;
import javax.mvc.Models;
import javax.mvc.Viewable;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;

@Path("hello")
@RequestScoped
public class HelloController {
    
    @Inject
    private Models models;
    
    @GET
    @Controller
    @Path("{name}")
    public String hello(@PathParam("name") String name) {
        models.put("name", name);
        return "hello.jsp";
    }
    
// コレでもOK
//    @GET
//    @Controller
//    @Path("{name}")
//    public Viewable hello(@PathParam("name") String name) {
//        models.put("name", name);
//        return new Viewable("hello.jsp", models, JspViewEngine.class);
//    }
    
}

@Pathは、やはりURLを指定するものです。
はまったのは、このコントローラークラスに@RequestScopedなどのCDIスコープアノテーションをつけないと、実行時に「org.glassfish.hk2.api.UnsatisfiedDependencyException」が出てしまいました。
参考URL:GlassFish 4.0のCDIに潜む罠 - Programming Studio
本来は、コントローラークラスにはスコープアノテーションは付けないようなのですが、今回はとりあえず動かすためにこうしてます。

JSPページ

上記のコントローラーから、フォワードする先のJSPです。
EL式を使って、コントローラーでModelsにputしたnameを表示しています。

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
    </head>
    <body>
        <%-- EL式でnameを表示 --%>
        <h1>Hello, ${name}!!</h1>
    </body>
</html>

最終的なプロジェクト構成

f:id:MasatoshiTada:20150331164356p:plain

実行してみる

ブラウザで、下記のURLにアクセスしてください。
http://localhost:8080/OzarkSample/api/hello/hogehoge
すると、URLの最後の「hogehoge」の部分が、下記のように表示されます。
f:id:MasatoshiTada:20150331164258p:plain

感想

非常にシンプルで、使いやすいフレームワークだと感じました。
まだ仕様策定中で未完成な部分があるということもありますが、逆に言えばまだクラス数が少ないので、コードリーディングがしやすいです。
今のうちにチェックしておいて、構造を把握しておくのも良いと思います。
僕も、今後も定期的にチェックします。

注意事項

MVC 1.0およびOzarkは、現在も仕様策定や開発の真っ最中であり、今回のサンプルは2015年3月31日現在のものに過ぎません。
後々になると仕様が変わっており、上記のサンプルは動かなくなっている可能性がありますので、ご注意ください。

Ozarkのサンプル

https://github.com/spericas/ozark/tree/jaxrs/ozark-sample
GitHubにあるのですが、このサンプルはどうも古いらしく、現在の実装とはちょっと違っています。