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するより、フルで書いた方が覚えると思う.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);
}
【JSP test.jsp】
<%
javax.servlet.ServletContext objServContext = getServletContext();
String strTest = (String)objServContext.getAttribute("TestData");
println(strTest);
//-> 結果
This is a test.
%>
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);
%>
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
%>
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);
objServContext.setAttribute("TestData", 1);
javax.servlet.http.HttpSession objSession = request.getSession();
objSession.setAttribute("TestData", 1);
request.setAttribute("TestData", 1);
はぁ…
それにしても全然Java勉強が捗らない orz
新鮮で楽しいと言えば楽しいんですけど、頭に入るのにここまで時間がかかると、普通に使えるようになる気が一切しませんから…
0 件のコメント:
コメントを投稿