DDL と DLL の違い

DDLDLLは全く違うものです。

わかっちゃいるけど、どっちがどっちか頻繁に忘れるので記録します。

共通点はどちらも拡張子になることぐらいです。

DDLとは、テーブル構造を定義する言語です。

  • 正式名称:Data Definition Language
  • 別名:データ定義言語
  • リレーショナルデータベースのテーブルを制御する言語。

www.weblio.jp

「CREATE」「DROP」「ALTER」などが書いてあるやつです。

  • テーブル全体の作成・変更・削除などを行う際に使用する。

仲間には、レコード単位の操作を行うDMLがあります。

  • 正式名称:Data Manipulation Language
  • 別名:データ操作言語
  • リレーショナルデータベースのレコードを制御する言語。
  • テーブル内のレコードの追加・検索・更新・削除などを行う際に使用する。
「SELECT」「INSERT」「UPDATE文」「DELETE」などが書いてあるやつです。
  • データベースにおいてデータの検索・新規登録・更新・削除を行うための言語である。

www.weblio.jp

DLLとは、プログラムを動かす時に使う部品です。

  • 正式名称:Dynamic Link Library
  • 別名:共有ライブラリ、シェアドライブラリ、動的リンクライブラリ
  • 様々なプログラムから利用される汎用性の高い機能を収録した、部品化されたプログラムのこと。
  • 単体で実行することはできず、実行可能ファイル(EXEファイルなど)が起動する際に自動的に連結されてメモリ上に展開される。
  • 多くのプログラムが共通して必要とする機能が収められており、様々なプログラムの一部として取り込まれて実行される。

www.weblio.jp

f:id:ponsuke_tarou:20180918221636j:plain

メールを送信での認証技術に POP before SMTP と SMTP-AUTH

前回の勉強内容

ponsuke-tarou.hatenablog.com

今回の勉強内容 : メール送信時の認証方法

勉強のきっかけになった問題

SMTP-AUTHの特徴はどれか。

ア. ISP管理下の動的IPアドレスからの電子メール送信について,管理外ネットワークのメールサーバへSMTP接続を禁止する。
イ. PCからメールサーバへの電子メール送信時に,ユーザアカウントとパスワードによる利用者認証を行う。
ウ. PCからメールサーバへの電子メール送信は,POP接続で利用者認証済の場合にだけ許可する。
エ. 電子メール送信元のサーバが,送信元ドメインDNSに登録されていることを確認して,電子メールを受信する。
平成27年春期問16 SMTP-AUTHの特徴はどれか|情報処理安全確保支援士.com

メール送信時の認証技術には、「POP before SMTP」「SMTP-AUTH」があります。

むかしむかし、SMTPには認証の仕組みがありませんでした。

それに伴い、大量のメールを送り付ける「迷惑メール」が流行りました。

POP before SMTPは、メールを送信する前にPOP3認証を行って認証できたらメールを送信する仕組みです。

SMTPに認証のしくみはないけれど、メール受信で使うPOP3にはIDとパスワードによる認証の仕組みがあります。

https://asahi-net.jp/support/guide/mail/img/0598-1.gif
POP before SMTP方式|プロバイダ ASAHIネット

http://www.tku.ac.jp/~densan/local/mail/popbeforesmtp.gif
メールの利用:メールソフト編

POP3認証をしてから数分間は、認証なしで送信し放題なのでスパムメールが送信できるかもしれない。

複数のPCで同じIPアドレスを使用するNAT環境下では認証を通った人と違う人がメールを送信できる。

SMTP-AUTHは、メールサーバがメール送信者をIDとパスワードで認証してからメールを送信する仕組みです。

  • 読み方:エスエムティーピー・オース
  • 日本語:SMTP認証
  • 別名:SMTP Authentication
  • 規定:RFC 2554

https://www.tiki.ne.jp/security/img/spam_fig2.gif
SMTP認証について セキュリティ TikiTikiインターネット

https://www.wfwfserver.ne.jp/function/images/smtpauth.gif
SMTP AUTH 低価格で高品質のレンタルサーバーをご提供するわふわふサーバー

認証方法には種類があります。

PLAINは、暗号化しないでユーザー名/パスワードをそのまま送る仕組みです。

パスワードが平文で流れているので危険な方式です。

LOGINは、標準化されておらず独自の実装をしているメールサーバーもあって互換性が低い方式です。

ユーザー名/パスワードはBASE64に変換される(XXXXXの部分の事)
ユーザー名/パスワードを別々に送信したり一緒に送信したりする(やり方はそれぞれ)

CRAM-MD5は、パスワード文字列がそのままネットワークを流れることがないように、暗号化が施されます。

MD5を使用してチャレンジ-レスポンス認証を行い、パスワードそのものは暗号化された状態でも送信はしません。

  • 流れ
    1. サーバーとクライアントが共通に知っているパスワードを用意
    2. サーバーは、クライアントに対し任意の文字列(Challenge文字列)を送る
    3. クライアントはそのChallenge文字列と共通パスワードを使い、MD5で計算処理を行う
    4. 結果をサーバーに返す
    5. クライアントからの返答が傍受されても、ここからパスワードを復元するのは困難
    6. サーバーは、自分でも同じ処理を行ない、結果が一致すれば相手が正しくパスワードを知っているとして認証する
DIGEST-MD5は、CRAM-MD5の拡張版で、辞書攻撃や総当り攻撃などに対する耐性を高めたものです。

f:id:ponsuke_tarou:20180913233607j:plain

次回の勉強内容

スパムメール撲滅を目指す送信ドメイン認証技術

前回の勉強内容

ponsuke-tarou.hatenablog.com

今回の勉強内容 : メールの安全対策

勉強のきっかけになった問題

スパムメールへの対策であるDKIM(DomainKeys Identified Mail)の説明はどれか。

ア. 送信側メールサーバにおいてディジタル署名を電子メールのヘッダに付与し,受信側メールサーバにおいてそのディジタル署名を公開鍵によって検証する仕組み << 正解
イ. 送信側メールサーバにおいて利用者が認証された場合,電子メールの送信が許可される仕組み
ウ. 電子メールのヘッダや配送経路の情報から得られる送信元情報を用いて,メール送信元のIPアドレスを検証する仕組み
エ. ネットワーク機器において,内部ネットワークから外部のメールサーバのTCPポート番号25への直接の通信を禁止する仕組み

平成25年春期問16 DKIMの説明はどれか|情報処理安全確保支援士.com

メールアドレスのドメインを検証することでなりすましや改ざんを検知できるようにする技術を送信ドメイン認証技術といいます。

残念なことにメールは送信元を偽ることができちゃいます。

http://www.infomania.co.jp/images/narisumasi.gif
送信ドメイン認証について

送信ドメイン認証技術には、IPアドレスを利用するタイプと電子署名を利用するタイプがあります。

送信側のIPアドレスを利用するタイプは、あらかじめDNSサーバにIPアドレスを公開しておいて、受信側が送信者のメールアドレスからDNSIPアドレスを検証します。

http://www.infomania.co.jp/images/spf.gif
送信ドメイン認証について

https://sendgrid.kke.co.jp/blog/wp/wp-content/uploads/2016/09/1f4815d36a36fa914b05ccb4be9c7968.png
SPFとは? | SendGridブログ

http://salt.iajapan.org/wpmu/anti_spam/files/2010/01/fig02_701.png
SPF(Sender Policy Framework) : 迷惑メール対策委員会

SFPは、メールの「エンベロープFromにあるメールアドレス」のドメインから送信側メールサーバのIPアドレス取得して検証します。

  • 英語:Sender Policy Framework

Sender IDは、「メールヘッダのFromやSenderにあるメールアドレス」のドメインから送信側メールサーバのIPアドレス取得して検証します。

エンベロープFrom」はメールの配信処理用のメールアドレスで、「メールヘッダのFromやSender」はメーラなどの表示用のメールアドレスです。

  • エンベロープFromは、実際の送信者メールアドレスで宛先にメールが届くとエンベロープFromは削除されます。
  • メールヘッダのFromやSenderは、配信処理には使用されず送信者以外のアドレスを使用することが可能です。

電子署名を利用するタイプは、あらかじめDNSサーバに公開鍵を公開しておいて、受信側がメールヘッダの電子署名DNSで公開鍵を取得して検証します。

  • 流れ
    1. 送信側がDNSサーバに公開鍵を公開する
    2. 送信側が秘密鍵電子署名をつくってメールヘッダにくっつける
    3. 受信側がメールヘッダにあるメールアドレスのドメインからDNSサーバで公開鍵を取得する
    4. その公開鍵で検証する

IIMは、送信側が「電子署名と公開鍵」をメールにくっつけて、受信側が公開鍵を検証します。

  • 英語:Identified Internet Mail

DomainKeysは、認証に失敗したり、電子署名がない場合、何もせずに受け取ります。

IIMとDomainKeysを合わせたDKIMは、認証に失敗したり、電子署名がない場合、どうするかを決められます。

  • 読み方:ディーキム

http://www.infomania.co.jp/images/dk.gif
送信ドメイン認証につい DKIMとDomainKeys

http://image.itmedia.co.jp/ait/articles/0602/16/r20_01.gif
電子署名方式の最新技術「DKIM」とは (1/4):送信ドメイン認証技術解説 - @IT

DMARCは、送信ドメイン認証での「認証結果によるメール配信制御」「認証結果のレポート」を行うシステムです。

  • 英語:Domain-based Message Authentication, Reporting and Conformance
  • 読み方:ディーマーク

https://mailmarketinglab.jp/word-dir/wordpress/wp-content/uploads/2017/04/20170331_04-768x729.jpg
なりすましを撲滅する?「DMARC」の概要をざっくり理解しよう | メルラボ

http://www.twofive25.com/image/imageDMARC25.png
TwoFive、なりすまし対策に有効なDMARCレポートを集計・可視化するサービス「DMARC / 25 Analyze」を提供開始 - クラウド Watch

「検証結果でそのメールをどう扱って欲しいか」を記述した情報の定義をSSPといいます。
  • 英語:Sender Signing Practice
  • SSPは、DNSサーバにあります。

f:id:ponsuke_tarou:20180913225716j:plain

次回の勉強内容

PKIは、世の中の安全を守っています。

前回の勉強内容

ponsuke-tarou.hatenablog.com

今回の勉強内容 : PKIって何?

勉強のきっかけになった問題

PKIを構成するOCSPを利用する目的はどれか。

ア. 誤って破棄してしまった秘密鍵の再発行処理の進捗状況を問い合わせる。
イ. ディジタル証明書から生成した鍵情報の交換がOCSPクライアントとレスポンダの間で失敗した際,認証状態を確認する。
ウ. ディジタル証明書の失効情報を問い合わせる。 >>> 正解
オ. 有効期限の切れたディジタル証明書の更新処理の進捗状況を確認する。

OCSPは、デジタル証明書をCRLを突き合わせて有効かを確認するためのプロトコルです。

ponsuke-tarou.hatenablog.com

PKIは、暗号化技術と電子署名で世の中の安全を守る仕組みです。

PKIとは、公開鍵暗号を正しく発行し配布するシステム。証明局発行の鍵が含まれた証明書をリボジトリで集中管理・配布する。
it-trend.jp

公開鍵暗号技術と電子署名を使って、インターネット上で安全な通信ができるようにするための環境のことを言います。 なりすましやデータの盗聴や改竄を防ぐためのインフラとして近年注目が高まっています。
インターネット用語1分解説~PKIとは~ - JPNIC

データの暗号化とデジタル署名によってPKIは「守秘性」、「完全性」、「認証」、「否認防止」といったセキュリティサービスを提供します。 これらのセキュリティサービスによって、自分が知らぬ間に情報を書き換えられるような事態や、機密情報が盗聴されるといった脅威を防ぐことできます。 そしてPKIとビジネスで利用される様々なアプリケーションを組みあわせることにより、そのアプリケーションに対してセキュリティインフラを提供することができます。
www.einspki.jp

暗号化技術はいろいろあります。

ponsuke-tarou.hatenablog.com

電子署名で、送信者が送ったデータの完全性を保証します。

ponsuke-tarou.hatenablog.com

送信者の公開鍵で電子署名を復号しますが、公開鍵が本当に送信者のものかわかりません。

https://www.ipa.go.jp/security/pki/images/image020.png
IPA PKI 概要 3.1.1 公開鍵配布時の認証

公開鍵の持ち主を確認するには2つの方法があります。

PGPモデルは、公開鍵の持ち主と公開鍵の受領者の両方に信頼された第3者が証明書を公開鍵にくっつけて受領者へ渡す方法です。

個人レベルの信頼関係が必要となり、全体が管理されないため用途は少ないです。

認証局モデルは、第3者機関に公開鍵の持ち主を保証してもらい第3者機関の発行した証明書で公開鍵の正当性を確認します。

この第3者機関を「Trusted Third Party(TTP)」「認証局:Certification Authority(CA)」といいます。

https://www.ipa.go.jp/security/pki/images/image021.png
https://www.ipa.go.jp/security/pki/images/image022.png
IPA PKI 概要 (2) 認証局モデル

https://jp.globalsign.com/images/knowledge/ill_ca01.gif
認証局 (CA:Certification Authority)とは?|GMOグローバルサイン【公式】

ponsuke-tarou.hatenablog.com

認証局モデルでは信用関係の保証が重要です。

  1. 受領したデータが改ざんされていないことを確認するには電子署名を確認します。
  2. 電子署名を複合するには送信者の公開鍵が必要です。
  3. 公開鍵を使うには公開鍵が本物か証明書を確認します。
  4. その証明書が信用できるか確認するには認証局が信頼できるかを確認する必要があります。

https://www.ipa.go.jp/security/pki/images/image050.png
https://www.ipa.go.jp/security/pki/images/image051.png
PIA 5 信用モデル

認証局の信用関係を作る方法には種類があります。

種類 説明
単独 CA モデル 1つの CA が全てのユーザに証明書を発行する方式です。
階層型モデル 複数の CA を階層型(ツリー構造)に構成する方式です。
Web モデル あらかじめクライアントのアプリケーションにルート CA の一覧を埋め込む方式です。Web ブラウザで用いられています。
メッシュモデル 複数の CA を相互認証により接続する方式です。
ブリッジ CA モデル 複数の CA がブリッジ CA を介して接続する方式です。

https://www.ipa.go.jp/security/pki/images/image049.png
PIA 5 信用モデル

f:id:ponsuke_tarou:20180904211807j:plain

次回の勉強内容

ponsuke-tarou.hatenablog.com

さるがSQL*Plusって何?って思ったのでインストールしてみた。

SQL*Plusは、OracleのDB用のCUIクライアントツールです。

SQL*Plusは、Oracle Databaseのインストール時にインストールされる対話型のバッチ問合せツールです。SQL*Plusでは、コマンドライン・ユーザー・インタフェースを使用できます。

また、SQL*Plus Instant Clientもあります。これは、OCI Instant Client対応のプラットフォームで使用できるスタンドアロンコマンドライン・インタフェースです。SQL*Plus Instant Clientは使用可能なすべてのOracle Databaseに接続されますが、専用のOracle Databaseをインストールする必要はありません。
SQL*Plusのクイック・スタート

SQL*Plus とは SQL を実行するためのインターフェイスユーティリティである。
インスタンスの起動とマニュアル操作によるインタラクティブSQL の実行が主であるが shell などのスクリプト言語と サイレントモード を併用することで簡単なバッチ処理にも使用できる(※)。
www.shift-the-oracle.com

sqlplusはoracleに対して処理を指示するための最も基本的なCUISQLクライアントツールです。 実質oracle databaseがインストールされている環境にはほぼすべてsqlplusもインストールされているため以下のような様々な用途で使用されています。
WalkingAlone sqlplusとは

e-words.jp

何となく分かるようなわからないのでインストールします。

d.hatena.ne.jp
【Oracle】sqlplus のインストールおよび設定手順 | 100%レンタルサーバーを使いこなすサイト
selifelog.com
everything-you-do-is-practice.blogspot.com

インストールしてみた。

  • インストールする環境:Windows10 Pro 64bit
1. Oracle Technology Network(OTN)からパッケージをダウンロードします。
  • 接続先がOracle Database 18c (Version 18.3.0.0.0)の場合
  • 接続先がOracle Database 12c (12.2.0.1.0)の場合
    • instantclient-basiclite-windows.x64-12.2.0.1.0.zip
    • instantclient-sqlplus-windows.x64-12.2.0.1.0.zip
2. ダウンロードしたものをすべて解凍して1つのフォルダにまとめます。
    • 解凍したファイルの中身の一部
      • sqlplus.exe : SQL*Plus実行可能ファイル
      • orasqlplusicXX.dll : SQL*Plusデータ共有ライブラリ
      • oci.dll : クライアント・コード・ライブラリ
      • oraociicusXX.dll : OCI Instant Clientデータ共有ライブラリ(英語のみ)
      • orannzsbbXX.dll : セキュリティ・ライブラリ
3. 解凍したフォルダを `C:\app\oracle\instantclient_xx_x` に配置します。
接続先がOracle Database 18c (Version 18.3.0.0.0)の場合
$ find /c/app/oracle/ -type d
/c/app/oracle/
/c/app/oracle/instantclient_18_3
/c/app/oracle/instantclient_18_3/help
/c/app/oracle/instantclient_18_3/help/ja
/c/app/oracle/instantclient_18_3/help/ja/img
/c/app/oracle/instantclient_18_3/help/ja/img_text
/c/app/oracle/instantclient_18_3/help/us
/c/app/oracle/instantclient_18_3/help/us/img
/c/app/oracle/instantclient_18_3/help/us/img_text
/c/app/oracle/instantclient_18_3/sdk
/c/app/oracle/instantclient_18_3/sdk/admin
/c/app/oracle/instantclient_18_3/sdk/demo
/c/app/oracle/instantclient_18_3/sdk/include
/c/app/oracle/instantclient_18_3/sdk/lib
/c/app/oracle/instantclient_18_3/sdk/lib/bc
/c/app/oracle/instantclient_18_3/sdk/lib/msvc
/c/app/oracle/instantclient_18_3/sdk/lib/msvc/vc14
/c/app/oracle/instantclient_18_3/vc14

接続先がOracle Database 12c (12.2.0.1.0)の場合
$ find /c/app/oracle/instantclient_12_2/ -type d
/c/app/oracle/instantclient_12_2/
/c/app/oracle/instantclient_12_2/vc14
4. Instant Clientファイルを含むディレクトリをシステム環境変数PATHに追加します。
接続先がOracle Database 18c (Version 18.3.0.0.0)の場合
$ printenv | grep -i oracle
SQL_PLUS=C:\app\oracle\instantclient_18_3 # 何のパスかすぐわからなくなるので環境変数を1つ作ってそれをPATHに設定しました。
PATH=/c/Users/m-uki/bin:/mingw64/bin:/usr/local/bin:/usr/bin:/bin:/mingw64/bin:/usr/bin:/c/Users/m-uki/bin:/c/app/oracle/instantclient_18_3:/c/ProgramData/Oracle/Java/javapath:/c/app/Java/jdk1.8.0_121/bin:/c/Program Files (x86)/Intel/iCLS Client:/c/Program Files/Intel/iCLS Client:/c/WINDOWS/system32:<省略>
ORIGINAL_PATH=/mingw64/bin:/usr/bin:/c/Users/m-uki/bin:/c/app/oracle/instantclient_18_3:/c/ProgramData/Oracle/Java/javapath:/c/app/Java/jdk1.8.0_121/bin:<省略>

f:id:ponsuke_tarou:20180905001008p:plain

5. ユーザ環境変数にTNS_ADMINとNLS_LANGを設定します。

SQL*Plusの環境変数

TNS_ADMIN=C:\app\oracle\instantclient_18_3
NLS_LANG=Japanese_Japan.AL32UTF8
6. ORACLE ODBCドライバをインストールします。(接続先がOracle Database 18c (Version 18.3.0.0.0)の場合)

管理者権限でプロンプトやGitBashなどを起動します。

$ cd $SQL_PLUS # 作った環境変数です。
$ odbc_install JA
Oracle ODBC Driver is installed successfully.

qiita.com

7. SQL*Plusを起動してみます。
$ sqlplus

SQL*Plus: Release 18.0.0.0.0 - Production on 水 95 00:50:15 2018
Version 18.3.0.0.0

Copyright (c) 1982, 2018, Oracle.  All rights reserved.

ユーザー名を入力してください:

文字化けする場合は以下のサイトが参考になります。

SQLPlusが文字化けするときの対処法 | CreativeStyle

IPヘッダにあるプロトコル番号でプロトコルを識別できます。

前回の勉強内容

ponsuke-tarou.hatenablog.com

今回の勉強内容:プロトコルはどうやって識別できるのだろうか。

勉強のきっかけになった問題

IPv4において,IPパケットで送られているデータが,ICMPメッセージであることを識別できるヘッダ情報はどれか。

ア. IPヘッダのプロトコル番号 >>> 正解
イ. MACヘッダのイーサタイプ値
ウ. TCPヘッダのコントロールフラグ
エ. UDPヘッダの宛先ポート番号
平成30年春期問18 ICMPを識別できるヘッダ情報|情報処理安全確保支援士.com

IPv4は、32 ビット (4 バイト) を4つに「.」で区切って表すIPです。

www.weblio.jp

IPv6は、IPv4よりたくさん割り当てられるように128 ビット (16 バイト)で表すIPです。

IPv6アドレスは『128bit』で構成されます。これは2^128通りのアドレス数を保有することになります。
IPv4とIPv6の違いについて | Netassist Blog

ICMPは、IPにおいて制御や調査に用いられるプロトコルです。

正式名称:Internet Control Message Protocol

IPプロトコルの「エラー通知」や「制御メッセージ」を転送するためのプロトコルです。TCP/IPが実装されたコンピュータ間で、通信状態を確認するために使用されます。 ICMPはインターネット層(OSI参照モデルネットワーク層)で動作するプロトコルです。
TCP/IP - ICMPとは

ICMPはIPヘッダ内のプロトコル番号1となり、TCP(プロトコル番号6)やUDP(プロトコル番号17)とは違い、ポート番号の概念はありません。その代わり、タイプ番号とコード番号があります。
milestone-of-se.nesuke.com

f:id:ponsuke_tarou:20180904164518g:plain
※. ベースの図は、以下のサイト様より拝借いたしました。
www.infraexpert.com

プロトコル番号は、IPにおいてプロトコル毎に割り振られた番号です。

e-words.jp

プロトコル番号は、上位層のプロトコルを識別するための番号であり、IPヘッダに 8 ビット情報であります。例えばプロトコル番号が 6 の場合はTCP、17 の場合はUDPとなります。プロトコル番号の枠は0~255です。
f:id:ponsuke_tarou:20180904174136p:plain
IPプロトコル番号一覧

プロトコル番号がわかるとプロトコルに何を使っているかがわかります。

IANAのプロトコル番号の一部はこんな感じです。

Decimal Keyword Protocol
1 ICMP Internet Control Message
4 IPv4 IPv4 encapsulation
6 TCP Transmission Control
17 UDP User Datagram
41 IPv6 IPv6 encapsulation
ICMPのプロトコル番号は「1」です。

プロトコル番号は、Internet Protocol(IP)の宛先情報を含めているIPヘッダーに入っています。

https://www.infraexpert.com/studygif/tcpip4.gif
TCP/IP - IPとは

ICMPフレームの部分は、データ本体であるIPペイロードに入っています。

https://www.sc-siken.com/kakomon/30_haru/img/18.gif
平成30年春期問18 ICMPを識別できるヘッダ情報|情報処理安全確保支援士.com

ICMPフレーム部分でタイプ番号とそのコード番号がわかります。

ICMPのタイプ一覧

Type 意味
0 エコー応答
3 宛先到達不能
4 始点抑制
5 最適経路への変更指示
8 エコー要求
9 ルータ通知
10 ルータ要求
11 TTL超過によるパケット破棄の報告
12 パケットパラメータにおけるエラー
13 タイムスタンプ
14 タイムスタンプ応答
15 インフォメーション要求
16 インフォメーション応答
17 アドレスマスク要求
18 アドレスマスク応答

ICMPの一つである「ping」は、タイプ番号0と8を使っています。

f:id:ponsuke_tarou:20180904163142p:plain
TCP/IP通信プログラミング Ver.2 ICMPとPINGコマンド

f:id:ponsuke_tarou:20180904163845p:plain
www.atmarkit.co.jp

f:id:ponsuke_tarou:20180904211559j:plain

次回の勉強内容

ponsuke-tarou.hatenablog.com

Spring MVC で簡単そうなエコーアプリを作って基本を学ぶ

前回は、プロジェクトに Spring MVC を設定したので簡単なアプリを作ってみます。

ponsuke-tarou.hatenablog.com

環境

ここで作るエコーアプリはこの本のSpring MVCの章にあるものです。

トップ画面から遷移した入力画面で値を入力して出力画面に表示します。
www.shoeisha.co.jp

トップ画面を作ります。

Controllerを作ります。

f:id:ponsuke_tarou:20180618154305p:plain

package example.app;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

/** トップ画面用のController. */
@Controller
public class WelcomeController {
    /**
     * トップ画面の表示リクエストをハンドリングするためのメソッド.
     * RequestMappingアノテーションに"/"を指定することで、"/"というパスに対するリクエストがこのメソッドにマッピングされる.
     * @return トップ画面のView名.
     */
    @RequestMapping("/")
    public String home() {
        // トップ画面に表示するView名として"index"を返却すると「/src/main/webapp/index.jsp」が呼び出される。
        return "index";
    }
}

Viewを作成します。

以前、ViewResolverを設定しました。これにより、/WEB-INFディレクトリ配下に格納されているJSPファイルがViewとして扱われます。

index.jspを「/src/main/webapp/index.jsp」へ移動します。

以前、作ったindex.jspを表示できるようにControllerの@RequestMappingに合わせた場所へ移動します。
ponsuke-tarou.hatenablog.com
f:id:ponsuke_tarou:20180618160651p:plain

Tomcatを起動してindex.jspを表示してみます。

ponsuke-tarou.hatenablog.com
f:id:ponsuke_tarou:20180618161841p:plain

index.jspにエコーアプリケーションの入力画面を表示するリクエストを送信するリンクを追加します。

「c: 」は、以前プロジェクトにSpringを設定する中でJSPで使えるように設定しました。

<html>
<body>
    <h2>Hello World!</h2>
    <ul>
        <!--
         JSTL(JSP Standerd Tag Library)の「c:url」を使用して
         {アプリケーションのコンテキストパス} + "/echo"へのリンクを追加しています.
         -->
        <li><a href="<c:url value='/echo' />">エコーアプリケーションへ</a></li>
    </ul>
</body>
</html>
リンクが追加されたことを画面を表示して確認します。

f:id:ponsuke_tarou:20180618163551p:plain

入力画面を作成します。

HTMLのform要素内の入力値を保持するためのフォームクラスを作成します。

package example.app;

import java.io.Serializable;

/**
 * HTMLの<form>要素内で取り扱う入力値を保持するフォームクラス.
 */
public class EchoForm implements Serializable {

    /** serialVersionUID. */
    private static final long serialVersionUID = -3147370534900886671L;

    /** 入力値を保持するプロパティ定義. */
    private String text;

    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }
}

Controllerを作成して表示リスクエストをハンドリングするためのメソッドを実装します。

package example.app;

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.
 * RequestMappingアノテーションで指定する"echo"により"/echo"というパスのリクエストがこのControllerにマッピングされます.
 */
@Controller
@RequestMapping("echo")
public class EchoController {
    /**
     * 表示リスクエストをハンドリングするためのメソッド.
     * RequestMappingアノテーションでRequestMethod.GETを指定することで"GET /echo"というリクエストがこのメソッドにマッピングされます.
     * @param model
     * @return 入力画面を表示するJSPのView名.
     */
    @RequestMapping(method = RequestMethod.GET)
    public String viewInput(Model model) {
        // フォームオブジェクトを生成してModelに追加します。
        EchoForm form = new EchoForm();
        // 属性名を省略しているため、クラス名の"echoForm"という属性名で追加されます。
        // Modelに追加したオブジェクトは、HttpServletRequestにエクスポートされる仕組みとなっているため
        // JSPからは、リクエストスコープのオブジェクトとして参照できます。
        model.addAttribute(form);
        return "echo/input";
    }
}

Controllerのメソッドの返却値"echo/input"に合わせて「/WEB-INF/echo/input.jsp」で入力画面のViewを作成します。

<html>
<body>
    <h2>入力画面</h2>
    <!--
     Spring MVCから提供されている「form:form」要素を使用して、HTMLのフォームを作成すします.
     modelAttribute属性にフォームオブジェクトの属性名を指定します.
     「form:form」要素にはmethod/action属性が指定でき、省略すると
     method属性は"post"、action属性は画面表示時URLのアプリケーションのコンテキストパス以降の値 となります.
     ここのaction属性は、"{App名}/echo"となります.
     -->
    <form:form modelAttribute="echoForm">
        <div>テキストを入力してください :</div>
        <div>
            <!--
             Spring MVCから提供されている「form:input」要素を使用して、テキストフィールドを作成します.
             path属性に指定したechoForm(modelAttribute属性で指定)のプロパティが保持する値が初期値として表示されます.
             -->
            <form:input path="text" />
        </div>
        <div>
            <!-- Spring MVCから提供されている「form:button」要素を使用して、HTMLフォームの送信ボタンを作成します。 -->
            <form:button>送信</form:button>
        </div>
    </form:form>
</body>
</html>
トップ画面のリンクを押下して入力画面を表示してみます。

f:id:ponsuke_tarou:20180618173629p:plain

入力画面の入力値を出力画面に表示する処理を作成します。

入力値送信リクエストをハンドリングするためのメソッドをController(EchoController.java)に追加します。

    /**
     * 入力画面の送信リクエストをハンドリンクするためのメソッド.
     * RequestMappingアノテーションでRequestMethod.POSTを指定することで"POST /echo"というリクエストがこのメソッドにマッピングされます.
     * @param form 引数にフォームクラスを指定することでリクエストパラメータの値(入力値)をフォームオブジェクトに格納して受け取れます.
     *        また、フォームオブジェクトはModelにも自動的に追加される仕組みとなっているため、明示的にModelに追加する必要はありません.
     * @return 出力画面を表示するJSPのView名.
     */
    @RequestMapping(method = RequestMethod.POST)
    public String echo(EchoForm form) {
        return "echo/output";
    }

Controllerのメソッドの返却値"echo/output"に合わせて「/WEB-INF/echo/output.jsp」で出力画面のViewを作成します。

<html>
<body>
    <h2>出力画面</h2>
    <div>入力したテキストは・・・</div>
    <div>
        <!--
         JSTL(JSP Standerd Tag Library)の「c:out」を使用してフォームオブジェクト(echoForm)のプロパティ(text)値をHTMLに出力します.
         「c:out」を使用することで、XSS(クロスサイトスクリプティング)攻撃で使用される特殊な文字を単なる文字としてHTMLに出力できます.
         --><span><c:out value="${echoForm.text}" /></span></div>
    <div>です。</div>
    <br>
    <div>
        <!-- トップ画面を表示するリクエスト(GET /)を送信するリンクです. -->
        <a href="<c:url value='/' />">トップ画面へ戻る</a>
    </div>
</body>
</html>
出力画面を表示してみます。

f:id:ponsuke_tarou:20180618180909p:plainf:id:ponsuke_tarou:20180618180917p:plain

Bean Validationを使用した入力チェックを作成します。

Spring MVCでは、Bean Validationの仕組みを利用してフォームオブジェクトのプロパティに入力チェックルールを指定します。

フォームオブジェクト(EchoForm.java)にBean Validationの制約アノテーションを追加します。

Hibernate Validationは、前回pom.xmlで設定しました。

    /**
     * 入力値を保持するプロパティ定義.
     * Hibernate Validationが提供するNotEmptyアノテーションを付加することで入力必須チェックを行います.
     * Bean Validationが提供するSizeアノテーションを付加することで最大文字数のチェックを行います.
     */
    @NotEmpty
    @Size(max = 10)
    private String text;
Springのプロパティでは未入力時にデフォルトで空文字が設定されるため、必須チェックは @NotNull ではなく @NotEmpty を使用します。

Spring以外のプロパティ値に対しては Bean Validation が提供する @java.validation.constraints.NotNull で必須チェックが行えます。

Controllerの送信リクエストをハンドリンクするためのメソッド(EchoController#echo)でSpring MVCの入力チェック機能を有効化してエラーのハンドリング処理を追加します。

    /**
     * 入力画面の送信リクエストをハンドリンクするためのメソッド.
     * RequestMappingアノテーションでRequestMethod.POSTを指定することで"POST /echo"というリクエストがこのメソッドにマッピングされます.
     * @param form 引数にフォームクラスを指定することでリクエストパラメータの値(入力値)をフォームオブジェクトに格納して受け取れます.
     *        また、フォームオブジェクトはModelにも自動的に追加される仕組みとなっているため、明示的にModelに追加する必要はありません.
     *        <<入力チェック>>
     *        パラメータのフォームオブジェクトに Validアノテーションを付与することで、入力チェックを実施してその結果を BindingResult に格納できます.
     * @param result BindingResultは入力チェックするフォームオブジェクトの直後に指定します.
     *        BindingResult もModelに自動的に追加されるため、明示的にModelに追加する必要はありません.
     * @return 出力画面を表示するJSPのView名.
     */
    @RequestMapping(method = RequestMethod.POST)
    public String echo(@Valid EchoForm form, BindingResult result) {
        // BindingResult#hasErrorsを呼び出すことで入力チェックのエラー判定を行います。
        if (result.hasErrors()) {
            // エラーの場合は、入力画面のView名を返却し、入力画面にエラー情報を表示します。
            return "echo/input";
        }
        return "echo/output";
    }

View(input.jsp)にエラー情報を表示するパーツを追加します。

            <form:input path="text" />
            <!--
             Spring MVCが提供する「form:errors」要素を使用して、入力チェックのエラー情報を表示します.
             path属性に指定されたプロパティのエラー情報が表示されます。
             -->
            <form:errors path="text" />
        </div>
エラーになったときの入力画面を表示してみます。

f:id:ponsuke_tarou:20180618231043p:plainf:id:ponsuke_tarou:20180618231046p:plainf:id:ponsuke_tarou:20180618231050p:plainf:id:ponsuke_tarou:20180618231059p:plain

この本を読みながらやりました

www.shoeisha.co.jp