カテゴリー別アーカイブ: Java

Servlet 2.3以前では、EL式はデフォルト設定では無視される。

EL式が評価されない場合は、web.xmlのDTD宣言(xmlスキーマ)を確認。
jsp単位でEL式を有効にする場合は、ページディレクティブで、isELIgnored=”false”を明示する。

<%@ page isELIgnored=”false”  %>

タグファイルではpageディレクティブは使えないため、タグファイル内でEL式を利用する場合は、上記のweb.xmlのxmlスキーマを2.4以降のものに変更する必要があると思われる(たぶん)

と思ったら、タグファイルのtagディレクティブにisELIgnoredの属性があった。これできっと評価してもらえるのだろう。(未検証)

既存のAPIのソースコードをeclipseで読む手順

eclipseで読めたほうが便利なのでリマインダとしてメモ
①ソース付きのライブラリをダウンロード
②eclipseでjavaプロジェクトを作成
③ソース用のディレクトリへソースを突っ込む
④ダウンロードしてきたライブラリにたいていビルド方法が載ってるからそこから依存ライブラリをダウンロード
⑤依存ライブラリをクラスパスに突っ込む

マルチスレッドモデルでのservletのインスタンスは使い回される。

Servletのお勉強
当然の事なのだろうけど、ソースを書いて確認。

マルチスレッドモデルでのservletのインスタンスは、複数スレッドで共用される。

なので、インスタンス変数を使うと危険。

ついでに、HttpSessionも変な使い方をすると危険な事を確認。(わざわざこんな使い方はしないだろうけど・・・・)

インスタンス変数として、HttpSessionを宣言

HttpSession session = null;

以下、doGet内のコード

String result;

  if ( this.session == null) {

   result = “session is null”;
   session = req.getSession();

  } else {
   result = “session exists”;

  }

  PrintWriter writer = resp.getWriter();

  writer.println(“<html>”);
  writer.println(“<head>”);
  writer.println(“</head>”);
  writer.println(“<body>”);
  writer.println(result);
  writer.println(“<br>”);
  writer.print(“Servlet instanse ID is:”);
  writer.println(this.toString());
  writer.println(“<br>”);
  writer.print(“Session instanse ID is:”);
  writer.println(session.toString());
  writer.println(“</body>”);
  writer.println(“</html>”);

一回目のアクセス

session is null
Servlet instanse ID is:sample.TestServlet@1bbbafc
Session instanse ID is:org.apache.catalina.session.StandardSessionFacade@1f11507

新規セッションの別ウィンドウからアクセス

session exists
Servlet instanse ID is:sample.TestServlet@1bbbafc
Session instanse ID is:org.apache.catalina.session.StandardSessionFacade@1f11507

サーブレットのインスタンスが一緒。

あと、インスタンス変数なのでHttpsessionも一緒。

インスタンス変数を使う場合は要注意って感じですね。

OGNL式でセッションに格納したネストしたMapの値が取得できない。

struts2で実装してて、

sessionに、

        Map<String, Map<String, String>> testMap = new HashMap<String, Map<String,String>>();
        Map<String, String> innerMap1 = new HashMap<String, String>();
        Map<String, String> innerMap2 = new HashMap<String, String>();

        innerMap1.put(“1”, “あいうえお”);
        innerMap1.put(“2”, “かきくけこ”);
        innerMap2.put(“1”, “あかさたな”);
        innerMap2.put(“2”, “はまやらわ”);

        testMap.put(“foo”, innerMap1);
        testMap.put(“bar”, innerMap2);

        this.sessionMap.put(“hoge”, testMap);

こんな感じでネストしたMapをセットして、

jspでOGNL式使って

<s:property value=”#session.hoge.foo[‘1’]”/>

って書いてもなんにも表示されない。せめてエラーぐらい出してくれればいいのに。