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
まあ、そんな感じです。