roy > naoya > 基礎プログラミングII > (9)CGI[2]

(9) 11/28の授業内容:CGI[2]

[1]入力フォームの構成部品について

入力フォームを作成する場合、まずform要素を使用する。<form></form>の間にラジオボタンや入力フィールドを配置し、<form>内に指定した方法でCGIスクリプトに引き渡す。

form要素については既に説明済みであるが、念のため再掲する。

<form method="メソッド" action="./スクリプト">


</form>

となる。メソッドの部分はGETまたはPOSTのどちらかを指定する。GETは最大で255文字までしか送ることができない。項目数が多い場合や長い文章を入力させる場合はPOSTを指定する。ここではPOSTを使うものとして説明を続ける。

スクリプトの部分は入力データの引渡し先である。このソースを見ると、./kakaku.rbとなっており(./は同一ディレクトリをあらわすので)、cgi-binディレクトリの中にあるkakaku.rbがデータを受け取って処理をしていることがわかる。

<form></form>の間に配置するフォームの構成部品について、まずは外観を示し、その後説明を加える。

1行のテキスト入力フィールド:
チェックボックス(複数選択可):
ラジオボタン(ひとつのみ選択可):

プルダウンメニュー:
送信ボタン:
リセットボタン:

これらの構成部品はinput要素、textarea要素、select要素を用いて作成することができる。textarea要素は複数行のテキスト入力フィールドの作成に用い、select要素はプルダウンメニューの作成に用いる。それ以外の部品は全てinput要素で作成し、type属性で区別する。

部品名

要素名

type属性

1行のテキスト入力フィールド

input

text

チェックボックス

input

checkbox

ラジオボタン

input

radio

複数行のテキスト入力フィールド

textarea

不要

プルダウンメニュー

select

不要(選択肢はoption属性を使用)

送信ボタン

input

submit

リセットボタン

input

reset

[2]1行のテキスト入力フィールド

input要素を利用し、type属性としてtextを指定する。

<input type="text" name="namae" size="40" maxlength="40">

  • <input>に対する</input>は不要。
  • name属性はCGIスクリプトに引き渡す際のkeyとして使用するため、必ず指定しなければならない。入力した値がkey(ここではnamae)に対応するvalueとなる。
  • size属性は左右の幅であり文字数で指定する。
  • maxlength属性は入力できる最大文字数であり、これも文字数で指定する。
  • size属性とmaxlength属性はなくても良い。

maxlength属性を5とすると入力できる文字数が最大5文字となる。

size属性を5とすると入力フィールドの幅が狭くなる。

[3]チェックボックス(複数選択可)

input要素を利用し、type属性としてcheckboxを指定する。

<input type="checkbox" name="cbx" value="1">チキンカレー

チキンカレー

  • <input>に対する</input>は不要。
  • name属性はCGIスクリプトに引き渡す際のkey、value属性はvalueとして使用するため、必ず指定しなければならない。
  • 通常は、チェックボックスは単独では使用せず、複数の項目から該当するものを全て選択するような場合に用いることが多い。このため、複数のチェックボックスのname属性は全て異なる名称にする。チェックをつけた項目のvalueがプログラムに引き渡される(チェックされていない項目のvalueをプログラム内で取り出すとnilになる)。
  • checked属性を追加し、checked="checked"と書くことで、その項目を最初から選ばれた状態にすることができる。

3つ目のチェックボックスのみchecked="checked"を追加

チキンカレー
シーフードカレー
野菜カレー

[4]ラジオボタン(ひとつのみ選択可能)

input要素を利用し、type属性としてradioを指定する。

<input type="radio" name="rd" value="20代">20代

20代

  • <input>に対する</input>は不要。
  • name属性はCGIスクリプトに引き渡す際のkey、value属性はvalueとして使用するため、必ず指定しなければならない。
  • ラジオボタンは単独では使用せず、複数の項目から1つを選択する際に用いることが多い。name属性は全て同一にする。
  • name属性を同一にしない場合、複数項目が選択できてしまう。
  • checked属性を追加し、checked="checked"と書くことで、その項目を最初から選ばれた状態にすることができる。

3つ目のチェックボックスのみchecked="checked"を追加

20代
30代
40代

左側はname属性をいずれもageとした場合(1つしか選択できない)。右側はname属性を順番にage1、age2、age3とした場合(3つとも選択できてしまう)。

20代
30代
40代

20代
30代
40代


[5]複数行のテキスト入力フィールド

textarea要素を利用する。type属性は不要。

<textarea rows="3" cols="30" name="youbou"></textarea>

  • <textarea>に対する</textarea>が必要。
  • name属性はCGIスクリプトに引き渡す際のkeyとして使用するため、必ず指定しなければならない。入力した値がkeyに対応するvalueとなる。
  • rows属性で行数、cols属性では幅を1行当たりの文字数で指定する。
  • <textarea></textarea>間にテキストを挿入すると、フィールド内にその文字が表示される。

rowsを2、colsを10にした場合

<textarea></textarea>間に「感想をお願いします」と入れた場合

[6]プルダウンメニュー

select要素を利用する。各選択肢にはoption要素を利用する。type属性は不要。

<select name="age">
<option>10代</option>
<option>20代</option>
<option>30代</option>
<option>40代</option>
<option>50代</option>
</select>

  • <select>に対する</select>が必要。
  • <select></select>間にoption要素を用いて選択肢を記述する。
  • name属性はCGIスクリプトに引き渡す際のkeyとして使用するため、必ず指定しなければならない。opetion要素の中でユーザが実際に選択した値がkeyに対応するvalueとなる。
  • select要素に対してsize属性で行数を指定すると、プルダウンメニューではなく、リストボックスとして表示される。

select要素にsize属性で、size="3"と指定した場合

[7]送信ボタン

input要素を利用し、type属性としてsubmitを指定する。

<input name="ok" type="submit" value="OK">

  • <input>に対する</input>は不要。
  • value属性はボタンに表示する名称となる。
  • name属性は送信ボタンが単独の場合は不要。送信ボタンが複数ある場合、これがCGIスクリプトに引き渡す際のkeyとなる(単独の場合はこのボタンを押すとCGIスクリプトにデータが引き渡されるのみであるが、複数の送信ボタンがある場合は、データをCGIスクリプトに引き渡すことに加え、どの送信ボタンを押したかという情報が伝達される)。

value属性を「送信する」にした場合

[8]リセットボタン

input要素を利用し、type属性としてresetを指定する。

<input name="ng" type="reset" value="reset">

  • <input>に対する</input>は不要。
  • value属性はボタンに表示する名称となる。
  • このボタンを押すと、form要素内に記述した(選択した)値がリセットされる。
  • name属性は実質的には不要(つけても良いが意味がない)。

value属性を「やっぱりやめる」にした場合

[9]CGIスクリプトの応用(処理の切替)

先週は入力した値に基づいて計算を行い、結果を表示するCGIスクリプトについて見てきた。今週は一歩進んで、入力した値により出力を切り替える例を作成してみよう。つまりif文を用いて結果を切り替える。

氏名:
性別: 男性 女性 どちらでもない
以下の各項目について当てはまるものに全てチェックをつけてください。
いろいろ勉強して自分を深めたい
社会に出て成功したいと思う
いつも何か目標を持っている
手がけたことは最善を尽くしたい

今回はラジオボタン(これ→)やチェックボックス(これ→)が追加されている。上述の通りこれらのパーツはいずれもいずれもinput要素で作成できる。パーツの使い分けはtype属性で指定している。

  • type="text":1行の入力フィールド
  • type="radio":ラジオボタン
  • type="checkbox":チェックボックス
  • type="submit":送信ボタン
  • type="reset":リセットボタン

この入力フォームは実際には以下のように書かれている(入力フォームの部分のみ)。

<form method="POST" action="./shinri.rb">
<p class="item">氏名:
<input type="text" name="name" maxlength="40"><br>
性別:
<input type="radio" name="rd" value="男性">男性
<input type="radio" name="rd" value="女性">女性
<input type="radio" name="rd" value="不明">どちらでもない<br>
以下の各項目について当てはまるものに全てチェックをつけてください。<br>
<input type="checkbox" name="box1" value="1">
いろいろ勉強して自分を深めたい<br>
<input type="checkbox" name="box2" value="1">
社会に出て成功したいと思う<br>
<input type="checkbox" name="box3" value="1">
いつも何か目標を持っている<br>
<input type="checkbox" name="box4" value="1">
手がけたことは最善を尽くしたい<br>

<input name="ok" type="submit" value="OK">
<input name="ng" type="reset" value="reset">
</p>
</form>

shinri.htmlのform要素のaction属性を見ると、入力データをshinri.rbに引き渡していることが分かる。shinri.rbは入力データを受け取り、処理をして結果のHTML文書を出力するCGIスクリプトである。前回のkakaku.rbと同じく、変数cのハッシュ値として入力値を取り出しているが、if文が追加されているため若干構造が複雑になっている。このプログラムではチェックをした項目数に応じてif文でメッセージを変化させている。

#!/usr/bin/env ruby

require 'cgi'
c = CGI.new("html4")
print "Content-type: text/html; charset=EUC-JP\n\n"

namae = c["name"]
seibetsu = c["rd"]
q1 = c["box1"]
q2 = c["box2"]
q3 = c["box3"]
q4 = c["box4"]

point = q1.to_i + q2.to_i + q3.to_i + q4.to_i

print "<html>
<head><title>診断結果</title></head>
<body>\n"

print "<h1>#{namae}さん(#{seibetsu})の診断結果</h1>\n"

print "<p>あなたがチェックをした項目数は#{point}個です。</p>\n"

print "<p>"
if point == 4
  print "やる気満々ですね。このまま頑張って!\n"
elsif point == 3
  print "結構頑張り屋さんですねえ。この調子で。\n"
elsif point == 2
  print "うーん。まあまあですかねえ\n"
elsif point == 1
  print "うーん。うーん。もうちょっとやる気見せましょう。\n"
else
  print "やる気ないですね。\n"
end
print "</p>\n"
print "</body>\n"
print "</html>\n"

[10]出席課題

shinri.htmlでは4つのチェックボックスが設置されており、チェックした数に応じて異なるメッセージが表示されるようCGIスクリプトが書かれている。チェックボックスをあと2つ追加し(=htmlファイルを作成して内容を書き換え)、チェックした項目数に応じて異なるメッセージが表示されるように変更してみよう(=shinri.rbを改良する)。

うまく実行できたら、入力フォームURL(http://roy.e.koeki-u.ac.jp/~学籍番号/cgi-bin/◯◯.html)を報告する。

制限時間は授業中に指示する。出席点は2点。提出要領は下記の通り。

  • 提出先:課題提出用メールアドレス
  • メールのSubject:attend09
  • 本文の構成:1行目で学籍番号、氏名を記載する。2行目にURLを記載し、その他感想等を記載する。

Tips:emacsでの日本語入力のオンオフはCtrl-oです

Tips:Mewによるメールの送り方はMewコマンドを参照

[11]CGIスクリプトでa要素やimg要素を使用する際の""の取り扱い

>>More

[12]ファイルのアクセス権について

>>More

[13]CSSを切り替える

>>More

[14]openメソッドと組み合わせる

>>More

[15]データを永続させる(PStoreクラス)

>>More

[16]CGIでのPStoreの利用

>>More

[17]自由課題グループ分け

次回から自由課題実施期間となる。これまで学んできたことを駆使してグループごとにプログラムを作成する。5〜6人のグループを作る。これまでに獲得してきた点数に基づき、各グループの戦力が均衡するようにグループ分けを行う。どのようなプログラムを作成するか考えておくと良い。

[18]レポート課題

問題(10点満点):CGIを使って自由に何かを作成する。10点満点だが、単に授業用のページ(他の先生も含む)に掲載されているものを複写し、多少言葉を変えただけの場合はプログラム点の配点を最低点とする。


  • 提出先:課題提出用メールアドレス
  • 提出期限:12/11(日)23:00(いつもよりも若干延長します)
  • メールのSubject:課題7
  • 本文の構成:1行目で学籍番号、氏名を記載する。2行目以降は下記の構成とする
  1. データを入力するWebページのURL
  2. 作成したプログラム(CGIスクリプト)
  3. プログラムの説明
  4. 感想

  • 採点基準:期限内提出点(2点)、メールの体裁(1点)、プログラム(1〜5点)、説明(2点)
  • プログラムの説明:何をするCGIなのか、Webページの入力フォームから受け取った値をどのように処理しているのかについて
  • わかりにくい説明や、Webページを単にコピー&ペーストしただけの説明は減点することがある。一度読み直してから提出すること。
  • 驚異的に良くできているレポートについては満点を超える得点をつけることがある。
  • よくできていたレポートは、他の人の参考になるよう、本人が特定できないような形で掲載する。掲載してほしくない場合はメールでの課題提出時にその旨記載すること。

Tips:emacsでの日本語入力のオンオフはCtrl-oです

Tips:ktermでのプログラムの実行結果をメールに貼り付けるには、コピーしたい箇所をマウスで選択し、emacs(Mew)上でマウスの真ん中ボタンをクリックする

Tips:Mewによるメールの送り方はMewコマンドを参照