Javaには、クラスライブラリが用意されています。暗黙オブジェクトを学ぶことが、サーブレット/JSP(サーバサイドJava)の基本を学ぶということであるならば、クラスライブラリを学ぶということはJavaの基本を学ぶということでもあるのです。
クラスライブラリのすべてをこの場で取り上げることは(当然)できませんし、そもそもクラスライブラリには、サーブレット/JSPに縁の薄いSwingのようなGUI系のクラスライブラリも含まれます。
今回から3回に分けて、その膨大なライブラリの中でも、特に重要な――サーブレット/JSPとの関係が強いクラスについて紹介することにしましょう。以下は、本連載で紹介するクラスです。
|
最初のサンプルでは、StringクラスとStringBufferクラスを用いて、HTMLエスケープメソッドhtmlEscapeを作成してみます。
ブラウザ上では、「<」や「>」「&」のような文字をそのまま表示することはできません。このような予約文字を正しく表示するには、あらかじめ「<」「>」「&」のようにエスケープ表現に変換しておく必要があります。
<%@ page contentType="text/html;charset=Shift_JIS" %> <%! private String htmlEscape(String strVar){ StringBuffer strEsc=new StringBuffer(); for(int i=0;i<strVar.length();i++){ switch(strVar.charAt(i)){ case '<' : strEsc.append("<"); break; case '>' : strEsc.append(">"); break; case '&' : strEsc.append("&"); break; default : strEsc.append(strVar.charAt(i)); break; } } return strEsc.toString(); } %> <%=this.htmlEscape("<JSP&Servlet Basic>")%>
ユーザー定義メソッドhtmlEscapeは、引数として渡された文字列strVarを1文字ずつ読み込み(String#charAtメソッド)、読み込み文字が「<」や「>」「&」であった場合にはそれぞれ「<」「>」「&」に変換し、それ以外の文字の場合にはそのまま、StringBufferオブジェクトobjSbに追記します(StringBuffer#appendメソッド)。文字列中のすべての文字を走査した後、戻り値として、StringBufferオブジェクトの内容を文字列に変換したもの(toStringメソッド)を返します。
上記の例では、文字列連結にStringクラスと「+」演算子を使用せず、StringBuffer#appendメソッドを使用して文字(列)を連結していきました。
なぜ、
strEsc+="<";
のようにしないのでしょう。
これは、Stringクラスが本質的には「固定長の文字列」を表現するものであるからです。つまり、「+」演算子によって文字列を連結するとは、「連結される前の文字列」と「連結される文字列」と「連結した結果できた文字列」と、合計3つのStringクラスを内部的に生成していることを意味します。これはオブジェクト生成のオーバーヘッドをかんがみれば、あまりに無駄の多い処理でもあります。
そこで、JSP(Java)の世界では、幾たびにもわたる文字列連結に際しては、StringBufferクラスを利用するのが一般的です。StringBufferクラスは「可変長の文字列」を表現することができ、あらかじめ一定のバッファを用意しています。つまり、文字列連結に際しても、バッファの後方に文字を追加していくだけで、新たなインスタンス(オブジェクト)は生成されないというわけです。
Stringクラスは固定長文字列、StringBufferクラスは可変長文字列を表現します。繰り返しの文字列連結にはStringBufferクラスを使用することで、パフォーマンスを向上させることができます。
JSP 1.2&サーブレット2.3(Tomcatならば4.x)の環境ならば、リクエストデータの文字コード設定にはHttpServletRequest#setCharacterEncodingメソッドを使用することができます。
しかし、それ以前の環境でリクエストデータのコード変換を行う場合には、どのようにしたらよいのでしょう(少なくともそのままではフォームなどから日本語データを受け取ることができません)。
ここではユーザー定義メソッドencodeを独自に作成し、リクエストデータを自前でエンコーディングしてみることにします。
<%@ page contentType="text/html;charset=Shift_JIS" %> <%! private String encode(String strVal) throws UnsupportedEncodingException{ if(strVal==null){ return (null); }else{ return (new String(strVal.getBytes("8859_1"),"JISAutoDetect")); } } %> <%=this.encode(request.getParameter("name"))%>
ユーザー定義メソッドencodeは、リクエストデータとして受け取った文字列をgetBytesメソッドでいったんバイト配列(文字ではないbyte型数値の配列)に変換し、あらためてデコードすることで正しく文字コードの変換を行うものとします。
“JISAutoDetect”は「自動変換」の意味を表しますが、もしもリクエストデータの文字化けが改善されない場合には、“Shift_JIS”や“EUC-JP”など、直接の文字コード名を指定してみてください。
サンプル中に登場したcharAtやgetBytesメソッドは、数あるStringクラスのメソッドのごく一部にすぎません。ここでは、そのほかによく使用される主なメソッドについて簡単に紹介しておくことにします。
|
JSP 1.1&サーブレット2.2以前(Tomcatならば3.x)の環境ではHttpServletRequest#setCharacterEncodingメソッドは使えません。リクエストデータに2バイト文字が含まれている場合には自前のコード変換関数を定義する必要があります。
Copyright © ITmedia, Inc. All Rights Reserved.