Download - Web programming introduction
サーバーサイドWebプログラミング入門
システム工房コルン今村安伸
みなさんサイト作ってますか?
●HTML●CSS
表示するだけ。
●Java Script●Java Applet●Flash●Silverlight
ブラウザ上で色々動く!
●CGI●PHP●Java Servlet●ASP.NET
これって必要?
ブラウザ上のプログラムでなぜ代用できない?
●利用者と運営●利用者と利用者
この実現に、サーバーは必須。
双方向性
汎用のDBサーバーでなぜ代用できない?
ブラウザ上のプログラムは(容易に)改ざん可能
●データ整合性の保証がない●権限を管理できない●機密データを保護できない
セキュリティの問題点
サーバーサイドは(容易には)
改ざんできない!
●データ整合性の保証●権限の管理●機密データの保護
これ以外はブラウザ上でやってよい
逆説的には……
●M … モデル○実際の処理
●V … ビュー○ユーザへの表示
●C … コントローラ○MとVを繋ぐ
MVCモデル(1)
●実際の処理○サーバーサイド
●ユーザへの表示○ブラウザサイド
サーバーサイドはMが主役
MVCモデル(2)
●ルーティング●テンプレートビュー●アクセス制御リスト●データベース連携
お品書き
ルーティング
●リクエスト○http://example.com/hoge.txt
●レスポンス○c:¥example¥hoge.txt
Httpdの仕事(1)
●リクエスト○http://example.com/fuga.jpg
●レスポンス○c:¥example¥fuga.jpg
Httpdの仕事(2)
●リクエスト○http://example.com/
●レスポンス○c:¥example¥index.html
Httpdの仕事(3)
●ビュー○対応するファイル自体
●コントローラ○リクエストを受ける○対応するファイルを返す
ここで行われていること
●リクエスト○http://example.com/foo.cgi
●レスポンス○c:¥example¥foo.cgi○…を実行○その結果を返す
Httpdの仕事(4)
●リクエスト○http://example.com/bar.php
●レスポンス○c:¥example¥bar.php○…をPHPで実行○その結果を返す
Httpdの仕事(5)
●ビュー○ファイルの実行結果
●コントローラ○対応するファイルを実行○実行結果を返す
ここで行われていること
リクエストを元に誰を呼ぶか決めるのが
ルーティング
●リクエスト≒ファイルアドレス
●IDなどをリクエストに含める○http://example.com/?id=123
●以下はできない○http://example.com/123
Httpd標準機能の制約
標準機能がダメなら拡張プログラムで対応→フレームワーク化
●ルーティングルール○どんなリクエストを○どのコントローラに
ルールは設定ファイル等で管理
拡張ルーター(1)
●http://example.com/123○"123"の部分は○パラメータとして認識
設定次第で可能(拡張ルーターが対応してれば)
拡張ルーター(2)
テンプレートビュー
printf("<!doctype html>¥n");printf("<html>¥n");printf("<head>¥n");printf("<title>%s</title>¥n", title);printf("</head>¥n");printf("<body>¥n");:::::
こんなこと、やりたくない
printf("%s", html().add( head().add( title(nowTitle) ) ).add( body().add( ... ) ).toString());
これもヤダ!
プログラムでHTMLを生成すると
色々と大変
そこでPHP(1)
<!doctype html><html> <head> <title><?php echo $title; ?></title> </head> <body> : : </body></html>
これならまだマシ。
そこでPHP(2)
<ul><?php foreach($list as $item) { ?> <li><?php echo $item; ?></li><? } ?></ul>
……少し、見辛いかな。
そこでPHP(3)
<ul><?php$result = mysql_query('SELECT id, name FROM xxx');while($item = mysql_fetch_assoc($result)) { ?> <li><?php echo $item['name']; ?></li><? } ?></ul>
htmlも見辛い!処理も見辛い!
ビューとロジックは分けよう!
●ロジック○必要なデータを用意
●テンプレートビュー○用意されたデータをテンプレートに当てはめ表示するだけ!
役割分担
ファイルの役割分担=担当者の役割分担
デザイナーさんが助かる!
テンプレートエンジン(Smarty)
<ul> {foreach from=$list item=item} <li>{$item}</li> {/foreach}</ul>
これなら見やすい。
色々なエンジンがある。
●ルーティング●テンプレートビュー●アクセス制御リスト●データベース連携
分量的に無理でした。 おしまい
お品書き