Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!
-
Upload
java -
Category
Engineering
-
view
3.032 -
download
5
Transcript of Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!
Spring Bootでチャットツールを作りながら
Webの仕組みを理解しよう!
Java女子部presents
2016.5.21
#jjug_ccc #ccc_m3
本日のメンバー
#jjug_ccc #ccc_m3
■ちかJava歴7年くらい。金融系のSIer
■ゆう最近Javaを始めたばかりの
初心者。
エンジニア歴は2年ちょい。
講師講師#jjug_ccc #ccc_m3
■えりこWebアプリケーションSEエンジニア8年生。
■あやラーメン二郎が好きなエンジニア2年生。
チューター#jjug_ccc #ccc_m3
■とぅんJava暦半年ぐらいのエンジニア4年生。品質管理とかやってます。
■よこなJJUG司会兼チューター。エンジニア4年生。
チューター#jjug_ccc #ccc_m3
ワークショップの概要説明
#jjug_ccc #ccc_m3
チャットツールの制作を通じてWebの仕組みを理解する!
今回の目標本日の目標#jjug_ccc #ccc_m3
・基礎的な概念説明(Webの仕組み、Spring Bootについて)
・ハンズオン導入・WebSocketについて
・ハンズオン
・まとめ
全体の流れ#jjug_ccc #ccc_m3
Webの仕組みについて
#jjug_ccc #ccc_m3
情報をやりとりする通信網のこと。
この通信網によって
世界中とやりとり
することができる。
そもそもインターネットとは?#jjug_ccc #ccc_m3
クライアントが情報を要求すると、
サーバから情報が返ってくる。
クライアント サーバリクエスト
レスポンス
通信方法について#jjug_ccc #ccc_m3
Spring Bootについて
#jjug_ccc #ccc_m3
Java SpringJava JavaEERuby RailsPython Django
言語を扱いやすくパッケージングしたもの = フレームワーク
Springって何?#jjug_ccc #ccc_m3
Spring BootJava SpringJava JavaEERuby RailsPython Django
フレームワーク(コンポーネントの集合)をさらに使いやすくしたフレームワーク
じゃあ、Spring Bootって何?#jjug_ccc #ccc_m3
・アノテーション
・DIコンテナ
・AOP
アノテーションでクラス・メソッド・変数に目印をつけてフレームワークに解釈させる⇒ 設定ファイルの代わりになる
class Chat
@RestController
Spring Bootの特徴#jjug_ccc #ccc_m3
class Chat
アノテーション名 記載場所 説明
@SpringBootApplication
Mainクラス パッケージ内のクラスと設定を自動的に読み込む
@RestController クラス WebAPI用のコントローラー
@Configuration クラス 設定クラスソースコードでSpringの設定を実装できる
@RequestMapping クラスメソッド
URLに紐づけて、アクセスできるように設定する
@Autowired メソッドフィールド
実装クラスを自動的にインジェクションする(DIする)
基本のアノテーション(Spring)#jjug_ccc #ccc_m3
ハンズオン 1章-文字列を返すWebアプリケーションを
作ってみよう!-
リポジトリhttps://github.com/java-women/ChatToolForBeginners/
プロジェクト chat-exercise ハンズオン作業用
chat-tutorial 完成形
環境構築手順 https://git.io/vro1X
事前準備 1章
ブラウザ
アマゾンのリクエストページ
これから作るもの 1章
①リクエストを送信
③レスポンスを受信
②リクエストを受け取りごにょごにょ処理する
商品の詳細ページ
ブラウザ
http://localhost:8080/javajo
Hello World!
これから作るもの 1章
①リクエストを送信
③レスポンスを受信
②リクエストを受け取りごにょごにょ処理する
ここを作るよ
@SpringBootApplicationpublic class App {
public static void main(String[] args) {SpringApplication.run(App.class,
args);}
}
javajo > App.java 1章
Spring Bootの起動クラスを確認する
HelloControllerクラスにもアノテーションを 付与します。
@RestControllerpublic class HelloController { }
1章javajo.controller > HelloController.java 1章
・helloメソッドを作成します。
・helloメソッドにアノテーションを付与します。
String hello() { return "Hello World!"; }
@RequestMapping(value = "/javajo") String hello() { return "Hello World!"; }
javajo.controller > HelloController.java 1章
アプリケーションを起動して、
http://localhost:8080/javajo/にアクセスしてみよう!
1章javajo.controller > HelloController.java 1章
EclipseIntelliJApp.javaを
右クリック>runmaven>bootrun
起動方法
下記画面が表示されれば、成功!
1章Hello World動作確認 1章
ブラウザ
サーバ
@RestControllerpublic class HelloController
{
@RequestMapping(value = "/javajo") String hello() { return "Hello World!"; }}
http://localhost:8080/javajo
Hello World!
解説 1章
WebSocketについて
#jjug_ccc #ccc_m3
WebSocket聞いたことある人?
サーバ・クライアント間で接続が確立されたら、双方向通信(サーバからもクライアントからもデータの送信)が行える技術仕様
WebSocketとは?#jjug_ccc #ccc_m3
WebSocket(双方向通信)
Client A#jjug_ccc #ccc_m3
WebSocket(双方向通信)
Client A#jjug_ccc #ccc_m3
こんにちは
WebSocket(双方向通信)
Client A#jjug_ccc #ccc_m3
こんにちは
ClientB
WebSocket(双方向通信)
Client A#jjug_ccc #ccc_m3
こんにちは
ClientB こんばんはこんばんは
こんばんは
WebSocket(双方向通信)
Client A#jjug_ccc #ccc_m3
こんにちは
ClientB こんばんはこんばんは
こんばんは
※1度接続が確立されればデータがリアルタイムで送受信可能!※同じサーバに接続しているユーザはデータを共有する
ハンズオン2章-チャットを作ってみよう!-
#jjug_ccc #ccc_m3
チャットツールの作成内容 2章
①WebSocketへの接続要求
⑥WebSocketコネクション切断
④メッセージ送信
⑤メッセージ受信
②WebSocketコネクション確立
③メッセージ受信時の挙動設定
チャットツールの作成内容 2章
Controller@MessageMapping("/message")@SendTo(value= "/topic/messages")
MessageBroker
/message
/app/message
ChatForm
@EnableWebSocketMessageBroker
/topic/messages
<dependencies>・・・・・省略・・・・・
<dependency><groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>・・・・・省略・・・・・
</dependencies>
2章pom.xml の内容を確認する 2章
<dependencies>・・・・・省略・・・・・
<dependency><groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>・・・・・省略・・・・・
</dependencies>
pom.xml の内容を確認する
pom.xml35行目あたり
WebSocketを利用するのに必要!!
2章
javajo.form > ChatForm.java 2章
public class ChatForm {
・・・・・省略・・・・・
}
public class ChatForm {
private String name;private String message;
・・・・・省略・・・・・
}
javajo.form > ChatForm.java 2章
クライアントから受け取った値を格納する
フィールドを作成
public class ChatForm {・・・・・省略・・・・・
/**public String getName() {
return name;}
・・・・・省略・・・・・
public void setMessage(String message) {this.message = message;
}**/
}
javajo.form > ChatForm.java 2章
フィールドにアクセスするgetter/setterを作成します
public class ChatForm {・・・・・省略・・・・・
/**public String getName() {
return name;}
・・・・・省略・・・・・
public void setMessage(String message) {this.message = message;
}**/
}
javajo.form > ChatForm.java 2章
すでに実装済みなので、コメントアウトを外す
だけでOK
public class ChatForm {・・・・・省略・・・・・
public String getName() {return name;
}・・・・・省略・・・・・
public void setMessage(String message) {this.message = message;
}
}
javajo.form > ChatForm.java 2章
すでに実装済みなので、コメントアウトを外す
だけでOK
チャットツールの作成内容 2章
①WebSocketへの接続要求
⑥WebSocketコネクション切断
④メッセージ送信
⑤メッセージ受信
②WebSocketコネクション確立
③メッセージ受信時の挙動設定
public class StompConfig {
}
javajo.config > StompConfig.java 2章
クライアントからのメッセージを処理するクラスを作成します
public class StompConfig extends AbstractWebSocketMessageBrokerConfigurer {
}
javajo.config > StompConfig.java 2章
メッセージを処理する抽象クラスを継承
@Configuration
public class StompConfig extends AbstractWebSocketMessageBrokerConfigurer {
}
javajo.config > StompConfig.java 2章
設定ファイルを表すアノテーションを付与
@Configuration@EnableWebSocketMessageBrokepublic class StompConfig extends AbstractWebSocketMessageBrokerConfigurer {
}
javajo.config > StompConfig.java 2章
WebSocketを扱うのに必要なアノテーションを
付与
public class StompConfig extends AbstractWebSocketMessageBrokerConfigurer {
@Override public void registerStompEndpoints(StompEndpointRegistry registry) { registry.addEndpoint("endpoint"); }
}
javajo.config > StompConfig.java 2章
エンドポイントの登録メソッドを作成
チャットツールの作成内容 2章
ChatController@MessageMapping("/message")@SendTo(value= "/topic/messages")
MessageBroker
/message
/app/message@EnableWebSocketMessageBroker
/topic/messagesここを作るよ ChatForm
public class StompConfig extends AbstractWebSocketMessageBrokerConfigurer {
・・・・・省略(registerStompEndpointsの直後)・・・・・ @Overridepublic void configureMessageBroker(MessageBrokerRegistry registry) { registry.setApplicationDestinationPrefixes("/app"); registry.enableSimpleBroker("/topic"); }
}
javajo.config > StompConfig.java 2章
メッセージブローカーの設定メソッドを作成
チャットツールの作成内容 2章
①WebSocketへの接続要求
⑥WebSocketコネクション切断
④メッセージ送信
⑤メッセージ受信
②WebSocketコネクション確立
③メッセージ受信時の挙動設定ここを作るよ
チャットツールの作成内容 2章
ChatController@MessageMapping("/message")@SendTo(value= "/topic/messages")
MessageBroker
/message
/app/message
ChatForm
@EnableWebSocketMessageBroker
/topic/messages
ここを作るよ
public class ChatController {
ChatForm greet(ChatForm chatForm) { return chatForm; }}
javajo.controller > ChatController.java 2章
チャットのコントローラークラスを作成します
@RestControllerpublic class ChatController {
ChatForm greet(ChatForm chatForm) { return chatForm; }}
javajo.controller > ChatController.java 2章
コントローラーのアノテーションを付与
@RestControllerpublic class ChatController {
@MessageMapping(value = "/message" )
ChatForm greet(ChatForm chatForm) { return chatForm; }}
javajo.controller > ChatController.java 2章
メッセージを受け付けるMessageMappingを付与
@RestControllerpublic class ChatController {
@MessageMapping(value = "/message" ) @SendTo(value = "/topic/messages") ChatForm greet(ChatForm chatForm) { return chatForm; }}
javajo.controller > ChatController.java 2章
処理結果を送信する宛先
SendToを付与
チャットツールの作成内容 2章
①WebSocketへの接続要求
⑥WebSocketコネクション切断
④メッセージ送信
⑤メッセージ受信
②WebSocketコネクション確立
③メッセージ受信時の挙動設定
ここだよ
チャットツールの作成内容 2章
ここだよ
クライアント側(Stomp.js) 2章
resources/static/js/Stomp.js
提供されているライブラリを使用詳しくは、http://jmesnil.net/stomp-websocket/doc/
クライアント側のメッセージ制御はJavaScriptライブラリを利用する
クライアント側(javajo.js) 2章
ChatStomp.prototype.connect = function () { var socket = new WebSocket('ws://' + location.host + '/endpoint'); ・・・・・省略・・・・・
}; 23行目
public class StompConfig extends AbstractWebSocketMessageBrokerConfigurer {
@Override public void registerStompEndpoints(StompEndpointRegistry registry) { registry.addEndpoint("endpoint"); }
}
javajo.config > StompConfig.java 2章
エンドポイントの登録メソッドを作成
チャットツールの作成内容 2章
①WebSocketへの接続要求
⑥WebSocketコネクション切断
④メッセージ送信
⑤メッセージ受信
②WebSocketコネクション確立
③メッセージ受信時の挙動設定
ここだよ
チャットツールの作成内容 2章
ここだよ
クライアント側(javajo.js) 2章
ChatStomp.prototype.onConnected = function (frame) { console.log('Connected: ' + frame); this.stompClient.subscribe('/topic/messages',this.onSubscribeGreeting.bind(this)); this.setConnected(true);};
34行目
public class StompConfig extends AbstractWebSocketMessageBrokerConfigurer {
・・・・・省略(registerStompEndpointsの直後)・・・・・ @Overridepublic void configureMessageBroker(MessageBrokerRegistry registry) { registry.setApplicationDestinationPrefixes("/app"); registry.enableSimpleBroker("/topic"); }
}
javajo.config > StompConfig.java 2章
メッセージブローカーの設定メソッドを作成
チャットツールの作成内容 2章
①WebSocketへの接続要求
⑥WebSocketコネクション切断
④メッセージ送信
⑤メッセージ受信
②WebSocketコネクション確立
③メッセージ受信時の挙動設定ここだよ
チャットツールの作成内容 2章
ここだよ
クライアント側(javajo.js) 2章
ChatStomp.prototype.sendName = function () { ・・・・・省略・・・・・
this.stompClient.send("/app/message", {}, JSON.stringify(json_message)); };
73行目
public class StompConfig extends AbstractWebSocketMessageBrokerConfigurer {
・・・・・省略(registerStompEndpointsの直後)・・・・・ @Overridepublic void configureMessageBroker(MessageBrokerRegistry registry) { registry.setApplicationDestinationPrefixes("/app"); registry.enableSimpleBroker("/topic"); }
}
javajo.config > StompConfig.java 2章
メッセージブローカーの設定メソッドを作成
@RestControllerpublic class ChatController {
@MessageMapping(value = "/message" )
ChatForm greet(ChatForm chatForm) { return chatForm; }}
javajo.controller > ChatController.java 2章
メッセージを受け付けるMessageMappingを付与
チャットツールの作成内容 2章
ChatController@MessageMapping("/message")@SendTo(value= "/topic/messages")
MessageBroker
/message
/app/message@EnableWebSocketMessageBroker
/topic/messages
ChatForm
チャットツールの作成内容 2章
①WebSocketへの接続要求
⑥WebSocketコネクション切断
④メッセージ送信
⑤メッセージ受信
②WebSocketコネクション確立
③メッセージ受信時の挙動設定
ここだよ
チャットツールの作成内容 2章
ここだよ
クライアント側(javajo.js) 2章
ChatStomp.prototype.disconnect = function () { if (this.stompClient) { this.stompClient.disconnect(); this.stompClient = null; } this.setConnected(false);};
88行〜94行目
ハンズオンはここまで!実際に動かしてみよう!
#jjug_ccc #ccc_m3
1. chat-exerciseのプロジェクトを実行!
2. http://localhost:8080/chat にアクセス!
ローカルで動かしてみようローカルで動かしてみよう
3. ユーザ名を入力してConnectボタンクリック!
4.メッセージを入力してSendボタンをクリック!
#jjug_ccc #ccc_m3
まとめ
#jjug_ccc #ccc_m3
・「Hello World」を出力するアプリケーションをSpring Bootで作りました
・チャットを作りながらWebSocketについて学びました
まとめ#jjug_ccc #ccc_m3
お疲れ様でしたありがとうございました
【講師】ゆう・ちか【チューター】えりこ・あや・とぅん・よこな
#jjug_ccc #ccc_m3