ユーザ用ツール

サイト用ツール


prog_cgi:セッション変数

差分

このページの2つのバージョン間の差分を表示します。

この比較画面へのリンク

次のリビジョン
前のリビジョン
次のリビジョン両方とも次のリビジョン
prog_cgi:セッション変数 [2019/03/09 10:52] – 作成 hirohitoprog_cgi:セッション変数 [2019/03/09 11:36] hirohito
行 1: 行 1:
 ====== セッション変数 ====== ====== セッション変数 ======
  
 +セッション変数とはHTTPリクエストをまたがって値を保持することができる変数です。
  
 +通常ウェブアプリケーションは、ブラウザからのリクエストを受けてプログラムが動作するというルーチンを何度も繰り返します。この時、1回目のリクエストと2回目のリクエストは何の関連もなく、1回目のリクエスト時の変数の値は2回目のリクエスト時には消えています。
 +これでは困る場合が多いので、なんらかの方法でリクエストをまたいで状態を保存する手段が必要になります。
 +この1つの解決策がセッション変数です。
 +
 +
 +===== 使い方 =====
 +
 +[[prog_cgi:入力フォームを使う|入力フォームを使う]] の項で作成したフォーム入力プログラムを、以下のように改造してみましょう。
 +
 +[1.start]\\
 +  ↓\\
 +[2.入力フォーム表示/入力]\\
 +  ↓\\
 +[3.確認画面表示/YES,NO入力]\\
 +  ↓\\
 +[4.最終確定画面表示]\\
 +
 +3までは、前項で作ったところです。3から4へは、入力された結果を引き継がなければなりません。ここにセッション変数を使います。
 +
 +3までのプログラムを再掲します。
 +
 +
 +<code ruby main.rb>
 +require 'alone'
 +
 +class FormController1 < AlController
 +  # constructor
 +  def initialize()
 +    @form = AlForm.new(
 +      AlText.new("text1"),
 +      AlInteger.new("integer1"),
 +      AlSubmit.new("submit1"),
 +    )
 +    @form.action = Alone::make_uri( action:"confirm" )
 +  end
 +
 +  # デフォルトアクション
 +  def action_index()
 +    AlTemplate.run( 'index.rhtml' )
 +  end
 +
 +  # 確認画面
 +  def action_confirm()
 +    if @form.validate()
 +      AlTemplate.run( 'confirm.rhtml' )
 +    else
 +      AlTemplate.run( 'index.rhtml' )
 +    end
 +  end
 +end
 +</code>
 +
 +<code html index.rhtml>
 +<%= header_section %>
 +<%= body_section %>
 +
 +<%= @form.get_messages_by_html() %>
 +<%= @form.make_tiny_form() %>
 +
 +<%= footer_section %>
 +</code>
 +
 +
 +確認画面では、YES/NO入力のためのaタグを追加します。
 +
 +<code html confirm.rhtml>
 +<%= header_section %>
 +<%= body_section %>
 +
 +text1: <%=h @form[:text1] %> <br>
 +integer1: <%=h @form[:integer1] %> <br>
 +<br>
 +よろしいですか?<br>
 +<a href="<%=h make_uri(:action=>'cancel') %>">いいえ</a>
 +<a href="<%=h make_uri(:action=>'commit') %>">はい</a>  
 +
 +<%= footer_section %>
 +</code>
 +
 +
 +テンプレートの追加部分を見てもらうとわかるとおり、YES(はい)の場合は "commit"、NO(いいえ)の場合は "cancel" アクションが呼び出されます。コントローラへもこの2つのアクションを追加します。また確認画面のアクションでは、現在の入力内容を次回へ引き継ぐ必要がありますので、その操作も追加します。
 +
 +<code ruby>
 +  # 確認画面                                                                    
 +  def action_confirm()
 +    if @form.validate()
 +      session[:text1] = @form[:text1]           # 追加                          
 +      session[:integer1] = @form[:integer1]     # 追加                          
 +      AlTemplate.run( 'confirm.rhtml' )
 +    else
 +      AlTemplate.run( 'index.rhtml' )
 +    end
 +  end  
 +
 +  # 最終確定画面                                                                
 +  def action_commit()
 +    @text1 = session[:text1]
 +    @integer1 = session[:integer1]
 +    AlTemplate.run( 'commit.rhtml' )
 +  end
 +
 +  # キャンセル                                                                  
 +  def action_cancel()
 +    @form[:text1] = session[:text1]
 +    @form[:integer1] = session[:integer1]
 +    AlTemplate.run( 'index.rhtml' )
 +  end
 +</code>
 +
 +最終確定画面用テンプレート
 +
 +<code html commit.rhtml>
 +<%= header_section %>
 +<%= body_section %>
 +
 +text1: <%=h @text1 %> <br>
 +integer1: <%=h @integer1 %> <br>
 +<br>
 +以上の内容で確定しました。
 +
 +<%= footer_section %>
 +</code>
 +
 +これで必要な4つのファイル、main.rb, index.rhtml, confirm.rhtml, commit.rthml が揃いました。
 +
 +実行すると以下のようになります。
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +コントローラローカルセッション変数は、個々のコントローラ内でのみ有効なセッション変数です。異なるコントローラからはアクセスできません。一つのアプリケーション内でグローバルにアクセスできるAlSessionによるセッション変数とは異なり、スコープがコントローラ内のみに限定されます。他のコントローラと名前がぶつかることを心配する必要がありません。 
prog_cgi/セッション変数.txt · 最終更新: 2019/03/09 11:54 by hirohito