astamuse Lab

astamuse Labとは、アスタミューゼのエンジニアとデザイナーのブログです。アスタミューゼの事業・サービスを支えている知識と舞台裏の今を発信しています。

そうだAsta4dでWebアプリケーションを作ろう(第1回)

はじめまして。開発のnkgwです。
主にastamuse.comastaid.comastavision.comのサーバーアプリケーションを担当しています。

開発ブログという事でお題について迷いましたが、Asta4Dの話しをしようということにしました。
作成者の劉さんが書いた方が良いという意見は見なかったことにします。

フレームワークの機能を1回のエントリで書くと倒れてしまうので、全6回のシリーズ物となっています。
Asta4dでWebアプリケーションを開発していくにあたって役に立つ内容に仕上げていきたいと思っています。
最終回までたどり着けるよう見守っていただけますと幸いです。

さて、初回である1回目はAsta4dでプロジェクトを作って静的ページを表示するまでをやっていきます。

開発環境

今回のシリーズを書くにあたってはmaven + jettty + Eclipseを前提に書きます。
Eclipseのplugin設定についてはここでは割愛します。

プロジェクト生成

1から作るのが面倒くさいという方は、GitHubにサンプルプロジェクトを作る方法が書いてありますので、そちらからサンプルプロジェクトを作ると楽が出来ます。

Eclipse上で1から作る方は新規のMavenプロジェクトを作ってください。
Simple Projectで作って、group idとかは適当で大丈夫です。
今回のエントリでは1から作っている前提で書いています。 (サンプルプロジェクトから始める方は、今回の内容はほぼスルーしちゃって良いです)

pom.xml

Asta4dを使用するためにpom.xmlにdependecyを追加します。
最新版は1.2-Mとなっていますが、こちらの都合により1.1-Xmasを使う前提で書いていきます。

まずはAsta4d関連のdependecyを全て追加します。
今回のシリーズではasta4d-springの機能は使わない予定ですが、紹介という意味で追加しています。
無駄ではあるので無くても構いません。

<dependencies>
  <dependency>
    <groupId>com.astamuse</groupId>
    <artifactId>asta4d-web</artifactId>
    <version>1.1-Xmas</version>
  </dependency>
  <dependency>
    <groupId>com.astamuse</groupId>
    <artifactId>asta4d-core</artifactId>
    <version>1.1-Xmas</version>
  </dependency>
  <dependency>
    <groupId>com.astamuse</groupId>
    <artifactId>asta4d-spring</artifactId>
    <version>1.1-Xmas</version>
  </dependency>
</dependencies>

jetty pluginも入れておきます。

      <build>
        <plugins>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.3</version>
          </plugin> 
          <plugin>
            <groupId>org.eclipse.jetty</groupId>
            <artifactId>jetty-maven-plugin</artifactId>
            <version>9.3.9.v20160517</version>
            <configuration>
              <scanIntervalSeconds>10</scanIntervalSeconds>
              <connectors>
                <connector implementation="org.mortbay.jetty.nio.SelectChannelConnector">
                  <port>8080</port>
                  <maxIdleTime>60000</maxIdleTime>
                </connector>
              </connectors>
            </configuration>
          </plugin>
        </plugins>
      </build>

これで今回pom.xmlに書く内容は全てです。
起動出来るようになるのは次の作業をしてからになるので、さっさと進みましょう。

Asta4dを使ってアクセスさせるための作業

dependencyに追加したAsta4dの機能を使って動作されるために幾つかのファイルを作成していく必要があります。

web.xmlの作成

web.xmlを作成してServletの設定を行います。
xmlファイルの作成場所は/src/main/webapp/WEB-INF/web.xmlです。

<?xml version="1.0" encoding="UTF-8"?>
<web-app 
    version="3.0" 
    metadata-complete="true"
    xmlns="http://java.sun.com/xml/ns/javaee"
    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">

    <!-- Handles all requests into the application -->
    <servlet>
        <servlet-name>Asta4D Dispatcher Servlet</servlet-name>
        <servlet-class>com.astamuse.asta4d.web.servlet.Asta4dServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Asta4D Dispatcher Servlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

com.astamuse.asta4d.web.servlet.Asta4dServletはHttpServletクラスをAsta4d向けに拡張したクラスです。
Asta4DのServletで動作してもらわないと困るので(ブログ的にも)、このクラスを設定してあげます。

なお、自作Servletを使用する場合はAsta4dServletを継承して作成するようにしてください。

URL Rulesの作成

Servletを設定してAsta4dでURLを捌けるようになりました。
しかし、現状ではURLを捌くルールが全くないので、ルールを作成します。

そもそも、ルールを設定するクラスがないと起動時にNullPointerExceptionで落ちます。

java.lang.NullPointerException
    at com.astamuse.asta4d.web.servlet.Asta4dServlet.createRuleList(Asta4dServlet.java:77)
    at com.astamuse.asta4d.web.servlet.Asta4dServlet.init(Asta4dServlet.java:71)
    at org.mortbay.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:440)
    at org.mortbay.jetty.servlet.ServletHolder.doStart(ServletHolder.java:263)
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
    at org.mortbay.jetty.servlet.ServletHandler.initialize(ServletHandler.java:736)
    at org.mortbay.jetty.servlet.Context.startContext(Context.java:140)
    at org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1282)
    at org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:518)
    at org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:499)
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
    at org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130)
    at org.mortbay.jetty.Server.doStart(Server.java:224)
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
    at runjettyrun.Bootstrap.main(Bootstrap.java:97)

ルールを設定するクラスはそれ用のinterfaceがありますので、それを実装してあげれば良いです。
クラス名はUrlMappingRuleInitializerです。

説明するのが少し大変なので、とりあえず今回使うルールを全行記載します。

package com.astamuse.blog_sample.rules;

import static com.astamuse.asta4d.web.dispatch.HttpMethod.GET;

import com.astamuse.asta4d.web.dispatch.mapping.UrlMappingRuleInitializer;
import com.astamuse.asta4d.web.dispatch.mapping.ext.UrlMappingRuleHelper;

public class UrlRules implements UrlMappingRuleInitializer{
    public void initUrlMappingRules(UrlMappingRuleHelper rules) {
        rules.add(GET, "/").forward("/html/index.html");
    }
}

今後も今回作ったUrlRulesクラスは出てくるので、そのたびに説明を加えていこうと思います。
基本的には引数のrulesにURLのルールをaddしていって、HTMLテンプレートをforwardで指定する感じです。

ルールを作る場所は特に規定はないので、分かりやすい場所に作ってください。

htmlの作成

ルール作成しても描画するものがないと困るので作ります。
forwardで設定したhtmlを読み込みますが、パスは/src/main/webapp配下と決まっているので、今回は/src/main/webapp/html/index.htmlを作ります。
中身はサンプルなのでなんでも大丈夫です。

URLルールをServletに登録

ルールを作成しhtmlを設置してもどこにルールを設定したクラスを使用するか分かってないと駄目なので設定します。
設定を追加しておけば、Asta4dServletがなんとかしてくれるので、追加するだけです。

方法については簡単で、/src/main/resources/asta4.conf.propertiesを作って

urlMappingRuleInitializer=com.astamuse.blog_sample.rules.UrlRules

の1行を足せば完了です。
簡単ですね。

context pathの設定

特に何も設定しないとcontext pathが設定されてしまうようなので、設定します。
設定なくても困りませんが、した方が楽かなと思った次第です。

<?xml version="1.0"  encoding="UTF-8"?>
<!DOCTYPE Configure PUBLIC
    "-//Mort Bay Consulting//DTD Configure//EN"
    "http://www.eclipse.org/jetty/configure_9_0.dtd">

<Configure class="org.mortbay.jetty.webapp.WebAppContext">
    <Set name="contextPath">/</Set>
</Configure>

/src/main/webapp/WEB-INF/jetty-web.xmlを作成してcontext pathの設定を入れ込みます。
今回はcontext path無しの設定をすることにしました。
今後はこの設定を入れている前提でURLを組み立てていきます。

起動

http://localhost:8080/に接続して作成したHTMLが表示されて大成功。

次回予告

次回は静的ページではなく動的にページを表示させる方法について書きます。

関連URL

第1回:環境構築して静的ページを表示するまで(今ここ)
第2回:Snippetを使って動的ページを作ろう
第3回:少し複雑なSnippet
第4回:Handlerの役割と使い方
第5回:Global Handlerとattribute
第6回:Form Flowを使おう

Copyright © astamuse company, ltd. all rights reserved.