忍者ブログ
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。



2017/08/20 11:21 |
Java1-2:Javaのスコープと初期化パラメータ

どうせ後で嫌というほど混乱するので、Javaアプリケーションのスコープについて今は簡単に解説しておきます。

一番広いのがアプリケーションスコープという単位です。
範囲はexampleパッケージ全体であり、いわゆるグローバル領域よりも広い範囲です。
ここに保存された値は、サーバが再起動されるまで保持され続け、誰からでも参照できるようになります。
次がセッションスコープで、いわゆるセッションです。
次がリクエストスコープで、一回のサーブレットの呼び出しの単位で、他プログラミング言語で言うところのグローバル領域です。
最も小さいのがページスコープであり、プログラム一本に値します。

リクエストスコープとページスコープの違いは、サーブレットから他のプログラムを呼び出したとき等に呼び出し先に値が渡されるか否かということです。
前回や今回のようにプログラム一本で完結する場合、両者は同じ意味です。

それを踏まえたうえで初期化パラメータの設定と取得を行ってみましょう。
初期化パラメータとは、サーバ全体、あるいはサーブレット全体に共通して設定しておきたい値を保存しておく場所です。
例えばDBのアドレス、ログインIDやパスワード等です。

WebContents/WEB-INF/web.xml

<web-app>
      <context-param>
            <param-name>c-paramater</param-name>
            <param-value>ABC</param-value>
      </context-param>

      <servlet>
            <servlet-name>index</servlet-name>
            <servlet-class>index</servlet-class>
            <init-param>
                  <param-name>i-paramater</param-name>
                  <param-value>DEF</param-value>
            </init-param>
      </servlet>
</web-app>


<web-app><context-param>で設定するのはアプリケーション単位で、どのサーブレットからでも参照することのできる値です。
<web-app><servlet><init-param>がサーブレット単位で、この場合HelloWorldサーブレットからしか参照できません。
ユーザ側から見た場合わけのスコープに対して、初期化パラメータはサーバ側から見た場合わけなので、init-paramに対応するスコープはありません。

次に取得側。

index.java

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class index extends HttpServlet {
      public void service(HttpServletRequest req,HttpServletResponse res) throws ServletException, IOException{
            
      PrintWriter out = res.getWriter();
      out.println("<HTML><BODY>");
     
      //context-paramのc-paramaterを取得→ABC
      String str1=getServletContext().getInitParameter("c-paramater");
      out.println(str1+"<br>");

      //init-paramのi-paramaterを取得→DEF
      String str2=getServletConfig().getInitParameter("i-paramater");
      out.println(str2+"<br>");

      out.println("</BODY></HTML>");
      }
}


getServletContextメソッド、getServletConfigメソッドはそれぞれServletContextインターフェイスおよびServletConfigインターフェイスを呼び出しています。
ServletContextインターフェイスのgetInitParameterメソッドでcontext-param初期化パラメータを、ServletConfigインターフェイスのgetInitParameterメソッドでinit-param初期化パラメータを取得することができます。
取得したいパラメータのスコープによって、取得するのに必要なインターフェイスが変わりますので注意が必要です。
例えばgetServletContext().getInitParameter("i-paramater");とすると、アプリケーションスコープのc-paramaterを取得しに行きますが、アプリケーションスコープのi-paramaterには何もセットされていないのでnullが返ってきます。


次はセッションスコープです。

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class session1 extends HttpServlet {
public void doGet(HttpServletRequest req,HttpServletResponse res) throws ServletException, IOException {
      res.setContentType("text/html; charset=EUC-JP");
      String b;

      //セッションを作成
      HttpSession session = req.getSession(true);

      //セッションが新しいかどうかチェック
      if(session.isNew()){
            b="あたらしいセッション";
      }else{
            b="ふるいセッション";
      };

      //セッションから値を取得
      String a=(String)session.getAttribute("new");

      //セッションに値をセット
      session.setAttribute("new", b);

    PrintWriter out = res.getWriter();
    out.println("<HTML><BODY>");
    out.println(b+"<hr>");
    out.println("<a href='session'>自分自身へリンク</a><hr>");
    out.println("</BODY></HTML>");
  }
}


HttpSession.getSession()で自動的にセッション管理を行ってくれます。
この場合、最初の一度だけ新しいセッションと判断され、以後は何度アクセスしても古いセッションとなります。
しかしスコープがセッション単位なので、ブラウザを立ち上げなおせばまた新しくなります。


リクエストスコープとページスコープについてはJavaサーブレットだけでは少々面倒なのでJSPで行うことにします。

PR


2008/06/03 17:10 | Comments(0) | TrackBack(0) | Java

トラックバック

トラックバックURL:

コメント

コメントを投稿する






Vodafone絵文字 i-mode絵文字 Ezweb絵文字 (絵文字)



<<JavaServlet1-3:Javaサーブレットでカウンター | HOME | JavaServlet1-1:JavaサーブレットでHelloWorld>>
忍者ブログ[PR]