Hello world!
The time on the server is ${serverTime}.
.. tabularcolumns:: |p{0.10\linewidth}|p{0.90\linewidth}|
.. list-table::
:header-rows: 1
:widths: 10 90
* - 項番
- 説明
* - | (7)
- | ControllerでModelに設定した\ ``serverTime``\ を表示する。
| ここでは、XSS対策を行っていないが、ユーザの入力値を表示する場合は、\ ``f:h()``\ 関数を用いて、必ずXSS対策を行うこと。
|
プロジェクトを右クリックして「Run As」->「Run on Server」を選択する。
.. figure:: ./images/image031.jpg
:width: 70%
|
APサーバー(Tomcat v9.0 Server at localhost)を選択し、「Next」をクリックする。
.. figure:: ./images/image032.jpg
:width: 70%
|
todoが「Configured」に含まれていることを確認して「Finish」をクリックしてサーバーを起動する。
.. figure:: ./images/image033.jpg
:width: 70%
|
起動すると以下のようなログが出力される。
\ ``/``\ というパスに対して\ ``com.example.todo.app.welcome.HelloController``\ のhelloメソッドがマッピングされていることが分かる。
.. code-block:: console
:emphasize-lines: 3-4
date:2020-01-23 16:11:55 thread:main X-Track: level:INFO logger:o.springframework.web.servlet.DispatcherServlet message:Initializing Servlet 'appServlet'
date:2020-01-23 16:11:56 thread:main X-Track: level:TRACE logger:o.s.w.s.m.m.a.RequestMappingHandlerMapping message:
c.e.t.a.w.HelloController:
{[GET, POST] /}: home(Locale,Model)
date:2020-01-23 16:11:56 thread:main X-Track: level:DEBUG logger:o.s.w.s.m.m.a.RequestMappingHandlerMapping message:1 mappings in 'org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping'
date:2020-01-23 16:11:58 thread:main X-Track: level:INFO logger:o.springframework.web.servlet.DispatcherServlet message:Completed initialization in 3095 ms
|
ブラウザで http://localhost:8080/todo にアクセスすると、以下のように表示される。
.. figure:: ./images/image034.png
:width: 60%
コンソールを見ると、
* 共通ライブラリから提供している\ ``TraceLoggingInterceptor``\ のTRACEログ
* Controllerで実装したINFOログ
が出力されていることがわかる。
.. code-block:: console
:emphasize-lines: 1-4
date:2016-02-17 11:25:35 thread:tomcat-http--11 X-Track:b49b630274974bffbcd9e8d13261f6a7 level:TRACE logger:o.t.gfw.web.logging.TraceLoggingInterceptor message:[START CONTROLLER] HelloController.home(Locale,Model)
date:2016-02-17 11:25:35 thread:tomcat-http--11 X-Track:b49b630274974bffbcd9e8d13261f6a7 level:INFO logger:com.example.todo.app.welcome.HelloController message:Welcome home! The client locale is ja_JP.
date:2016-02-17 11:25:35 thread:tomcat-http--11 X-Track:b49b630274974bffbcd9e8d13261f6a7 level:TRACE logger:o.t.gfw.web.logging.TraceLoggingInterceptor message:[END CONTROLLER ] HelloController.home(Locale,Model)-> view=welcome/home, model={serverTime=2016/02/17 11:25:35 JST}
date:2016-02-17 11:25:35 thread:tomcat-http--11 X-Track:b49b630274974bffbcd9e8d13261f6a7 level:TRACE logger:o.t.gfw.web.logging.TraceLoggingInterceptor message:[HANDLING TIME ] HelloController.home(Locale,Model)-> 97,346,576 ns
.. note::
\ ``TraceLoggingInterceptor``\ はControllerの開始、終了でログを出力する。終了時には\ ``View``\ と\ ``Model``\ の情報および処理時間が出力される。
|
Todoアプリケーションの作成
================================================================================
| Todoアプリケーションを作成する。作成する順は、以下の通りである。
* ドメイン層(+ インフラストラクチャ層)
* Domain Object作成
* Repository作成
* RepositoryImpl作成
* Service作成
* アプリケーション層
* Controller作成
* Form作成
* View作成
|
RepositoryImplの作成は、選択したインフラストラクチャ層の種類に応じて実装方法が異なる。
ここでは、データベースを使用せず\ ``java.util.Map``\ を使ったインメモリ実装のRepositoryImplを作成する方法について説明を行う。
データベースを使用する場合は、「:ref:`tutorial-todo_infra`」に記載されている内容で読み替えて、Todoアプリケーションを作成して頂きたい。
|
ドメイン層の作成
--------------------------------------------------------------------------------
Domain Objectの作成
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Domainオブジェクトを作成する。
Package Explorer上で右クリック -> New -> Class を選択し、「New Java Class」ダイアログを表示し、
.. tabularcolumns:: |p{0.10\linewidth}|p{0.30\linewidth}|p{0.50\linewidth}|
.. list-table::
:header-rows: 1
:widths: 10 30 50
* - 項番
- 項目
- 入力値
* - 1
- Package
- ``com.example.todo.domain.model``
* - 2
- Name
- ``Todo``
* - 3
- Interfaces
- ``java.io.Serializable``
を入力して「Finish」する。
.. figure:: ./images/image057.png
:width: 70%
作成したクラスは以下のディレクトリに格納される。
.. figure:: ./images/image058.png
|
作成したクラスに以下のプロパティを追加する。
* ID → todoId
* タイトル → todoTitle
* 完了フラグ → finished
* 作成日 → createdAt
.. code-block:: java
package com.example.todo.domain.model;
import java.io.Serializable;
import java.util.Date;
public class Todo implements Serializable {
private static final long serialVersionUID = 1L;
private String todoId;
private String todoTitle;
private boolean finished;
private Date createdAt;
public String getTodoId() {
return todoId;
}
public void setTodoId(String todoId) {
this.todoId = todoId;
}
public String getTodoTitle() {
return todoTitle;
}
public void setTodoTitle(String todoTitle) {
this.todoTitle = todoTitle;
}
public boolean isFinished() {
return finished;
}
public void setFinished(boolean finished) {
this.finished = finished;
}
public Date getCreatedAt() {
return createdAt;
}
public void setCreatedAt(Date createdAt) {
this.createdAt = createdAt;
}
}
.. tip::
Getter/SetterメソッドはSTSの機能を使って自動生成することができる。
フィールドを定義した後、エディタ上で右クリックし、「Source」->「Generate Getter and Setters…」を選択する。
.. figure:: ./images/image059.png
:width: 90%
serialVersionUID以外を選択して「OK」
.. figure:: ./images/image060.png
:width: 60%
|
.. _TutorialTodoCreateRepository:
Repositoryの作成
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
\ ``TodoRepository``\ インタフェースを作成する。
データベースを使用する場合は、「:ref:`tutorial-todo_infra`」に記載されている内容で読み替えて、Repositoryを作成する。
Package Explorer上で右クリック -> New -> Interface を選択し、「New Java Interface」ダイアログを表示し、
.. tabularcolumns:: |p{0.10\linewidth}|p{0.30\linewidth}|p{0.50\linewidth}|
.. list-table::
:header-rows: 1
:widths: 10 30 50
* - 項番
- 項目
- 入力値
* - 1
- Package
- ``com.example.todo.domain.repository.todo``
* - 2
- Name
- ``TodoRepository``
を入力して「Finish」する。
作成したインタフェースは以下のディレクトリに格納される。
.. figure:: ./images/image061.png
作成したインタフェースに、今回のアプリケーションで必要となる以下のCRUD操作を行うメソッドを定義する。
* TODOの1件取得 → findById
* TODOの全件取得 → findAll
* TODOの1件作成 → create
* TODOの1件更新 → update
* TODOの1件削除 → delete
* 完了済みTODO件数の取得 → countByFinished
.. code-block:: java
package com.example.todo.domain.repository.todo;
import java.util.Collection;
import java.util.Optional;
import com.example.todo.domain.model.Todo;
public interface TodoRepository {
Optional