基礎から学ぶサーブレット/JSP(7)
クラスライブラリを攻略「基本クラス編」
山田祥寛
2003/7/11
Javaには、クラスライブラリが用意されています。暗黙オブジェクトを学ぶことが、サーブレット/JSP(サーバサイドJava)の基本を学ぶということであるならば、クラスライブラリを学ぶということはJavaの基本を学ぶということでもあるのです。
クラスライブラリのすべてをこの場で取り上げることは(当然)できませんし、そもそもクラスライブラリには、サーブレット/JSPに縁の薄いSwingのようなGUI系のクラスライブラリも含まれます。
今回から3回に分けて、その膨大なライブラリの中でも、特に重要な――サーブレット/JSPとの関係が強いクラスについて紹介することにしましょう。以下は、本連載で紹介するクラスです。
表1 紹介するクラス(赤い文字が今回紹介するクラス)
|
| 入力文字列をHTMLエンコードする −String/StringBufferクラス(1)− |
最初のサンプルでは、StringクラスとStringBufferクラスを用いて、HTMLエスケープメソッドhtmlEscapeを作成してみます。
ブラウザ上では、「<」や「>」「&」のような文字をそのまま表示することはできません。このような予約文字を正しく表示するには、あらかじめ「<」「>」「&」のようにエスケープ表現に変換しておく必要があります。
| リスト1 htmlEscape.jsp |
<%@ page contentType="text/html;charset=Shift_JIS" %> |
![]() |
| 画面1 「<」や「>」のような文字を正しく表示。HTMLのソースを見ると、「<JSP&Servlet Basic>」の文字列を確認することができる |
■ロジックの概要
ユーザー定義メソッドhtmlEscapeは、引数として渡された文字列strVarを1文字ずつ読み込み(String#charAtメソッド)、読み込み文字が「<」「>」「&」であった場合にはそれぞれ「<」「>」「&」に変換し、それ以外の文字の場合にはそのまま、StringBufferオブジェクトobjSbに追記します(StringBuffer#appendメソッド)。文字列中のすべての文字を走査した後、戻り値として、StringBufferオブジェクトの内容を文字列に変換したもの(toStringメソッド)を返します。
■StringクラスとStringBufferクラスとの違い
上記の例では、文字列連結にStringクラスと「+」演算子を使用せず、StringBuffer#appendメソッドを使用して文字(列)を連結していきました。
なぜ、
strEsc+="<"; |
のようにしないのでしょう。
これは、Stringクラスが本質的には「固定長の文字列」を表現するものであるからです。つまり、「+」演算子によって文字列を連結するとは、「連結される前の文字列」と「連結される文字列」と「連結した結果できた文字列」と、合計3つのStringクラスを内部的に生成していることを意味します。これはオブジェクト生成のオーバーヘッドをかんがみれば、あまりに無駄の多い処理でもあります。
そこで、JSP(Java)の世界では、幾たびにもわたる文字列連結に際しては、StringBufferクラスを利用するのが一般的です。StringBufferクラスは「可変長の文字列」を表現することができ、あらかじめ一定のバッファを用意しています。つまり、文字列連結に際しても、バッファの後方に文字を追加していくだけで、新たなインスタンス(オブジェクト)は生成されないというわけです。
| Stringクラスは固定長文字列、StringBufferクラスは可変長文字列を表現します。繰り返しの文字列連結にはStringBufferクラスを使用することで、パフォーマンスを向上させることができます。 |
| リクエストパラメータの文字コードを変換する −String/StringBufferクラス(2)− |
JSP 1.2&サーブレット2.3(Tomcatならば4.x)の環境ならば、リクエストデータの文字コード設定にはHttpServletRequest#setCharacterEncodingメソッドを使用することができます。
しかし、それ以前の環境でリクエストデータのコード変換を行う場合には、どのようにしたらよいのでしょう(少なくともそのままではフォームなどから日本語データを受け取ることができません)。
ここではユーザー定義メソッドencodeを独自に作成し、リクエストデータを自前でエンコーディングしてみることにします。
| リスト2 encode.jsp |
<%@ page contentType="text/html;charset=Shift_JIS" %> |
■ロジックの概要
ユーザー定義メソッドencodeは、リクエストデータとして受け取った文字列をgetBytesメソッドでいったんバイト配列(文字ではないbyte型数値の配列)に変換し、あらためてデコードすることで正しく文字コードの変換を行うものとします。
“JISAutoDetect”は「自動変換」の意味を表しますが、もしもリクエストデータの文字化けが改善されない場合には、“Shift_JIS”や“EUC-JP”など、直接の文字コード名を指定してみてください。
■Stringクラスのそのほかのメソッド
サンプル中に登場したcharAtやgetBytesメソッドは、数あるStringクラスのメソッドのごく一部にすぎません。ここでは、そのほかによく使用される主なメソッドについて簡単に紹介しておくことにします。
表2 Stringクラスのそのほかのメソッド
|
| JSP 1.1&サーブレット2.2以前(Tomcatならば3.x)の環境ではHttpServletRequest#setCharacterEncodingメソッドは使えません。リクエストデータに2バイト文字が含まれている場合には自前のコード変換関数を定義する必要があります。 |
| 1/3 |
|
INDEX |
||
| 第7回 クラスライブラリを攻略「基本クラス編」 | ||
| Page1 入力文字列をHTMLエンコードする −String/StringBufferクラス(1)− リクエストパラメータの文字コードを変換する −String/StringBufferクラス(2)− |
||
| Page2 簡易なアクセスカウンタを作成する −ラッパクラス− 使用可能なパッケージの一覧を取得する −Packageクラス− |
||
| Page3 乱数表を作成する −Mathクラス− システム環境変数を取得する −Systemクラス− |
||
| 「基礎から学ぶサーブレット/JSP」連載記事一覧 |
TechTargetジャパン
- Scalaのパッケージ、アクセス修飾子、オブジェクト継承 (2012/5/22)
インポート、パッケージオブジェクト、抽象クラス/抽象メソッド、オーバーライド、final、シールドクラスなども - 基幹系システムでCloud SQLは使えるか試してみた (2012/5/17)
サンプルとしてMRPシステムを作成して動かし、「再帰呼び出し」などのパフォーマンスを測定して検証してみます - アジャイル管理ツール9選+Pivotal Tracker入門 (2012/5/14)
群雄割拠のアジャイルプロジェクト管理ツールを9つ紹介し、特に注目を集めているPivotal Trackerの基本的な使い方を解説します - サーバサイドJSやJavaでWebアプリが作れるXPages (2012/5/11)
Notes/Dominoの資産をサーバサイドJavaScriptやJavaで操作し、HTMLやJavaScript、CSSをUIにできる技術を紹介
|
|
キャリアアップ
スポンサーからのお知らせ
- - PR -
イベントカレンダー
- - PR -

