Springboot + Bootstrap + Thymeleaf + JQuery DataTablesで一覧表示

##Springboot + Bootstrap + Thymeleaf + JQuery DataTablesを使って一覧表を作成してみます

1.構成

```
sample-datatables
└─src
    └─main
        ├─java
        │  └─com
        │      └─stone
        │          └─ccc
        │              │  DataTablesController.java
        │              │  DataTablesRestController.java
        │              │  SampleDatatablesApplication.java
        │              │  ServletInitializer.java
        │              └─bean
        │                      SampleUser.java
        └─resources
            │  application.properties
            ├─static
            │  └─DataTables-1.10.16
            │      │  Japanese.json
            │      ├─css
            │      │      dataTables.bootstrap.min.css
            │      │      dataTables.bootstrap4.min.css
            │      └─js
            │              dataTables.bootstrap.min.js
            │              dataTables.bootstrap4.min.js
            └─templates
                    index.html
```
**point**
JQuery DataTablesは resource/staticの下に配置しています。

2.依存(Gradle)

```build.gradle
dependencies {
	compile('org.springframework.boot:spring-boot-starter-thymeleaf')
	compile('org.springframework.boot:spring-boot-starter-web')
	compile('org.apache.commons:commons-lang3:3.7')
	compile('org.webjars:jquery:3.2.1')
	compile('org.webjars:jquery-ui:1.12.1')
	compile('org.webjars:bootstrap:4.0.0')
	compile('com.fasterxml.jackson.datatype:jackson-datatype-jsr310')
	runtime('org.springframework.boot:spring-boot-devtools')
	providedRuntime('org.springframework.boot:spring-boot-starter-tomcat')
	testCompile('org.springframework.boot:spring-boot-starter-test')
}
```

**point**
com.fasterxml.jackson.datatype:jackson-datatype-jsr310を使って
List<>をJson配列に変換できるようにしておきます。

3.bean

```SampleUser.java
package com.stone.ccc.bean;

public class SampleUser {

	public SampleUser( String username, String mailaddress) {
		this.username=username;
		this.mailaddress=mailaddress;
	}

	private String username;
	private String mailaddress;

	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getMailaddress() {
		return mailaddress;
	}
	public void setMailaddress(String mailaddress) {
		this.mailaddress = mailaddress;
	}
}

```
一覧表のデータを定義しています。ユーザデータにしています。

4.Controller
(1)Contoller

```DataTablesController
package com.stone.ccc;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
public class DataTablesController {
    @RequestMapping(value = "/", method = RequestMethod.GET)
    public String index(Model model) {
        return "index";
    }
}
```
index.htmlを返す簡単なControllerです

(2)RestController

```DataTablesRestController.java
package com.stone.ccc;

import java.util.ArrayList;
import java.util.List;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.stone.ccc.bean.SampleUser;

@RestController
public class DataTablesRestController {
	@RequestMapping("/getuserlist")
	public List<SampleUser> getuserlist() {
		List<SampleUser> list = new ArrayList<SampleUser>();
		for (int i=0; i<1000; i++) {
			SampleUser user= new SampleUser(
					String.valueOf(i+1),
					String.format("u%04d@sample.com",i+1));
			list.add(user);
		}
		return list;
	}
}
```
**point**
@RestControllerはhtml以外のデータを返すためのアノテーションです

ユーザデータの一覧を返します。1000件のデータを作成して返してみましょう。

5.html

```index.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>ユーザ一覧</title>
<meta name="description" content="ユーザ一覧">
<link th:href="@{/webjars/bootstrap/4.0.0/css/bootstrap.min.css}" rel="stylesheet" />
<script type="text/javascript" th:src="@{/webjars/jquery/3.2.1/jquery.min.js}"></script>
<script type="text/javascript" th:src="@{/webjars/bootstrap/4.0.0/js/bootstrap.min.js}"></script>
<link rel="stylesheet" th:href="@{/DataTables-1.10.16/css/jquery.dataTables.min.css}"/>
<link rel="stylesheet" th:href="@{/DataTables-1.10.16/css/dataTables.bootstrap4.min.css}"/>
<script type="text/javascript" th:src="@{/webjars/jquery-ui/1.12.1/jquery-ui.min.js}"></script>
<script type="text/javascript" th:src="@{/DataTables-1.10.16/js/jquery.dataTables.min.js}"></script>
<script type="text/javascript" th:src="@{/DataTables-1.10.16/js/dataTables.bootstrap4.min.js}"></script>
<style>
</style>
</head>
<body>
	<table id="table1" class="table table-bordered table-hover table-lg">
		<thead class="thead-light">
			<tr>
				<th>ユーザ名</th>
				<th>メールアドレス</th>
			</tr>
		</thead>
		<tbody>
		</tbody>
	</table>
	<script th:inline="javascript">
	/*<![CDATA[*/
		var modalesectiondata = null;
		$(function(){
		    // datatableの設定を変更
			var modalesectiontable = $("#table1").DataTable({
				"bPaginate": true,
				"bLengthChange": false,
				"bFilter": true,
				"bSort": false,
				"bInfo": false,
				"bAutoWidth": false,
				"language": {
					"url": /*[[@{/DataTables-1.10.16/Japanese.json}]]*/ 'Japanese.json'
				},
				"ajax": { url: /*[[@{/getuserlist}]]*/ 'getuserlist', dataSrc: '' },
				"columns": [
					{ data: "username" },
					{ data: "mailaddress" },
				],
				"columnDefs": [
					{ targets: 0, width: 60 },
					{ targets: 1, width: 180 },
					{targets:'_all',className : 'dt-head-center'},
				]
			});
		})
	/*]]>*/
	</script>
</body>
</html>
```
**point**
ajaxパラメータに、RestControllerのURLを指定しています。

6.実行してみます。
![DataTables.png](https://qiita-image-store.s3.amazonaws.com/0/246741/7655a2ba-95e7-76c6-6e5a-b13b7cb8fa89.png)

一覧表を簡単に作成できました。