WIFI-ID:TP-LINK_3948

PASS :55784405

URL:https://onefall.co.jp/knowledge/doc/index_java.html/

フレームワークを使ってWEB開発!
Docker+Java+SpringBootハンズオン

本講座の対象者


・WEBアプリ作成したい人

・dockerで環境構築したい人

・docker-composeで環境構築したい人

・SpringBoot環境構築したい人

・SpringBootアプリ作成したい人

本講座のゴール


・JavaフレームワークSpringBootについて理解します。

・docker-composeについて理解します。

・docker-composeでSpringBoot環境のWEBアプリ構築について理解します。

自己紹介

氏名:梅本 利春:フリーランスエンジニア(15年くらい)

出身:北海道紋別郡湧別町

経歴:WEBアプリ(主にバックエンド)、Androidアプリ、GUIアプリなど

使用言語:Go/Java/Android/C#/Ruby/Python/Javascript

使用DB:Oracle/Postgresql/MySQL/SQLite

プログラミング言語シェア

プログラミング言語求人数

ハンズオンの流れ


1.Dockerセットアップ

2.JDKセットアップ

3.Sprint Tool Suite4環境構築

4.Docker環境構築

5.SpringBootで画面アプリ作成

時間があれば・・・


6.Docker概要

7.SpringBoot概要

8.SpringBootで登録機能作成

9.DBVearセットアップ

10.さくらエディタセットアップ

1.Dockerセットアップ

(64bit Windows 11/Windows 10 Pro/10Pro以外)

Windows環境構築(64bit Windows 10 Pro)

1.Docker for Windowsのダウンロード

2.Docker for Windowsのインストール

1.Docker for Windowsのダウンロード

 URL:https://docs.docker.com/docker-for-windows/install/

 「Download from Docker Store」選択

 「Get Docker」選択

2.Docker for Windowsのインストール

 そのまま「OK」を選択


	//バージョン確認
>docker --version
 Docker version 20.10.21
>docker-compose --version
 docker-compose version 2.13.0
						
1.Dockerセットアップ(Mac)

Mac環境構築

1.Docker for Macのインストール

2.Docker-composeインストール

URL:https://docs.docker.com/docker-for-mac/install/

Download from Docker Store

ログイン(アカウントが必要になります。)

Get Dockerでダウンロード、インストール


		バージョン確認
		$ docker --version
		Docker version 20.10.21
		>docker-compose --version
		 docker-compose version 2.13.0
							

2.JDKセットアップ(Windows)

JDK17.0.6のダウンロード

URL:https://www.oracle.com/technetwork/java/javase/downloads/index.html

「Java17」タブ選択、Java 17.0.6のDownloadリンク選択

※Java17が表示されてない場合はJava19を選択

Windows: 「Accept」選択後、「jdk-17.0.6_windows-x64_bin.exe」選択してダウンロード

Mac  : 「Accept」選択後、「dk-17.0.6_osx-x64_bin.dmg」選択してダウンロード

 ダウンロードされたファイルを実行

 1.次へ

 2.インストール先を入力して次へ

 3.次へ

 4.インストールされた旨の画面に進んだので「閉じる」選択

 JAVA_HOME設定

 1.コントロールパネル⇒システム⇒システムの詳細設定⇒環境変数

 2.システム環境変数に「JAVA_HOME」があれば選択、編集ボタン、なければ新規ボタンを選択

  ※存在する場合は既存のアプリケーションに影響しますので終了後に戻してください。

 3.インストールしたホームディレクトリを入力

  例:C:\ProgramFIles\Java\jdk-17

 確認

 1.DOSを開く


java -version  #java version "17.0.6" 2023-01-17 LTS
path           #jdkのbinパスが出力されることを確認:C:\Program Files\Java\jdk-17\bin;
						

2.JDKセットアップ(Mac)

JDK17のダウンロード

URL:https://www.oracle.com/technetwork/java/javase/downloads/index.html

Java SE 17.0.6(LTS)の「Download」選択

Windows: 「Accept」選択後、「jdk-17.0.6_windows-x64_bin.exe」選択してダウンロード

Mac  : 「Accept」選択後、「dk-17.0.6_osx-x64_bin.dmg」選択してダウンロード

 ダウンロードされたファイルを実行

 1.ダブルクリック

 2.続ける

 3.インストール

 4.閉じる

 5.バージョン確認


#バージョン確認 java version "17.0.6" 2023-01-17 LTS
java -version
						

JDKのアンインストール※参考まで


cd /Library/Java/JavaVirtualMachines
ls                                               #jdk確認
#ファイル命名:/Library/Java/JavaVirtualMachines/jdkmajor.minor.macro[_update].jdk
# jdk1.7.0_80.jdkをアンインストールする場合
sudo rm -rf jdk1.7.0_80.jdk
						
.
3.STS環境構築

STS4インストール

STS4ダウンロードURL:https://spring.io/tools

「4.18.0 - Windows X86_64」を選択、ダウンロード後、所定のフォルダに移動して、ダブルクリックで解凍

解凍されたフォルダ名を変更「sts-4.18.0.RELEASE」→「STS」

日本語化プラグインダウンロード、解凍

URL:https://willbrains.jp/

setup.exeを起動し、日本語化するSpringToolSuite4.exeを選択。

lombokダウンロードURL:https://projectlombok.org/download

ダウンロードしたlombokをダブルクリック

SpringToolSuite4.exeのインストール先が表示されてることを確認し、インストール

4.Docker環境構築

1.適当な場所にsampleフォルダを作成します。

2.docker-compose.yml作成します。ファイル名:docker-compose.yml


version: '3'

services:
  db:
    image: postgres:10.1
    ports:
      - "5432:5432"
    volumes:
      - postgres-db:/var/lib/pgsql/data
volumes:
  postgres-db:
    driver: local
						

3.起動


docker-compose up -d
						

4.DBサーバ接続、環境設定


docker ps                                        #dockerコンテナID取得
docker exec -it コンテナID bash                  #DBサーバ接続
su - postgres                                    #postgresユーザ切替
psql -U postgres                                 #DB接続
create user java_user with password 'java_user'; #java_userユーザ作成
create database java_db;                         #java_dbデータベース作成
\q                                               #DB切断
psql -U postgres -d java_db                      #postgresユーザでjava_db接続
ALTER ROLE java_user WITH SUPERUSER;             #ユーザ権限設定
CREATE SCHEMA java_user;                         #スキーマ作成
\q                                               #DB切断
psql -U java_user -d java_db                     #java_userユーザで接続
create table java_user.uketuke (UKE_NO SERIAL,SEI_NAME varchar(100), MEI_NAME varchar(100) ,NK_ADD varchar(13), NM_ADD1 varchar(200), NM_ADD2 varchar(200) , NM_ADD3 varchar(200) ,NK_TEL varchar(15), GENDER_NO varchar(2), BIRTHDAY_DT timestamp without time zone , NK_MAIL varchar(300), NK_PASS varchar(50) );
ALTER TABLE java_user.uketuke ADD PRIMARY KEY(UKE_NO);  #プライマリーキー追加
INSERT INTO java_user.uketuke ( SEI_NAME,MEI_NAME,NK_ADD,NM_ADD1,NM_ADD2,NM_ADD3,NK_TEL,GENDER_NO,BIRTHDAY_DT,NK_MAIL,NK_PASS) VALUES ( 'umemoto','toshiharu1','111-0001','kanagawa','yokohamasi-kohoku-ku','tunasima3-5-33','09012345678',1,'1979-05-22','test1@gmai.com','test');
INSERT INTO java_user.uketuke ( SEI_NAME,MEI_NAME,NK_ADD,NM_ADD1,NM_ADD2,NM_ADD3,NK_TEL,GENDER_NO,BIRTHDAY_DT,NK_MAIL,NK_PASS) VALUES ( 'umemoto','toshiharu2','111-0002','kanagawa','yokohamasi-kohoku-ku','tunasima3-5-34','09012345679',0,'1979-05-23','test2@gmai.com','test');
INSERT INTO java_user.uketuke ( SEI_NAME,MEI_NAME,NK_ADD,NM_ADD1,NM_ADD2,NM_ADD3,NK_TEL,GENDER_NO,BIRTHDAY_DT,NK_MAIL,NK_PASS) VALUES ( 'umemoto','toshiharu3','111-0003','kanagawa','yokohamasi-kohoku-ku','tunasima3-5-35','09012345670',1,'1979-05-24','test3@gmai.com','test');
INSERT INTO java_user.uketuke ( SEI_NAME,MEI_NAME,NK_ADD,NM_ADD1,NM_ADD2,NM_ADD3,NK_TEL,GENDER_NO,BIRTHDAY_DT,NK_MAIL,NK_PASS) VALUES ( 'umemoto','toshiharu4','111-0004','kanagawa','yokohamasi-kohoku-ku','tunasima3-5-36','09012345671',0,'1979-05-25','test4@gmai.com','test');
INSERT INTO java_user.uketuke ( SEI_NAME,MEI_NAME,NK_ADD,NM_ADD1,NM_ADD2,NM_ADD3,NK_TEL,GENDER_NO,BIRTHDAY_DT,NK_MAIL,NK_PASS) VALUES ( 'umemoto','toshiharu5','111-0005','kanagawa','yokohamasi-kohoku-ku','tunasima3-5-37','09012345672',1,'1979-05-26','test5@gmai.com','test');
\q                                                           #DB切断
						
5.Javaアプリ作成

機能概要

 データベースからユーザー情報を取得して一覧表示

1.プロジェクト作成

 パッケージエクスプローラ右クリック⇒新規⇒Spring スターター・プロジェクト

 名前:test20230325

 タイプ:Gradle

 パッケージ:com.example

 その他はそのままで次へ

Spring Bootバージョン:3.0.5

依存関係は下記を選択

 Spring Web :URL MappingなどのAPIを提供

 Thymeleaf:テンプレートエンジン。HTMLでフロント作成できる。

 JDBC API:DBドライバ

 PostgreSQL Driver:DB

 Lombok:アノテーション(@Data)でgetter/setterなどを自動生成

 ファイル構成

ファイル構成(Maven標準ディレクトリ)


test20181223
├── src/main/java                              # 作成するアプリケーション/ライブラリのソースコード。
│   └── com.example                         #★
│       └── Test20181223Application     # メインクラス
├── src/main/resources                         #★ 作成するアプリケーション/ライブラリのリソース。
│   ├── static                              # js/cssファイル格納用
│   ├── templates                           # テンプレートエンジン。HTMLが格納される
│   └── application.properties              # 設定情報:DB接続/ポート番号
├── src/test/java                              #
│   └── com.example                         #
│       └── Test20181220ApplicationTests # 検証用クラス
├── JREシステムライブラリ                      # ライブラリ
├── Maven依存関係                              # Maven依存関係
├── target/generated-sources/annotations       # ソースコード生成
├── target/generated-test-sources/test-annotations  # テスト用ソース生成
├── src                                        # ディレクトリ
│     ├── main                                #
│     └── test                                #
├── target                                     # ディレクトリ
│     ├── generated-sources                   #
│     └── generated-test-sources              #
├── mvnw                                       # Maven Warapperラッパースクリプト。バージョン互換性に対応
├── mvnw.cmd                                   #
└── pom.xml                                    # 依存関係
						

設定:src/main/resources/application.properties

application.properties:設定情報

※コピペする際はコメント欄は除外してください。


spring.datasource.url=jdbc:postgresql://localhost:5432/java_db
spring.datasource.username=java_user
spring.datasource.password=java_user
spring.datasource.driver-class-name=org.postgresql.Driver
server.port=8000

#コメント欄
#spring.datasource.url=jdbc:postgresql://localhost:5432/java_db             PostgreSQLデータベース:Win10ProまたはMac
#spring.datasource.url=jdbc:postgresql://192.168.33.10:5432/java_db         PostgreSQLデータベース:Vagrant環境※環境に応じて変更
#spring.datasource.username=java_user                                       PostgreSQLユーザー
#spring.datasource.password=java_user                                       PostgreSQLパスワード
#spring.datasource.driver-class-name=org.postgresql.Driver                  PostgreSQLドライバ
#server.port=8000                                                           Webポート番号
						

WEBサーバー起動

起動確認:Webサーバを起動してログ上でエラーが発生していないか確認してください。

Uketukeクラス作成:src/main/java/com/example/Uketuke.java

Uketuke.java:Uketukeテーブルとマッピング(DBと連携)


package com.example;

import lombok.Data;

@Data
public class Uketuke {
    private int ukeNo;
    private String seiName;
	private String meiName;
    private String nkAdd;
	private String nmAdd1;
	private String nmAdd2;
	private String nmAdd3;
    private String nkTel;
	private String genderNo;
    private String birthdayDt;
	private String nkMail;
	private String nkPass;
}
						

UketukeMapperクラス作成:src/main/java/com/example/UketukeMapper.java

UketukeMapper.java:ORマップ定義。DBから取得したデータをUketukeクラスにセット

※コピペする際は開始タグ<が全角の為、半角に修正お願いします。


package com.example;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import org.springframework.jdbc.core.RowMapper;

public class UketukeMapper implements RowMapper<List<Uketuke>> {
    public List<Uketuke> mapRow(ResultSet rs, int rowNum)
    		throws SQLException {
        List<Uketuke> list = new ArrayList<>();
        do {
            Uketuke uketuke = new Uketuke();
            uketuke.setUkeNo(rs.getInt("uke_no"));
            uketuke.setSeiName(rs.getString("sei_name"));
			uketuke.setMeiName(rs.getString("mei_name"));
			uketuke.setNkAdd(rs.getString("nk_add"));
			uketuke.setNmAdd1(rs.getString("nm_add1"));
			uketuke.setNmAdd2(rs.getString("nm_add2"));
            uketuke.setNmAdd3(rs.getString("nm_add3"));
            uketuke.setNkTel(rs.getString("nk_tel"));
			uketuke.setGenderNo(rs.getString("gender_no"));
			uketuke.setBirthdayDt(rs.getString("birthday_dt"));
			uketuke.setNkMail(rs.getString("nk_mail"));
            uketuke.setNkPass(rs.getString("nk_pass"));
            list.add(uketuke);
        } while (rs.next());
        return list;
    }
}
						

サービス:src/main/java/com/example/UketukeService.java

UketukeService.java:ビジネスロジック

SQLで取得した結果をUketukeクラスリストにセット

※コピペする際は開始タグ<が全角の為、半角に修正お願いします。


package com.example;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
@Transactional //宣言的トランザクション管理:begin/commit/rollbackを直接書かない。publicのみ。メソッド開始/終了で制御
public class UketukeService {

	@Autowired
	private JdbcTemplate jdbcTemplate;

	public List<Uketuke> getUketukeList() {
		List<Uketuke> uketukeList = jdbcTemplate.queryForObject("select * from java_user.uketuke", new UketukeMapper());

		return uketukeList;
	}
}
						

コントローラ:src/main/java/com/example/UketukeController.java

UketukeController.java:リクエストを受け取りマッピングするコントローラ

※コピペする際は開始タグ<が全角の為、半角に修正お願いします。


package com.example;

import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
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 UketukeController {

	@Autowired
	private UketukeService uketukeService;

	@RequestMapping(path = "/uketuke", method = RequestMethod.GET)
	String index(Model model) {
		List<Uketuke> list = this.uketukeService.getUketukeList();
	    model.addAttribute("list", list);
	    return "uketuke/index";
	}
}
						

src/main/resources/templates⇒新規⇒フォルダ:uketuke

HTML:src/main/resources/templates/uketuke⇒新規⇒ファイル:index.html

index.html:画面表示するHTML

※コピペする際はDOCTYPE、html、head、bodyの開始タグ<が全角の為、半角に修正お願いします。


<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>

Insert title here


</head>
<body>

	
受付NO 名前(姓) 名前(名) 郵便番号 住所1 住所2 住所3 TEL 性別 誕生日 メールアドレス パスワード
</body> </html>
動作確認

1.docker-compose.ymlファイルが存在する場所で下記コマンド実行

※すでに実行済の場合は不要です


docker-compose up -d
						

2.WEBサーバー起動

3.WEBブラウザで確認

 URL:http://localhost:8000/uketuke

CSSで見た目の修正

src/main/resources/static/⇒新規⇒フォルダ:css

HTML:src/main/resources/static/css/⇒新規⇒ファイル:index.css

index.css:トップページのスタイルCSS


@charset "UTF-8";


/*********************************
*             表題              **
**********************************/

p {
	text-align: center;
	font-size: 30px;
}

/**********************************
*   線と表示サイズの設定         **
**********************************/


table {
	border-collapse: collapse;
	border: solid thick;
	table-layout: fixed;
	}

colgroup, tbody {
	border: solid medium;
	}

  th {
   border: solid thin;
   height: 2.4em;
   width: 2.4em;
   }
  td {
   border: solid thin;
   height: 2.4em;
   width: 2.4em;
   text-align: center;
   padding: 0;
   }





/**********************************
*   表の位置とデザインの設定     **
**********************************/

table.list {
font-size: 15px;
margin: 0 auto;
border-collapse: separate;
border-spacing: 0px 1px;
}

table.list th {
padding: 12px;
vertical-align: middle;
text-align: center;
border-bottom: #999 1px solid;
color:#fff;
}

table.list td {
padding: 12px;
vertical-align: middle;
text-align: left;
border-bottom: #999 1px solid;
font-size: 15px;
}

table.list th.r1 {
width: 152px;
border-right: #999 1px solid;
background: #447791;
}

table.list th.r2,
table.list td.r2 {
width: 128px;
border-left: #fff 1px solid;
border-right: #999 1px solid;
background: #5893b1;
}

table.list th.r2,
table.list th.r3,
table.list th.r4 {
text-align: center;
}

table.list th.r3,
table.list td.r3 {
width: 128px;
border-left: #fff 1px solid;
border-right: #999 1px solid;
background: #7cacc2;
}

table.list th.r4,
table.list td.r4 {
width: 128px;
border-left: #fff 1px solid;
background: #a0c2d3;
}

/**********************************************
*   表のマウスホバー時の配色変更の設定       **
**********************************************/

.list {
		border:1px;
}

.list tr:hover
{
    background: #fbf8e9;
    -o-transition: all 0.1s ease-in-out;
    -webkit-transition: all 0.1s ease-in-out;
    -moz-transition: all 0.1s ease-in-out;
    -ms-transition: all 0.1s ease-in-out;
    transition: all 0.1s ease-in-out;
}


/**********************************************
*              ボタンの設定                 **
**********************************************/

.btn-circle-flat {
  display: inline-block;
  text-decoration: none;
  background: #87befd;
  color: #FFF;
  width: 120px;
  height: 120px;
  line-height: 120px;
  border-radius: 50%;
  text-align: center;
  vertical-align: middle;
  overflow: hidden;
  transition: .4s;
}

.btn-circle-flat:hover {
  background: #668ad8;
}

.button {
	text-align: center;
}

						

WEBブラウザで確認

 URL:http://localhost:8000/uketuke

6.Docker概要

Dockerの登場背景

○物理環境から仮想環境への流れ

 オンプレで動く環境はハードの納品が遅い、構築手順が複雑、
 手順書が古くなる、無駄なリソースが必要など諸問題あり

 Hyper-Vなどの仮想環境により1台で複数の仮想マシンが動作できる。
 スケールしやすい、リソース共有が便利、仮想化の流れへ

○新たな課題

 アプリケーションの移植は従来どおりで手順書依存、
 自分の環境では動くが他の環境では動かないといった問題が発生

○Dockerへ

 Dockerfileを構築手順として構成管理することで手順書依存から脱却。

 Dockerfileを配布することで環境依存からの脱却

 仮想OSを必要としないのでHyper-V等よりメモリ消費が少ない

Docker実行環境の例。

Dockerとは非常に軽量なコンテナ型のアプリケーション実行環境

CPUやメモリ、ディスク入出力など、コンテナ内で利用するリソースを他のコンテナから隔離したり、設定に基づいて振り分けたりする機能。

Dockerでは、最終的なアプリケーションはホストOS上の1つのプロセスとして実行されているため、余計なオーバーヘッドがない。

ハイパーバイザ型やホスト型の仮想実行環境の例。

この環境では、仮想化されたハードウェア上でLinux OSが動作し、さらにその上で目的のアプリケーションのプロセスが動作している。

アプリケーションを実行するためにはまずゲストOSを稼働させなければならず、起動に時間もかかるし、CPUやメモリ、ディスクなどのリソースも多く消費する。

Dockerと仮想マシンの比較

Dockerコンポーネント

 Docker Engineを中心に複数のコンポーネント単位で機能開発

 必要に応じて複数のコンポーネントを組み合わせて使用

Dockerのメリット

・コード化されたファイルを共有することで、どこでも誰でも同じ環境が作れる。

・作成した環境を配布しやすい。

・スクラップ&ビルドが容易にできる。

Dockerを一通りこなすためには・・・

Dockerfileを書いて

docker buildコマンドでDockerイメージをビルドして

そのイメージを何らかのリポジトリ(DockerHub等)にdocker pushして

そのイメージを何らかのVM上にdocker pullして

そのイメージをdocker runしてコンテナを実行して

そのコンテナの特定のポートに外部からアクセスする

といった一連の作業を自分一人で出来ることが望ましい

Docker-composeとは

 複数コンテナのDockerアプリケーションを定義、実行するツール

 Dockerだけでは複数コンテナを一斉に操作できない為にdockere-composeがつくられた。

 docker-compose.ymlに記載して各コンテナが起動する

docker-composeのメリット

・開発、テスト環境に適している

・単一ホスト上でも環境を分けたい場合に利用

・Composeファイルを再利用できる

7.Spring Boot概要

Spring Bootの特徴

Spring Bootとは

 Spring Frameworkでアプリケーションを簡単に作るための仕組み

 ○ XML設定ファイルの記述が不要

 ○ アノテーションによってコーディング量の削減

 ○ Webコンテナを内含:デフォルトでTomcatコンテナが含まれる。

 ○ Jarファイル単体でWEBアプリが可能。

Spring Boot以前のSpring Framework

問題点:組み合わせが難しい、初期セットアップが大変

Spring Boot

・あらかじめおススメの組み合わせが決まっている。

・依存ライブラリを同根するだけで自動で設定ができる

・組み込みサーバを同根し、アプリを即実行可能。

MVCモデル

コントローラ:モデルで引っ張ってきた情報をどのようにみせるかを記述する場所

モデル:データベースと連携が取れる場所

ビュー:HTMLファイル。ユーザーに表示される場所

プロジェクトの依存関係

要するにここで使いたいSpringフレームワークを選ぶ

ここで選んだフレームワークが pom.xml に書き込まれ、Mavenが必要なJar一式を落としてくれる

今回のアプリで選んだフレームワークは以下の通り

・Web:リクエストマッピングで使用

・Thymeleaf:HTMLテンプレートエンジン。

・Postgresql:データベース

・JDBC:データベースを接続するドライバ

・Lombok:アノテーション(@Data)でgetter/setterなどを自動生成

基本的な使い方

フレームワークを利用する。必要に応じてpom.xmlに追加することで柔軟に拡張可能。

pom.xmlに追加するとMaven依存関係ライブラリに必要なJarファイルがダウンロードされる。

下記URLのリクエストマッピングを実装する場合

URL:http://localhost:8000/web/test

コントローラクラスにwebをマッピングしてメソッドにtestをマッピングします。


@Controller
@RequestMapping("web")
public class SampleController {

	@RequestMapping(path = "/test", method = RequestMethod.GET)
	String showPage(Model model) {
	    return "test";
	}

}
						

pom.xml




	org.springframework.boot
	spring-boot-starter-jdbc



	org.springframework.boot
	spring-boot-starter-thymeleaf



	org.springframework.boot
	spring-boot-starter-web




	org.postgresql
	postgresql
	runtime



	org.projectlombok
	lombok
	true



	org.springframework.boot
	spring-boot-starter-tomcat
	provided



	org.springframework.boot
	spring-boot-starter-test
	test

						
8.Spring Boot登録機能

UketukeFormクラス作成:src/main/java/com/example/UketukeForm.java

UketukeForm.java:HTMLと連携


package com.example;

import lombok.Data;

@Data
public class UketukeForm {
	private int ukeNo;
    private String seiName;
	private String meiName;
    private String nkAdd;
	private String nmAdd1;
	private String nmAdd2;
	private String nmAdd3;
    private String nkTel;
	private String genderNo;
    private String birthdayDt;
	private String nkMail;
	private String nkPass;
}
						

○登録:サービス

 UkektukeServiceに追加処理追加

 ソース:UketukeService.java

※コピペする際は開始タグ<が全角の為、半角に修正お願いします。


//下記import追加
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;

@Service
@Transactional
public class UketukeService {

	@Autowired
	private JdbcTemplate jdbcTemplate;

	public List<Uketuke> getUketukeList() {
		List<Uketuke> userList = jdbcTemplate.queryForObject("select * from java_user.uketuke", new UketukeMapper());

		return userList;
	}

	//下記メソッド追加
	public boolean insertUketuke(Model model, @ModelAttribute  UketukeForm uketukeForm) {
		jdbcTemplate.update("INSERT INTO java_user.uketuke(sei_name,mei_name,nk_add,nm_add1,nm_add2,nm_add3,nk_tel,gender_no,birthday_dt,nk_mail,nk_pass) VALUES(?,?,?,?,?,?,?,?,to_timestamp(?,'yyyy-MM-dd'),?,?)",uketukeForm.getSeiName(),uketukeForm.getMeiName(),uketukeForm.getNkAdd(),uketukeForm.getNmAdd1(),uketukeForm.getNmAdd2(),uketukeForm.getNmAdd3(),uketukeForm.getNkTel(),uketukeForm.getGenderNo(),uketukeForm.getBirthdayDt(),uketukeForm.getNkMail(),uketukeForm.getNkPass());
		return true;
	}
}
						

○登録画面表示:コントローラ

 UketukeControllerにリクエストマッピング=/memberのメソッド=GETで追加

 UketukeControllerにリクエストマッピング=/memberRegのメソッド=POSTで追加

 ソース:UketukeController.java

※コピペする際は開始タグ<が全角の為、半角に修正お願いします。


package com.example;

//下記import追加
import org.springframework.web.bind.annotation.ModelAttribute;

@Controller
public class UketukeController {

	//下記メソッド追加 UketukeControllerにリクエストマッピング=/memberのメソッド=GETで追加
	@RequestMapping(path = "/member", method = RequestMethod.GET)
	String member(Model model) {
	    return "/uketuke/member";
	}

	//下記メソッド追加 SampleControllerにリクエストマッピング=/memberのメソッド=POSTで追加
	@RequestMapping(path = "/member", method = RequestMethod.POST)
	String memberReg(Model model, @ModelAttribute  UketukeForm uketukeForm ) {
		this.uketukeService.insertUketuke(model, uketukeForm);
	    List<Uketuke> list = this.uketukeService.getUketukeList();
	    model.addAttribute("list", list);
		return "/uketuke/index";
	}
}
						

○登録画面表示:ビュー

 member.html追加

 ソース:src/main/resources/templates/uketuke/member.html

※コピペする際はDOCTYPE、html、head、bodyの開始タグ<が全角の為、半角に修正お願いします。

※;(セミコロン)でエラー表示されますが問題ありませんので無視してください。


<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
	
	Insert title here
	
	
</head>
<body>

	
(※)は必須
1
お名前
(※)氏名(姓)
(※)氏名(名)
ご住所
(※)郵便番号
(※)住所(都道府県)
(※)住所(市区町村)
(※)住所(番地/号室)
ご連絡先
(※)電場番号
性別
(※)性別
生年月日
   生年月日
2
メールアドレス
(※)アドレス
パスワード
(※)パスワード
(※)パスワード再入力
</body> </html>

○登録画面表示:スタイルシート

 ソース:src/main/resources/static/css/member.css


@charset "UTF-8";

.kana {
	ime-mode: active;
}

button._hidden {
	display: none;
}



.container {
	width: 1100px;
	margin-right: auto;
	margin-left: auto;
}
.box {
    display: table-cell;
}
.row {
    display: table-row;
}
.gray {
    background: gray;
	width: 1000px
}

.silver {
    background: silver;
}

.orange {
    background: orange;
}

.row2 {
	height: 100px;
}
.UserInfo1_1 {
    width: 220px;
    background: #e7f3f0;
	float:left;
}
.UserDtl_1 {
	font-size: 1.3em;
	float:left;
	width: 280px;
}

.UserInfoTitle {
    width: 30px;
	height: 276px;
    font-size: 2.5em;
    color: #FFFFFF;
    background: #1e9484;
	float:left;
	border: 1px solid gray;
}
.UserInfoTitle2 {
    width: 30px;
	height: 90px;
    font-size: 2.5em;
    color: #FFFFFF;
    background: #1e9484;
	float:left;
	border: 1px solid gray;
}
.head {

    font-size: 1.3em;
    font-weight: bold;
    margin: 0 1px 0 2px;
	height: 30px;
}
.head2 {
    font-size: 1.3em;
    font-weight: bold;
    margin: 0 1px 0 2px;
	height: 60px;
}
.head3 {
    font-size: 1.3em;
    font-weight: bold;
    margin: 0 1px 0 2px;
	height: 120px;
}

/** 登録ボタン **/
.flat.fade {
  position: relative;
  text-align: center;
  /* 中央揃え */
  display: block;
  margin: 0 auto;
  /* 幅の指定 */
  width: 100%;
  max-width: 200px;
  box-sizing: border-box;
  padding: 10px;
  /* 色の指定 */
  background: linear-gradient(135deg, #ffd900, #ff9300);
  color: #fff;
  font-weight: bold;
  border-radius: 8px;
  transition: 0.3s;
}
.flat.fade:hover {
  opacity: 0.7;
}
.flat.fade:active, .flat.fade:focus {
  top: 2px;
}


						

○登録処理:JavaScript

 ソース:src/main/resources/static/js/member.js


function executeSubmit() {
	var name = document.getElementById('seiName').value;
	if ( name == '' ) {
		alert('氏名を入力してください');
		return;
	}
	console.log(name);
	document.forms[0].submit();
	return;
}

$(function(){
	  // ここにプログラムを記述
	  $('#num-input').on('input', function() {
	  	console.log('test1');
	      // 半角変換
	      var halfVal = $(this).val().replace(/[!-~]/g,
	          function (tmpStr) {
	              // 文字コードをシフト
	              return String.fromCharCode(tmpStr.charCodeAt(0) - 0xFEE0);
	          }
	      );
	    // 数字以外の不要な文字を削除
	    $(this).val(halfVal.replace(/[^0-9]/g, ''));
	  });
});
						

動作確認

 URL:http://localhost:8080/uketuke

次回セミナー(まだ検討中ですが。。)


 1.会員登録、注文登録

  業務で扱うような画面設計を考慮した登録機能

 2.API

  JSONを使用したAPI連携機能

 3.その他

  DB設計しながら作成するアプリ、他検討中・・・