Chapter 02. Spring MVC
第1回 遠隔プログラムの実行
他のコンピュータにあるプログラムを実行(ローカルプログラム:私のコンピュータ)
ブラウザと遠隔プログラム(WAS)がなければ実行できない。
外部からブラウザでサーバーにあるプログラムを実行するには、以下の2つの作業をしなければならない。
1.プログラム登録(Controller)
2.URLとプログラムを接続させる
アドレスバーにURLを入力すると遠隔プログラムが実行されるように(RequestMapping)
第2回 AWSに配布する
インスタンス:仮想コンピュータ
EC2 : AWSが提供するクラウドサーバー
ログイン>EC2>インスタンス開始>プリティアで提供するインスタンス選択
第3回 HTTPリクエストと回答-実習
http://52.78.79.190:8080/ch2/requestinfo?year=2021&month=10&day=1
http:// -> getScheme
52.78.79.190 -> getServerName
8080 -> getServerport
ch2 -> getContextpath
requestinfo -> getservletPath
ch2/requestinfo -> getRequestURI
http://52.78.79.190:8080/ch2/requestinfo -> getRequestURL
?year=2021&month=10&day=1 -> getQueryString
year=2021
yearは名前
2021はVALUE
year=2021&month=10&day=1ともURL(文字列、String)である
第4回 HTTP要請と応答-例題
webappフォルダの中にあるresourcesフォルダの中に写真ファイルを入れなければならない。
serverが提供するresourceには2種類がある。
- 動的resource:TwoDiceclassは実行するたびに結果が異なる(プログラムが生成する結果、ストリーミングなど)。
- 静的resource:サイコロイメージファイルは変わらない(画像ファイル、jsファイル、cssファイル、htmlファイルなど)
第5回 クライアントとサーバ
クライアント:サービスを要請するアプリケーション(orコンピュータ)
サーバ:サービスを提供するアプリケーション(orコンピュータ)
どのようなサービスを提供するかによってサーバの種類が異なる。
requests.getParameterNames()
- クエリストリングの名前を返します。
ex)?year=2022&month=05&day=02から(year,month,day)を抽出できる。
requests.getParameterMap()
- クエリストリングをMap形式で返却
- (year=2022&month=05&day=02)をMap形態のようにkey&value形態で抽出
(EmailServer/FileServer/WebServerなど)
1台のパソコンに数種類のサーバーが設置されている場合、IPアドレスだけではどのサーバーに要請するのか分からないため、ポート番号も必要だ。
- Webserverは基本ポート番号が80であるため省略可能
- ポート番号とserverはバインディング(binding)されていれば、一つのポートには一つのserverだけがバインディング(binding)される。
- これをListeningという。(serverがポートで要請を待っている状態)
cf)0~1023番まではすべて予約されたポート番号なので使用してはならない。 - WAS:WebApplicationServer(ウェブアプリケーションをサービスするサーバ)cf)アプリケーション=プログラム
Connectorはサーバーに要請するプロトコルの種類だと考えればよい。
- サーバー(Tomcat)の中にサービスがあり、サービスの中にEngine(Catalina)がある構造
- Engine(Catalina)の中にそれぞれのContext(プロジェクト)がある。
- (それぞれのプロジェクトは独立的)
第6回 設定ファイル-server.xml、web.xml
server.xml
トムキャット設置経路/conf/server.xml:Tomcatサーバー設定ファイル
web.xml
- web.xmlには2つのファイルがある。
- トムキャット設置経路/conf/web.xml:Tomcatのすべてのwebappの共通設定(先適用)
- ウェブアプリ名/WEB-INF/web.xml:各webappの個別設定(各プロジェクトごとに1つずつある)(後適用)
第7回 HTTP要請と応答-理論
- HTTP(HyperTextTransferProtocol):テキストを転送するためのプロトコル
(テキストベースのプロトコル) - HTTP特徴
HTTPは状態を維持しない。(stateless)=クライアント情報を保存しません。
同じクライアントがずっと要請をしてもserverは要請をした人が同じクライアントなのか分からない。 - statelessを補完するための概念がcookieとsession
第8回 テキストとバイナリー、MIME、Base64
-
バイナリデータ(画像、ビデオ、オーディオなど)をテキストベースのHTTPプロトコルを利用して伝送するには2つの方法がある。
1.MIMEを利用してバイナリデータをそのまま転送
2.Base64を利用してバイナリデータをテキストデータに変換して転送 -
テキストとバイナリ
イメージ、動画、ダウンロードファイルなどが全てバイナリファイル
バイナリー·ファイル
- 文字と数字が保存されているファイル
- データを変換なしにありのまま読み書きする
- 人が読みにくい
テキストファイル
- 文字だけが保存されているファイル、すなわち数字も文字に変換して保存する
- 人が読みやすい
メモ帳でファイルを開いたときに読むことができればテキストファイル、なければバイナリファイルと見れば良い->簡単、大事なこと
第9回 関心事の分離とMVCパターン-理論
曜日計算コーディングの中で
入力は共通コード部分、曜日計算(実処理)、出力からなっている。
先生は入力、処理、出力はそれぞれ関心事(処理すべきこと)と言った。 Concern
つまり、見られたコードでは3つの関心事があるのだ。
5大原則?の中でSRPを述べた。 単一責任原則という。
すなわち、一つのメソッドまたは一つのクラスは一つの関心事だけ責任を負う。
そのため、上記のコードは1つが3つの責任を負うため、分離しなければならないと述べた。
問題はないが、設計の面では良くない」と話した。
PVCパターン単純構造説明 -> インターネット検索
1.ユーザーリクエスト(ユーザー入力値)が入ってくると、DispatcherServletが入力を処理した後、リクエストに合った
該当Controllerに渡す。(DispatcherServletが入力と変換を自動処理)
2.この時、DispatcherServletがModelオブジェクトも生成した後、Controllerに渡す
3.Controllerは処理した結果をModelに収め、再びDispatcherServletに渡す
4.DispatcherServletは、作業結果が盛り込まれたModelをViewに伝達する
5.Viewは作業結果を読み取り、応答を作り出してクライアントに転送する
第10回 関心事の分離とMVCパターン-実習
出力(view)分離-変わるもの(uncommon code)と頻繁に変わらないもの(common code)の分離
先生が見せてくれたコード(曜日変換)で
- requests.getParameter()を使う代わりにmainmethodのparamenter部分でそれぞれの値を個別に
直接受け取るように変更した
public void main(int year, int month, int day, HttpServletResponse response) throws Exception {
year,month,day部分には数字を入れてこそエラーが出ない。
第11回 関心事の分離とMVCパターン-原理(1)
STSによるjavac-parameters設定
-javac-parametersを設定しないとパラメータの名前が正しく表示されない。
方法
(STS) Windows -> Preferencs - Compiler - Store Information about method parameters (Check)
Springが媒介変数の名前を得る方法(STS)
-
ReflectionAPI => javac-parameters設定
-
ClassFile
- ClassFileの見方(STS)(srcフォルダ=>.java,targetフォルダ=>.class)
Windows -> show view -> other -> Navigator
第12回 関心事の分離とMVCパターン-原理(2)
MethodCall3.javaから
スプリングがMethodに合わせて値を変換して入力する方式を確認可能(modelをviewに伝達)
MyDispatcherServlet.javaで
@WebServlet = @Controller + @RequestMapping
@WebServlet:Class単位Mapping(Method単位X)、HttpServletを相続しなければならない。
@RequestMapping:Method単位Mapping
第13回 サブレットとJSP(1)
SpringはServletを向上させたものであるため、Servletに基づいて作動
- @WebServlet("URL") = @Controller + @RequestMapping (Spring)
"URL"はServletとMappingするURL
- @WebServletはHttpServletを相続するが、@Controllerは相続しない。
Javaは単一相続なのでできれば相続がない方が良い。
- @WebServletはServicemethodにパラメータで、HttpServletRequestとHttpServletResponseが固定されるが、
- @Controllerは必要な媒介変数のみ作成して使用できる。
ServletはURLをClass単位でMappingするためURL数だけClassを作らなければなりませんが、
ControllerはURLをMethod単位でMappingするため、Class1つですべてのURLを処理可能。
ServletはSingleTon方式
1) 1つのインスタンスを作ってリサイクル(Springも同じ、Bean)
2) ユーザーごとに各自のインスタンスを作る必要がない
JSP(JavaServerPage)=HTMLの中にJavaコードがあるもの
JSPとServletの比較
- JSPファイルをServletに変換して実行
- JSP(JavaServerPage)=HTMLの中にJavaコードがあるもの
- JSPファイルをServletに変換して実行
- JSPページを最初に実行する時、Servletに変換しなければならないため、最初は時間がかかる。
ServletはSingleTon方式
- 1つのインスタンスを作ってリサイクル(Springも同じ、Bean)
- ユーザーごとに各自のインスタンスを作る必要がない