Blog

avans アプリの処理フロー

avans にかぎらず、java の web application 全般そうですが、

src/main/webapp/WEB-INF/web.xml がエントリポイントになっています。

最近では Spring boot や Dropwizard などのような、web.xml いらずのものもありますが、avans では web.xml で記述することにしています。

web.xml はコンテナがいい感じに読んで実行してくれると思いねえ。

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" 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">
  <servlet>
    <servlet-name>hello</servlet-name>
    <servlet-class>me.geso.avans.AvansServlet</servlet-class>
    <init-param>
      <param-name>class</param-name> 
      <param-value>com.example.helloworld.Main$Foo</param-value> 
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/*</url-pattern>
  </servlet-mapping>
</web-app>

servlet を定義して、それをマッピングしています。

これは以下のような擬似コードの挙動になることを示しています。

val config = new ServletConfigImpl();
config.setInitParameter('class', 'com.example.helloworld.Main$Foo');
val hello = new AvansServlet();
hello.init(config);
tomcat.addServletMapping(hello);

AvansServlet は初期化パラメータとして class と package をサポートしており、クラス一個一個を登録するかパッケージ単位で登録するかを選べます。複数個登録したいときはコンマで区切って登録します。 https://github.com/tokuhirom/avans/blob/master/avans/src/main/java/me/geso/avans/AvansServlet.java#L26

各コントローラは Controller インターフェースを実装している必要があり、Controller クラスを実装していない場合、ルーターに登録されません。 https://github.com/tokuhirom/avans/blob/master/avans/src/main/java/me/geso/avans/Dispatcher.java#L61

AvansServlet はすべてのリクエストを受け取って、各コントローラにディスパッチしていきます。 https://github.com/tokuhirom/avans/blob/master/avans/src/main/java/me/geso/avans/AvansServlet.java#L106

Dispatcher#handler はこのへんで、routes をよんで、コントローラを特定して、new して呼んでる。 https://github.com/tokuhirom/avans/blob/master/avans/src/main/java/me/geso/avans/Dispatcher.java#L106

まあ、そんな感じです。