カテゴリー : 2005年 4月

自分自身の URL を取得する


- HttpServletRequest#getRequestURI() を使うとよい。
- GET の引数などはつかないので form に渡せる。

  <form action=”<%=request.getRequestURI()%>“>
     ….
  </form>

でも JSP/Servlet に限らず実は次のでもよかったり.

<form action=”">

ランダムなパスワードを生成する


- よくブラウザの URL 入力欄で ad-hoc に場あたりで書いてるコード。

javascript:
    var N_PASS_LEN = 12;
    var lc = “abcdefghijklmnopqrstuvwxyz”;
    var sList = lc + lc.toUpperCase()+”0123456789_-”;
    var sRes = “”;
    for (i = 0; i < N_PASS_LEN; i++)
        sRes += sList.charAt(Math.floor(Math.random() * sList.length));
    document.open();
    document.write(sRes);
    document.close();

見やすさのために改行してあるが、一行でしか書けないのでこれを改行なしでやる。別に拘ってないのでそのときによって言語は異なるけど、お手軽ってことで。

連番入力の自動化


- 自分ではよくやるけど、あまり見ないため、書き方をメモ。
- 言語共通の配列処理や、 Java の JDBC で使う PreparedStatement.setXxx() 等、パラメータで連番(1,2,3,4 …)にして複数同じ処理をする必要がたびたびある。
これをそのまま手入力すると、数が増えると手間で、入れ換えが面倒で、この煩雑さがミスも誘発する、ということもある。これを楽するには、変数を使ってインクリメントしていくとよい。たとえば次の通り:

foo(0, “abc”);
foo(1, “def”);
foo(2, “ghi”);
// :

というのを、

int i = 0;
foo(i++, “abc”);
foo(i++, “def”);
foo(i++, “ghi”);

とする。入れ換えも1文を差し替えるだけで済むし、制御文をはさんでも順序が崩れたりしないので便利。加算用の数値変数が残るのが気になるので自分ではスコープ区切って使ってます。

{
  int i = 0;
  foo(i++, “abc”);
  foo(i++, “def”);
  foo(i++, “ghi”);
}

途中で変数を宣言できない C でも、スコープを切ったバージョンは使える。

Tomcat 5.x で Servlet をマップできない


- web.xml で定義とマッピングをちゃんとしても、その URL でアクセスすると 500 エラーになって表示されず、*.war でやるとそのファイルだけデプロイされないという状態になっていた。

javax.servlet.ServletException: ラッパがサーブレットクラス com.example.my.FooServlet 又はそれが依存するクラスを見つけることができません

となって、

java.lang.ClassNotFoundException: com.example.my.FooServlet

が続く。
- 原因は一言では $TOMCAT_HOME/server/lib に servlet-api.jar が無かったこと($TOMCAT_HOME/common/lib にはあったがだめだった…何かが原因で親である common の設定がクリアされた?)。サンプルのサーブレットが動いてたかは確認してないが、とりあえずこんな感じで対処:

cp -p common/lib/server-api.jar server/lib/

- 参考:
http://jakarta.apache.org/tomcat/tomcat-5.0-doc/class-loader-howto.html
- The Apache Jakarta Tomcat 5 Servlet/JSP Container – Class Loader HOW-TO
http://www.atmarkit.co.jp/fjava/javatips/049jspservlet025.html
- @IT: Java TIPS — クラスローダの仕組みを知る

XML のデータ整合性をチェックする


- Visual Studio.NET の Microsoft Development Environment
- Eclipse
- Emacs – PSGML
- OpenJade,OpenSP: それぞれ Jade, SP を DSSSL コミュニティが受け継いでメンテナンスと拡張をしているバージョン。元となった Jade/SP は既に配布されていない。
http://www.sscd.de/openjade/
- OpenJade Windows Binaries and Sources.

Firefox の Web 系開発者用プラグイン


http://chrispederick.com/work/firefox/webdeveloper/
- Web Developer Extension (Mozilla/Firefox plugin)
Documentation -> Features に機能一覧がある。Web 周りの言語の構文チェックが豊富。
- ちなみに国際化もされていて、そっちをいれれば日本語で使えるので安心。
 
- 難点:
– ローカルファイル検証(HTML/CSS のみ対応)のときも validator.w3c.org にデータを送信するため、公開するとまずい系には使うべきではないこと。

phpEclipse 1.1.3 でファイル保管に失敗する


- require を使ったコードを開いたり保存したりしようとすると String Out of Range Error が出てまともに PHP エディタを使えなくなる現象が発生。
- 原因は、PHPEclipse の設定 -> Project Defaults -> Include Paths に PEAR のパスを設定していたためでした。php.ini と重複指定してたのが理由かも?
- とりあえず PHPEclipse のほうの Include Paths エントリを除去したら直った。1時間のロスだ…

JSP 基本文法


- <% 〜 %> で囲んだ部分は全体で1つのメソッドのように Java コードが書ける.

<body>
  <%
    out.println(“Hello, world!”);
  %>
</body>

- <%= 〜 %> で囲んだ部分は一つの式として評価され、戻り値をその部分に表示する( つまり void は不可)。複文になってはならないため、セミコロンは用いない。

Your name is <%= name %>

- <%! 〜 %> で囲んだ部分はクラス内の定義とみなす

  <%!
    private static final int FOO = 1;
    private void final doSomething(String value){ /* do something */ }
  %>

- <%@ 〜 %> で囲んだ部分は JSP の制御タグとする

  <%@ page contextType="text/html; charset=EUC-JP" %>
  <%@ page import="java.sql.*" %>
  <%@ page import="java.util.*" %>

- JSP のインクルード構文:
– <jsp:include page=”foo.jsp” /> – 対象のページを 別に実行して, 結果を動的に(コンパイル後に)インクルードする。ローカル変数, request パラメータはファイルごとに独立になる。

view.jsp:
  <body>
    Hi, <jsp:include page=”inc.jsp”/>.
  </body>
 
inc.jsp:
  <%= "John" %>

– <%@ include file = "foo.jsp" %> – 対象のページをそのまま読み込み、静的に(コンパイル時に)インクルードする。ローカル変数は共存になり、インクルード対象(exp. inc.jsp)のファイルが更新されてもインクルード元(ex. foo.jsp)は再コンパイルされないため、全てのインクルード元について明示的に更新してやらなければならない。

view.jsp:
 <body>
   <%@ include file = "inc.jsp" %>
   Hi, <%= name %>.
 </body>
  
inc.jsp:
  <% String name = "John"; %>

- 参考:
http://www.javaroad.jp/servletjsp/index.html
- Java の道: Servlet, JSP

Java的リンク


http://www.geocities.co.jp/SiliconValley/6064/java_link.html
- Java 的リンク
Java のドキュメント、記事などへのリンクが豊富。

Java で MD5


java.security.MessageDigest を使うと簡単。

MessageDigest md;
try {
    md = MessageDigest.getInstance(“MD5″);
} catch(NoSuchAlgorithmException e) {
    e.printStackTrace();
    return;
}
// digest を求めるバイト列設定
// update(“Hello, world!”.getBytes()) と同じ。
md.update(“Hello, “.getBytes());
md.update(“world!”.getBytes());
// 計算して求めるがそのままだとバイト列なので文字列化.
final byte[] digest = md.digest();
final String sHexDigest; {
final StringBuffer buf = new StringBuffer(“”);
    for(int i=0; i < digest.length; i++){
        final int n = digest[i] & 0xFF;
        if(n < 16) buf.append("0");
        buf.append(Integer.toString(n, 16));
    }
    sHexDigest = buf.toString();
}
 
System.out.println(sHexDigest);