Author Archives: susumuis

About susumuis

メイドカフェによく居るWebエンジニア

Spring BootのテンプレートエンジンにMayaaを使おうとしてみた #javaee #mayaa

これは、Java EE Advent Calendar 2015 の10日目です。昨日はkodukiさんの「さよならスティッキーセッション!PayaraでJavaEEでもセッションをKVSに。」でした。

また、Mayaa Advent Calendar 2015 の10日目でもあります。昨日は「Mayaaを使ってHTMLを出力するアイデア」でした。

Java EEアドベントカレンダーから来た方に自己紹介しますと、僕は、MayaaというSeasar系のテンプレートエンジンのコミッターの末席を務めさせていただいておるものです。ほぼ一人でMayaaアドベントカレンダーをやっています。興味があれば1日目から読んでいただけると嬉しいです。

さて、サーバーサイドJava界隈では今年ある衝撃がありました。Seasar Conference 2015にて、Seasar2のコミッターひがやすをさんによって、Seasar2のサポートを来年9月26日で打ち切ると発表されました。MayaaもSeasarプロジェクトに属していますが、こちらはこれまでどおりメンテナンスを続けます。

しかし、実際はSeasar2コンテナとMayaaを組み合わせて使うことが多かったのではないかと思います。僕自身は普段はMayaa + 独自開発MVCフレームワークを使っており、Seasar2にもSpringにも正直疎いのではありますが、これからのためにSpringにも慣れておきたいと思います。

なお、Java EEの説明に

内容はJava EEに限らず、Springやアプリケーションサーバなど、サーバサイドJavaに関連することであればなんでもOK

とのことですので、趣旨としても問題ないかと思います。

ある知人のことば

先日、ある知人が

「いやーSpring Bootっての簡単ですねー。こりゃ馬鹿になるわー」

と言っていました。本当でしょうか。この記事を書くのに許された時間は2時間あまりですが、2時間でどれくらいできるのか、見てみようと思います。

Spring tool Suiteをダウンロード

STSっていうEclipseベースのツールを使うのが良いそうです。早速ここからインストールしてみます。

ダウンロードしたアーカイブを展開し、出てきたSTS.appを「アプリケーション」に移動して起動(Macでの話。Windowsの場合は、読み替えてください)

起動すると、Eclipseっぽい画面にSpringのページが表示されています。

スクリーンショット 2015-12-08 22.22.38

Spring Start Projectを作成

New ProjectからSpring Start Projectを作成します。

へー、ウィザードで、フレームワークとか選べるんですね!しかし、TemplateにMayaaがないですね!

スクリーンショット 2015-12-08 22.33.51

あとでMavanの設定して追加することにしましょう。
とりあえず、Webだけ選んでFinishを押してプロジェクトを作成します。

何はともあれ、Hello, Worldですかね

Finishを押すと怒涛のライブラリダウンロードが開始されます。今風ですねえ。

で、できたら、***Application.javaを右クリックして、Run As Spring Boot App をクリックすると、勝手に8080ポートでTomcatサーバーが立ち上がります。

(確かにこりゃ馬鹿になるかもwww)


. ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v1.3.0.RELEASE) (以下色々出てくる。。。)

Controllerを作ります。アノテーション以外POJOなんですねー。クラス作るときSuperクラスにControllerとか探してしまった僕はどんだけ古い時代を生きてるんだ。。。

package com.example;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {
    @RequestMapping("/")
    public String index() {
        return "hello, world";
    }

}

スクリーンショット 2015-12-10 17.42.06

簡単ですね。

ここからが大変でした。

Spring Bootがサポートするテンプレートエンジンは Velocity, Thymeleaf, Freemarker, Groovy Templates, Mustacheだそうです。。。

「JSPも使えるけど制限がある」

とのこと....

計画では、MayaaはJSPからの移植性が高いので、まずJSPでやってみて、そこからそのままMayaaへ移行しようしていたですが、どうも、それはやめたほうが良さそう。

とりあえず、pom.xmlを書き換えてmayaaを読み込み

pom.xmlに次を追記

    <repositories>
        <repository>
            <id>maven.seasar.org</id>
            <url>http://maven.seasar.org/maven2</url>
        </repository>
    </repositories>
        <dependency>
            <groupId>org.seasar.mayaa</groupId>
            <artifactId>mayaa</artifactId>
            <version>1.1.32</version>
        </dependency>

src/main/resources/application.properties
に以下のように記述

spring.view.prefix: /WEB-INF/view/
spring.view.suffix: .xhtml

src/main/webapp/WEB-INF/view/helo.xhtmlを作成

<html xmlns:m="http://mayaa.seasar.org">
<body>
    <span m:id="MESSAGE_HERE">dummy message</span>
</body>
</html>

src/main/webapp/WEB-INF/view/helo.mayaaを作成

<?xml version="1.0" encoding="UTF-8"?>
<m:mayaa xmlns:m="http://mayaa.seasar.org">
    <m:write m:id="MESSAGE_HERE" value="Hello Mayaa!" />
</m:mayaa>

src/main/webapp/WEB-INF/web.xmlを作成

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
  xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
  id="serv" version="3.0">
  <servlet>
    <servlet-name>MayaaServlet</servlet-name>
    <servlet-class>org.seasar.mayaa.impl.MayaaServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>MayaaServlet</servlet-name>
    <url-pattern>*.xhtml</url-pattern>
  </servlet-mapping>
</web-app>

HelloController.javaを書き換え

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class HelloController {
    @RequestMapping("/hello")
    public String index(ModelAndView modelAndView) {
        return "helo";
    }

}

実行!
スクリーンショット 2015-12-10 19.21.19

ああああ!
できなかった!

ちなみにJSPでやろうとしてもできなかった。

わかったこと

とりあえずわかったこと、Spring Boot使うなら素直にThymeleafを使おう!

なんか悔しいので、機会があったら再チャレンジします!

大変残念ですが、時間切れなので、今日はここまで!

解決編

その後、記事を読んでくれた方からコメントを頂き、そのとおりにしたらできました!Spring BootのテンプレートエンジンにMayaaを使おうとしてみるリベンジ編

コメントいただいた方々、誠にありがとうございました。

Mayaaを使ってHTMLを出力するアイデア

これは Mayaa Advent Calendar 2015 の9日目です。昨日は「mayaaの向いてるサイト、向いていないサイト」でした。

Mayaaアドベントカレンダーは毎日参加者を募集しています)

Mayaaを使って大量にHTMLページを出力しよう!

今日はterazzoの日記さんのMayaaを普通のテンプレートエンジンとして使うを参考にします。

Mayaaは基本的にServlet APIに依存した作りになっているため、Servletコンテナ上でしか動きません。しかし、必要なオブジェクトのモックが提供されており、うまく使うと単体で動かすことが可能です。

しかし、素晴らしい記事ですね!僕の書くことがない><

二番煎じをしても仕方がないので、これの応用例を考えてみましょう。

記事ではメールテンプレートとして利用する例を紹介していますが、MayaaでHTML / XML以外のものを出力するのは無理があるかなあと思います。HTMLページを出力するのに使うのが良いと思います。

CSVを食べて帳票にする

実用的な用途として、CSV形式で出力したデータを読み取って、帳票を出力する用途です。

HTML+CSSでも頑張れば結構実用的な帳票を出力できますし、自分は試したことがありませんが、Copper PDFと組み合わせてもうまく行ったという話を聞きました。

MayaaのマニュアルをMayaaで作る

硬度で実用的なテクニックとして、Mayaaファイルをパースして、それを元にm:id一覧表を出力する使い方も便利です。

まとめ

今日は非常に短くなってしまいました。MayaaはWebサイトだけでなく、HTMLジェネレーターとしても使えるという話でした。

ここ2日コードを書いてなくてごめんなさい。明日はJava EEアドベントカレンダーと合流なので、ちゃんとしたのを書こうと思います。

mayaaの向いてるサイト、向いていないサイト

これは Mayaa Advent Calendar 2015 の8日目です。昨日は「MayaaでWebサイトのビューを実装するときに押さえておくべき基本テクニック5 – その他雑多なテクニック」です。

ここまでガチな感じの記事が続いたので、今日はまったりしようと思います。

なお、(Mayaaアドベントカレンダーは毎日参加者を募集しています)

Mayaaに向くサイト、向かないサイト

Mayaaは、結構クセの強いテンプレートエンジンです。当然、すべてのサイトに向くわけではありません。今日は向くサイト、向かないサイトと紹介します。

Mayaaに向かないサイト

小規模なサイト

Mayaaデザイナーとエンジニアのコラボレーションを推進するテンプレートエンジンですから、当然、デザイナーとエンジニアのどちらかがいない時は必要ありません。

プログラマーが一人でガンガン開発するときはJSPの方が手っ取り早いかもしれません。

業務アプリケーション(開発者がMayaaに慣れている場合を除く)

デザイン重視ではない業務アプリケーションの場合も、Mayaaを使うメリットが活かせません。

Javaなら、JSFを使うか、いっそSPAにしてしまっても良いかもしれません。

ただ、開発者がMayaaに慣れているなら、その限りでもありません。いしがみメソッドでMayaaを使うことで、テンプレートが比較的スパゲッティにならず書けます。

折衷案として、いしがみメソッドを意識しながら、JSPやThymeleafを使うという手もあります。

高パフォーマンスが要求されるサイト

はっきり言って、Mayaaはそんなに高速なテンプレートエンジンではありません。内部的にかなり頑張っていますが、XMLをパースする、JavaScriptをコンパイルするという大仕事をしているためどうしても不利になります。

とはいえ、とんでもなく遅いわけでもありませんが、極限までのハイパフォーマンスが要求されるなら、あえてMayaaを選択する必要はないでしょう。

Mayaaが向くサイト

ECサイト

SEOが重要なECサイトでは、まだSPAを使うわけには行きません。ちゃんと静的なHTMLページを構成して上げる必要があり、metaタグなども結構細かく制御する必要があるでしょう。

また、ECサイトはフロントのデザイン変更が結構頻繁に必要になります。

そこで、運営者にある程度のマニュアルを渡して、サイト運営者と、運営者側のデザイナーのみでフロントをある程度いじれるようにできたら最高です。

ただ、そのためにはかなりのお膳立てが必要ではあります。きちんとレクチャーをし、プレビュー機能や、バックアップ機能などを十分に完備することが必須となるでしょう。

CMS

同じような需要が企業のコーポレートサイトなどのCMSとしての用途です。

この分野では WordPress が圧倒的な人気がありますが、Javaエンジニアが中心の会社で自社のサイトを作ったりするなら、わりとMayaaそのものを使うことは選択肢でありだと思います。

HTMLジェネレータとして使う

イレギュラーな話ですが、Mayaaをスタンドアロンなテンプレートエンジンとして使うテクニックが有ります(後日詳しく紹介します)

これを使うと、一つのテンプレートにデータを流し込んで静的ページ群を大量生成して出力すると結構便利だったりします。

さすがに出力対象がHTMLでない場合はあまり便利ではありませんが、マニュアルやドキュメントなどを大量に生成するとき、結構重宝します。

まとめ

こうしてみると、ある元データがあって、ビューという箱に収める・大量にページを生成するといった用途こそ、Mayaaが本領を発揮します。

本来であれば、XSLTのようでもあります。実際、XSLTの代わりにMayaaを使うと便利です。

MayaaをECサイトに使っているという事例は結構聞きます。でも、うまく使いこなすのは大変みたいですね。某企業みたいに本気で体制を組まないとつらそうです。

一方、マニュアルとか、自社CMSの用途なら比較的簡単かもしれません。その手のサイトを個人で作るときにMayaaを試してみるのも良いかもしれません。

ということで、明日はマニュアルの大量生成に挑戦してみようと思います!