JavaのWebアプリケーション開発フレームワークによる、Webサイト開発の顛末記です。

EclipseのMavenを使った、Spring-MVC、Thymeleaf、MyBatis 等のプログラミングテクニックを、
備忘録的に記録しています。実際に動くソースコードを多用して説明していますので、
これからEclipseや、Spring-MVCを始めたいと思っている人にとって、少しでも参考になれば幸いです。
■Spring Boot の小径 第4歩 Spring Boot 匍匐前進
4-10)ウェルカムページについて
Spring-MVCアプリケーションや、一般的なTomcatで動作するアプリケーションでは、
tomcatデプロイメント記述子(web.xml)に、
ウェルカムページ(welcome-file-list)要素を定義します。
welcome-file-list要素は、ApacheのDirectoryIndexと同じでURLに、
ディレクトリだけを指定してアクセスしてきた場合に表示するデフォルトのページを指定します。
例)
<welcome-file-list>
  <welcome-file>index.html</welcome-file>
</welcome-file-list>

この定義を行っておくと、
http://arimodoki.dip.jp/ とリクエストされたら、http://arimodoki.dip.jp/index.html が表示されます。


しかしながら、Spring Boot では既にご承知の通り、web.xml自体が存在しません。
ここではSpring Bootで、ウェルカムページを設定する方法をご紹介しておきます。
ウェルカムページの配置
 前節「4-9)静的コンテンツの配置」でも触れましたが、
 一番確実なのは、classpath(src/main/resources/):/static/ディレクトリ配下に、
 index.html という名前でファイルを配置します。
 Spring Bootは、「index.html」という名前のファイルを特別扱いします。
 これだけで、http://arimodoki.dip.jp/のようにディレクトリだけ指定したリクエストでも、
 http://arimodoki.dip.jp/index.html が表示されるようになります。
  ※)逆に言うと、前述のweb.xmlの<welcome-file-list>要素では、任意のファイル名を指定できましたが、
    Spring Bootでは、「index.html」という名前しか指定できないという難点があります。
    この難点を回避する方法と、問題点は後述します。

 ただ、私の実験プロジェクトは原則、classpath:/static/ディレクトリには何も置きたくない。
 という天邪鬼なプロジェクトなので、src/main/webapp配下に、index.htmlを配置します。
 Gradle形式と、Maven形式の両方のプロジェクトで実験したところ、どちらも正しく動作しました。
 静的でない、例えば
  @Controller
  public class Index {
   @RequestMapping(value = "/index")
   public String index() {
     return "welcome";
   }
  }
 みたいなコントローラを用意して、 リクエストマッピングを "/index" としておき、
 application.properties設定ファイルで、appconfig.url-pattern=*.html を定義すれば、
 これも、ウェルカムページとして使用可能です。
 src/main/webapp/index.htmlと、上のようなコントローラが両方ある場合は、
 コントローラが優先的に動作する様です。
任意のウェルカムページの設定
 Spring Bootでは、「index.html」は特別扱いされることは既に説明しましたが、
 「index.html」以外のファイル名をウェルカムページに設定するにはどうすればいいでしょう?
 答えは、まずapplication.properties設定ファイルに、
 appconfig.welcomepage=home の定義を追加します。
 この場合の homeの意味は、@RequestMapping(value = "/home") で定義されたコントローラの
 リクエストハンドラをウェルカムページとして使います。という意味になります。
 
 次に、「4-8)環境設定の外部ファイル注入」でご紹介した、
 src/main/java/jp/dip/arimodoki/config/WebConfig.java に以下のクラス変数とメソッドを追加します。
 
  /** welcome page template name */
  private String welcomepage = "index";
 
  @Override
  public void addViewControllers(ViewControllerRegistry registry) {
    registry.addViewController("/").setViewName(this.welcomepage);
  }
 
 これでブラウザから、http://arimodoki.dip.jp/ みたいなリクエストを行うと、
 http://arimodoki.dip.jp/home.html というハンドラが実行されるようになります。
 ただ、ここで一つ問題点があります。
 この実験プロジェクトでは、application.properties設定ファイルで、
 リクエストURLパターンを、*.html で設定しています。
 この定義があると、addViewControllers()が正しく作動せずに、
 期待したウェルカムページが表示されずに、HTTP404エラーとなってしまいます。
  ※)ただし、 index.html をウェルカムページとして使う分には、問題ない。
 
 リクエストURLパターンを定義しつつ、index.html以外のウェルカムページを正しく作動させる方法が、
 今の所思いつかないので、これは今後の課題にしたいと思います。