2007年10月13日土曜日

Javaの勉強 - Post2.

 今日も事前知識0でJavaと対戦中.
 Javaにまったく相手にされてない感じですが orz

 私の様なずぶのJava素人が引っかかりそうな点をいくつか.

◇ServletContext


 ASP.NetなどでもHttpContextと言う(コード本体以外の)クラスで使うとコードが汚くなる上にそれって反則技じゃん!でお馴染みの存在がありますが、JavaのServletContextとは異なる様だ(何方かと言うとHttpServletRequestの方が近いか?).
※Javaのcom.sun.net.httpserver.HttpContextは全くの別物.
 ServletContextはアプリケーション全体で共有のObjectらしく、セットされた値はクライアントの別を問わず共通になる.
 ASP.NetではHttpContextをaspxから直接呼び出す事は殆んど無い(少なくとも私は使わない)けど、Java(Servlet+JSP)のServletContextではASP.Netのaspxに当たるJSPから呼び出されるケースもある様だ.
 Frameworkなどを使わず、純粋にServletからJSPに値を渡す際にもっともポピュラー(?)な方法が以下の様な方法だと思われます.

【Servlet Test.java】
[省略...]
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    //-> get servlet object.
    javax.servlet.ServletContext objServContext = getServletContext();

    //-> set attribute on servletcontext.
    objServContext.setAttribute("TestData", "This is a test.");

    //-> get dispatcher object, and forwarding.
    javax.servlet.RequestDispatcher objDisp = request.getRequestDispatcher("/test.jsp");
    objDisp.forward(request, response);
}
 ※何で名前空間フルで書いてるんだよwと思うかもしれないけど、私の様な素人にしてみればServletContextやRequestDispatcherがどの名前空間に属しているのか覚えるには、javax.servlet.*とimportするより、フルで書いた方が覚えると思う.

【JSP test.jsp】
<%
    javax.servlet.ServletContext objServContext = getServletContext();
    String strTest = (String)objServContext.getAttribute("TestData");
    println(strTest);
//-> 結果
This is a test.
%>


 非常に便利です.
 ServletからJSP、はたまたServletからServlet等、Dispatcherでforward/includeした場合や、response.sendRedirectした場合においても使用可能です(スコープがApplicationだから普通はHttpSession使いますけど).

 しかし、このServletContextが妙.
 Servletでは上記の様に「getServletContext」で取得しますが、何故かJSPでは「application」で代替する事が出来る.
 ↓こんな感じで.

【JSP test.jsp】
<%
    String strTest = (String)application.getAttribute("TestData");
    println(strTest);
%>


 確かにこっちの方がスマートだ.
 んが、だったらServletでも「application」って使えてもいいじゃない orz
 何でこんな事になってるんだろう?
 と言う事で調べてみると、「out」や「session」と同じ様に「暗黙的に宣言されているオブジェクト(暗黙オブジェクト)」と言う存在らしい.
 ふーん.
 慣れれば楽だけどなぁ…だから何でServletじゃ使えねーんだよ!と混乱しそうで恐い.

 その他にもServletに関する各種情報を取得・設定出来ます.
 例えばJSPで
<%
    out.println("Servlet Version : " + application.getMajorVersion() + "." + application.getMinorVersion());
;//-> 結果
Servlet Version : 2.4
%>

 なんて事を書くと、Servlet自体のバージョンも取得出来ました.
 …使いどころが思いつきませんがw


◇getAttribute / setAttribute


 上記にある様に、あるインターフェイスに「getAttribute」および「setAttribute」メソッドが存在する場合、各オブジェクトにAttribute(属性)をセットしたり取得したり出来ます.
 主にServletとJSPでの連系や、Application共通での値の保持、Session共通での値の保持なんかに使う事になりそうです.

 Servlet→JSPでこのgetAttribute/setAttributeを使用する場合は、Attributeをセットするスコープ(何ていうか…要するに適用範囲と言いますか境界と言いますか…スコープです)が重要らしい.
 まぁ、ServletContextで少し触れた様に、Application/Session/Requestで使い分けないと大変な事になるから、別にJavaに限らずWebアプリケーションでスコープを気にするのは当たり前ですねw

 Applicationスコープ … アプリケーション(自分で作ったアプリケーション)内で共通
 Sessionスコープ … クライアント別(1クライアントに対して共通)
 Requestスコープ … リクエスト別(1回リクエスト内でのみ共通)

    javax.servlet.ServletContext objServContext = getServletContext();
    objServContext.setAttribute("TestData", 1);

    javax.servlet.http.HttpSession objSession = request.getSession();
    objSession.setAttribute("TestData", 1);

    request.setAttribute("TestData", 1);



 はぁ…
 それにしても全然Java勉強が捗らない orz
 新鮮で楽しいと言えば楽しいんですけど、頭に入るのにここまで時間がかかると、普通に使えるようになる気が一切しませんから…

0 件のコメント: