サーバーサイド
Webプログラミング入門

  システム工房コルン
    今村安伸
みなさん
サイト作ってますか?
● HTML
● CSS


表示するだけ。
● Java Script
● Java Applet
● Flash
● Silverlight

ブラウザ上で色々動く!
● CGI
● PHP
● Java Servlet
● ASP.NET

これって必要?
ブラウザ上のプログラムで
 なぜ代用できない?
双方向性


● 利用者と運営
● 利用者と利用者

この実現に、サーバーは必須。
汎用のDBサーバーで
なぜ代用できない?
ブラウザ上のプログラムは
 (容易に)改ざん可能
セキュリティの問題点

● データ整合性の保証がない
● 権限を管理できない
● 機密データを保護できない
サーバーサイドは
 (容易には)
改ざんできない!
逆説的には……

● データ整合性の保証
● 権限の管理
● 機密データの保護

これ以外は
ブラウザ上でやってよい
MVCモデル(1)

● M … モデル
  ○ 実際の処理
● V … ビュー
  ○ ユーザへの表示
● C … コントローラ
  ○ MとVを繋ぐ
MVCモデル(2)

● 実際の処理
  ○ サーバーサイド
● ユーザへの表示
  ○ ブラウザサイド

サーバーサイドはMが主役
お品書き

● ルーティング
● テンプレートビュー
● アクセス制御リスト
● データベース連携
ルーティング
Httpdの仕事(1)

● リクエスト
  ○ http://example.com/hoge.txt
● レスポンス
  ○ c:¥example¥hoge.txt
Httpdの仕事(2)

● リクエスト
  ○ http://example.com/fuga.jpg
● レスポンス
  ○ c:¥example¥fuga.jpg
Httpdの仕事(3)

● リクエスト
  ○ http://example.com/
● レスポンス
  ○ c:¥example¥index.html
ここで行われていること

● ビュー
  ○ 対応するファイル自体
● コントローラ
  ○ リクエストを受ける
  ○ 対応するファイルを返す
Httpdの仕事(4)

● リクエスト
  ○ http://example.com/foo.cgi
● レスポンス
  ○ c:¥example¥foo.cgi
  ○ …を実行
  ○ その結果を返す
Httpdの仕事(5)

● リクエスト
  ○ http://example.com/bar.php
● レスポンス
  ○ c:¥example¥bar.php
  ○ …をPHPで実行
  ○ その結果を返す
ここで行われていること

● ビュー
  ○ ファイルの実行結果
● コントローラ
  ○ 対応するファイルを実行
  ○ 実行結果を返す
リクエストを元に
誰を呼ぶか決めるのが
   ルーティング
Httpd標準機能の制約

● リクエスト≒ファイルアドレス

● IDなどをリクエストに含める
  ○ http://example.com/?id=123
● 以下はできない
  ○ http://example.com/123
標準機能がダメなら
拡張プログラムで対応
 →フレームワーク化
拡張ルーター(1)

● ルーティングルール
  ○ どんなリクエストを
  ○ どのコントローラに

ルールは設定ファイル等で管理
拡張ルーター(2)

● http://example.com/123
  ○ "123"の部分は
  ○ パラメータとして認識

設定次第で可能
(拡張ルーターが対応してれば)
テンプレートビュー
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>

これなら見やすい。

色々なエンジンがある。
お品書き

● ルーティング
● テンプレートビュー
● アクセス制御リスト
● データベース連携

分量的に無理でした。 おしまい

Web programming introduction