2011-10-02更新 2002-12-06作成
ここからはサーブレットを利用したサーバー側Javaを中心に説明を進めていきます。
サーブレットの場合は「全体の構成」で触れたように
Javaソースを作成(.javaファイル)
Javaソースをコンパイル
コンパイル結果のクラスファイル(.classファイル)をAPサーバーに配備
ブラウザから呼び出して実行
という手順で作業を進めます。
この1.〜3.ですが、このページの説明ではJavaの統合開発環境(IDE)であるEclipseやSun Studio Creatorなどは一切使いません。テキストエディタ等でソースを編集してコマンドラインでコンパイル、実行ファイル(クラスファイルのこと)をAPサーバーに配備、を全て自分で手作業で行います。そのためにいくつかの準備が必要になるので説明しておきます。
・Java2 EE
JSPのときはAPサーバー側で自動的にサーブレットへの変換・コンパイルが行われました。Java2 EE(Enterprize Edition)環境はAPサーバーのものが使われていましたが、今度は自分でJavaソースをコンパイルするため、J2EE環境もインストールしておいてください。「TOMCAT4 インストール・設定 」あるいは「TOMCAT5.5 インストール・設定 」の目次から「TOMCATインストール・設定」を参考にしてください。
・環境変数
Java2 SDK SEとJava2 SDK EEをインストール後、環境変数の設定をしてあるか確認してください。環境変数の設定は(Windows NT、Windows 2000のとき)「スタート」メニュー − 「設定」 − 「コントロールパネル」 − 「システム」と選んでいき行います。
まず JAVA_HOME にJava2 SDK SEをインストールしたホームディレクトリが設定されていることを確認し、なってなければそのように設定してください。
それから PATH に対してJavaのコンパイラ等のコマンドが格納されているディレクトリを追加します。
設定内容は変数名 PATH に対して値として、%PATH%;%JAVA_HOME%\bin としておけばいいです。
コンパイルにあたって環境変数 CLASSPATH の設定を説明している本やサイトも多いのですが、ここではそれは行いません。 CLASSPATH に %CATALINA_HOME%\common\lib か %J2EE_HOME%\lib を指定しておけば、後に述べるコマンドラインからコンパイルを行うときは多少楽になるのですが、それをしません。
実際にJavaのドキュメントでもこの方法は推奨はしていません。そうでなくコンパイル時のパラメータのCLASSPATHで指定するほうを勧めています。
ここのような勉強環境ならそれほど影響はないのですが、ここの例ではTestApしかありませんが、実験用にTestAp2やTestAp3を作ったりしたときに、どちらの環境でコンパイルするかによっていちいち環境変数の CLASSPATH を変える必要が出てきます。
あるいは後の方で出てくるパッケージ化にも影響します。共通部品のようなものをパッケージ化して作っておいたとき、それを修正するときに、もとのパッケージを使うのか改修後のパッケージを使うかによっても CLASSPATH の修正が必要になります(コンパイル時および実行時)。
・エディタ
エディタはテキストファイルが編集できればなんでも(メモ帳でも)いいです。ただJavaソースのコンパイルのときに、いちいちコマンドラインから入力するのが面倒ならマクロ機能のあるエディタにしたほうがいいでしょう。
フリーのエディタならEMACS系(WindowsならMeadowがそれ)が最強で、Java開発用のマクロも揃ってるんでしょうが、私がこれを使ってないのでここではこれ以上触れません。
シェアウェアですが、「TextPad」と「秀丸」を挙げておきます。それからフリーのものとして「サクラエディタ」と「K2Editor」を挙げます。必要なら窓の杜やベクターから探してください。
TextPad の設定
TextPadは標準でJava開発環境をある程度揃えています。ただJava2 SDK SE用なのでEE用に若干、追加設定がいります。
TextPadを起動したら「設定」メニュー − 「環境設定」 − 「ツールマネージャー」 − 「コンパイルJava」と進んでください。ここで「引数」を見ると $File になっていると思います。ここに -extdirs CATALINA_HOMEの内容\lib;. を追加してください。例えば $File -extdirs "C:\Apache Group\Tomcat 4.1\common\lib;." となります。
こうするとJavaソースのコンパイルはctrl + 1(コントロールキーを押しながら1キーを押す)で実行されます。コンパイル結果のクラスファイルはソースファイルと同じところに作成されます。
秀丸 の設定
秀丸を起動したらまず次のようなマクロを作成しましょう。保存するときは例えば JAVAC.mac と、拡張子を .mac にします。保存先はデフォルトの状態では秀丸をインストールしたディレクトリにしてください(標準では C:\Program Files\Hidemaru です)。
if (updated)
save;
run "JAVAC -extdirs \"" + getenv("CATALINA_HOME") + "\\common\\lib;.\" \"" + filename2 + "\"";
次に「マクロ」メニュー − 「マクロ登録」と進み、空いているところを選んで、タイトルには例えば「Javaコンパイル」とします。そしてファイル名から今作成した JAVAC.mac を選択します。
こうするとJavaソースのコンパイルはctrl + 1(マクロ1に登録したとき)で実行されます。コンパイル結果のクラスファイルはソースファイルと同じところに作成されます。
コンパイルエラーがなくコンパイルが終了すると空の秀丸エディタが起動されるし、エラーがあればエラーメッセージを表示した秀丸エディタが起動されます。
サクラエディタ の設定
Javaソースのコンパイルは「ツール」メニュー − 「外部コマンドの実行」で行います。APサーバーがTOMCATの場合で環境変数JAVA_HOMEとCATALINA_HOMEが設定してあることを前提とします。
「外部コマンドの実行」で開かれるダイアログの「名前」に
%JAVA_HOME%\bin\javac -extdirs "%CATALINA_HOME%\common\lib;." "$F" と入力してください。これはコマンドラインでコンパイルをするときと同じ指定です。最後の$Fがサクラエディタのマクロ特殊記号で、編集中のファイル名をフルパスで表したものに置き換わります。
実行結果は別ウィンドウが開きそこに表示されます。コンパイル結果のクラスファイルはソースファイルと同じところに作成されます。
K2Editor の設定
K2Editorを起動したらまず外部マクロを作成します。ファイル名は拡張しが.macなら任意の名前でいいんですが、ここでは JAVAC.mac としましょう。保存先は K2Editorのホームディレクトリ\MACRO です。マクロの内容は
//Javaコンパイル
ProgramExec(javac.exe -extdirs "C:\Apache Group\Tomcat 4.1\common\lib;." -Xstdout C:\TEMP\javacerr.txt %F ,, 1, 0, 0)
LoadFromFile(C:\TEMP\javacerr.txt)
としておきましょう。この例の場合ではCドライブにTEMPというディレクトリを作っておく必要があります。その下のjavacerr.txtにコンパイル結果のメッセージを出力するように指定しています。コンパイル実行後にそのファイルをK2Editorで開くという指定です。
次に今作成したマクロの登録をします。「その他」メニュー − 「共通設定」と進み、「マクロ]のタグを選んでください。空いているところを選んで「マクロ割付」ボタンを押すと、MACROディレクトリ下にあるマクロ一覧が表示されるので、作成した JAVAC.mac を選択してください。
こうしておけば拡張子が.javaのファイルを開いておき、ファンクションキーの2を押すか、「その他」メニュー − 「外部マクロ実行」でJAVAC.macを選択することにより、Javaのコンパイルが出来ます。
コンパイルエラーがなくコンパイルが終了すると空のK2Editorが起動されるし、エラーがあればエラーメッセージを表示したK2Editorが起動されます。
・コンパイル
マクロ登録が出来るエディタを使って、編集中のJavaソースをその場でコンパイルする方法については上で説明しました。そうではなく、コマンドラインからコンパイルコマンドでコンパイルする方法について簡単に説明しておきます。
Javaのソースファイルは、 C:\WORK\Java_Src ディレクトリに置いてあるという前提で説明します。
まずコンパイルコマンドの指定は
javac コンパイルオプション ソースファイル名
となります。ここでコンパイルオプションにはJ2EE環境のライブラリの場所を指定しますので、そのためのオプション -extdirs を使います。J2EE環境のライブラリにはTOMCATのものを使いますので、例えば -extdirs "C:\Apache Software Foundation\Tomcat 4.1\common\lib;." となります。
ソースファイル名はフルパスで C:\WORK\Java_Src\ソースファイル名 とするか、事前に CD コマンドでカレントディレクトリを C:\WORK\Java_Src に移動しておいてください。
Javaソースにエラーが無く、コンパイルが正常に終了するとコンパイル結果のクラスファイルは、ソースファイルと同じディレクトリに生成されます。
・名前と場所
Javaソースのファイル名は拡張子を.javaにして、サーブレット名.java としてください。このサーブレット名がブラウザのアドレスバーに指定する名前になります。
コンパイル結果のクラスファイルは、サーブレット名.class になります。
ソースファイルの置き場所は任意の場所です。コンパイル結果のクラスファイルは、ここでは「TOMCAT インストール・設定 」を前提にしているので、%CATALINA_HOME%\webapps\TestAp\WEB-INF\classes以下になります。
クラスファイルをここにコピーすればいいんですが、面倒ならここにソースファイルも置いて、ここでコンパイルしても構いません(実運用でなくお勉強環境なので)。
サーブレットを実行するとき、ブラウザのアドレスバーでは http://localhost:8080/TestAp/servlet/サーブレット名 と入力するようになります
Javaソースファイル内の構成は、概ね次のようになります。
import 等の宣言部分
サーブレット名の定義(クラスの定義)
・インスタンス変数の定義
メソッドの定義
メソッドの定義
内部ルーチンの定義
内部ルーチンの定義
※インスタンス変数の定義
という構成です。
インスタンス変数の定義は頭の方ではなく、上図の下のほう、「※インスタンス変数の定義」で書いた所にするという流儀もあるようです。自分でプログラムを組む場合、どちらかに統一してください。
ここで import 文のサーブレットの場合の書き方を説明します。特にサーブレットに限らず、JSP以外のJava標準の書き方です。
これはJSPのときと違い通常のJavaの文なので書き方は、
import パッケージ名.クラス名;
あるいは同じパッケージ内の全てのクラスをインポートするのであれば、* で代表して
import パッケージ名.*;
となります。
* を使ったクラスの一括指定の注意等はJSPのときと同じです。「インポートの仕組み 」を参照してください。
最初に作るサーブレットは、JSP編で一番最初に作った「テキストボックスで入力したデータをそのまま表示する」を基にしていきましょう。しばらくは、これにいろいろと手を加えていく構成で進めていきます。
それでは単純にサーブレット変換したソースを、初めから順に例示しながら説明します。
import javax.servlet.ServletException; // サーブレット処理関連の例外
import javax.servlet.http.HttpServlet; // サーブレットの基底クラス
import javax.servlet.http.HttpServletRequest; // クライアントからの要求処理用
import javax.servlet.http.HttpServletResponse; // クライアントへの応答用
import java.io.PrintWriter; // 標準出力先設定用
import java.io.IOException; // IO関連の例外
これが最低限必要な import 文の部分になります。これのコメントの部分はあくまで説明用なので、通常は必要ないと思います。
その次の部分です。ここで自分のサーブレットに対するクラス定義をします。
public class Svlt_SMPL01 extends HttpServlet
{
// Svlt_SMPL01クラス内全域で使うので、ここで変数宣言する
// ただし他のクラスには見せないのでprivateにしておく
private PrintWriter wc_out;
APサーバーから呼ばれる、外部からアクセスされるクラスなので public 宣言をします。
class の後ろがクラス名、この場合はサーブレット名になります。ファイル名の構成を思い出してください(サーブレット名.java)。ここに書くクラス名は、ソースファイルのサーブレット名部分と同じでないといけません。
次の extends HttpServlet がいよいよJavaのオブジェクト指向らしい部分です。
まず HttpServlet はJavaが標準で持っているサーブレットのクラスです。その前と併せて Svlt_SMPL01 extends HttpServlet と書くと、Svlt_SMPL01は HttpServlet を拡張したもの、という意味になります。言い方を変えるとSvlt_SMPL01クラスは HttpServlet クラスを継承 している、ということです。この場合、 HttpServlet が基底クラス でSvlt_SMPL01が拡張クラス になります(他の言い方ではそれぞれを親クラス、子クラスとも言いますが、ここでは基底クラス、拡張クラスという言い方をします)。
Java標準のサーブレットに対して何を拡張しているかと言うと、このSvlt_SMPL01固有の機能、つまりクライアントから受けたデータを返す処理、という部分が標準外の拡張機能にあたる訳です。
そしてクラス宣言に対する { から } の間が、このクラスが持つメソッドやインスタンス変数の定義記述になります。
次にインスタンス変数を定義しています。標準出力に使う変数です。例の中のコメントにあるとおり、外部に見せない変数なので private 宣言をします。
それからこのSvlt_SMPL01クラスが持つメソッドの定義をしていきます。
public void doGet (HttpServletRequest p_request, HttpServletResponse p_response)
throws IOException, ServletException
{
P_response.setContentType("text/html; charset=Shift_JIS");
wc_out = p_response.getWriter();
このメソッド名 doGet はきまり文句です。 method="get" で定義したフォームからのデータを受けるときは、このメソッド名を使います。ちなみに method="post" で定義したフォームからのデータのときは、 doPost というメソッド名になります。
ただしブラウザのアドレスバーで http://localhost:8080/TestAp/servlet/サーブレット名 と直接指定してサーブレットを起動したときは、送信メソッドは
get になります(フォームで
method="post" と定義してあっても)。
そのため
doPost しか定義していないと「HTTP の GET メソッドはこの URL ではサポートされていません。」というエラーメッセージが出ます。これを回避する一つの方法として次のように
doGet と
doPost の両方を定義することが出来ます。
public void doGet (HttpServletRequest p_request, HttpServletResponse p_response)
throws IOException, ServletException
{
this.doPost(p_request, p_response);
}
public void doPost (HttpServletRequest p_request, HttpServletResponse p_response)
throws IOException, ServletException
{
// 本来の処理記述
}
doGet で受け取ったときは、そのまま
doPost に処理を引き渡してしまう方法です。この中の
this というのは特別なクラスで自分自身を意味します。自分自身の
doPost メソッドを呼び出す、ということです。
このメソッドはAPサーバーであるTOMCAT、つまり外部から呼び出されるので public 宣言にします。またこのメソッドは戻り値が無いので、その次の戻り値型定義に void と定義します。
doGet メソッドが受け取る引数は、クライアントからの要求を表す HttpServletRequest クラスとクライアントへの応答を表す HttpServletResponse クラスなので、この2つを定義します。
次の throws は、その後ろで定義した例外はそのまま呼び出し元に返す、という意味です。 doGet メソッド内で IOException と ServletException が起きたときは呼び出し元のAPサーバーにそのまま返す、ということです。
そしてメソッド宣言に対する { から } の間が実際のメソッドの処理記述になります。
まず
p_request.setCharacterEncoding("Shift_JIS");
は、クライアントから受け取るデータの文字コードを指定します。Java内では全てunicodeで処理されますが、unicodeに変換する際、このサーブレットではどの文字コードで送られたデータを処理するかを指定します。
次の
p_response.setContentType("text/html; charset=Shift_JIS");
は、クライアントへの応答内容の形式と文字コードを設定します。
それから
wc_out = p_response.getWriter();
で、 PrintWriter 型と宣言したインスタンス変数wc_outに対して、実際にクライアントに応答を送信するときに使う PrintWriter オブジェクトを設定しています。
p_responseという変数はdoGet で受け取る引数(パラメータ)で、 HttpServletResponse クラスの参照データ型です。p_responseの getWriter メソッドを呼び出すということは、 HttpServletResponse クラスの getWriter メソッドを呼び出すということになります。
しかしJava2 EEのAPI仕様で HttpServletResponse クラスのメソッドを見ても getWriter メソッドは出ていません。実は HttpServletResponse クラスは ServletResponse クラスを拡張したもの、つまり ServletResponse クラスを継承しています。そして getWriter メソッドは ServletResponse クラスのメソッドとして定義されています。
このように拡張クラスは継承している基底クラスの機能(メソッド)を、あたかも自分が持っているように提供することが出来ます。
さてこの例題のクラス定義では HttpServlet クラスを拡張しました。そして実は doGet メソッドは HttpServlet クラスで定義されています。
しかしこの例題クラスでは独自に doGet メソッドを定義しています。
そうすると例題クラスの doGet メソッドを呼び出すということは、基底クラスである HttpServlet クラスの doGet メソッドではなく、例題クラスの doGet メソッドが使われる、ということになります。つまり基底クラスのメソッドそのままではなく、拡張クラス(この例では例題クラス)独自の処理・機能が必要なときに、基底クラスのものと同名のメソッドを定義することが出来るのです。
言い換えると基底クラスのあるメソッドを、拡張クラス独自の機能で上書きしている、ということです。上書きしていないメソッドについては、基底クラスのものがそのまま使われます。
その後が doGet メソッドの実際の処理内容記述です。
ここはJSPで作ったものとほとんど同じですね。JSPのときはHTMLをそのまま書いていたのが print メソッドでの出力に変わっただけです。
wc_out.print("<!doctype html public \"-//W3C//DTD HTML 4.0 Transitional//EN\" "
+ "\"http://www.w3.org/TR/REC-html40/loose.dtd\">");
wc_out.print("<html>");
wc_out.print("<head>");
wc_out.print("<title>サンプル1:送信パラメータ受け取り(テキストボックス)</title>");
wc_out.print("</head>");
wc_out.print("<body bgcolor=\"#aaddaa\">");
wc_out.print("<form method=\"get\" action=\"Svlt_SMPL01\">");
wc_out.print("<input type=\"text\" name=\"Text1\" size=\"10\" /> ");
wc_out.print("<input type=\"submit\" name=\"SUB1\" value=\"送信\" />");
wc_out.print("<br />");
wc_out.print("<hr />");
wc_out.print("受けたデータは " + p_request.getParameter("Text1") + " です。");
wc_out.print("<br />");
wc_out.print("</form>");
wc_out.print("</body>");
wc_out.print("</html>");
}
}
print の代わりに println メソッドでも構いません。両者の違いはメソッドの引数に書いたデータを出力後、改行コードを付けるか否か、という点です。
改行コードがあろうが無かろうがHTMLでは <br /> を書かないとブラウザ上の実際の表示では改行されないので、どちらでも同じ表示になります。ブラウザで「ソースの表示」をしたときにHTMLソースの表示が変わるだけです。今は練習としているので、デバッグなどのときブラウザ側で生成したHTMLを見ることもあるかと思います。そのとき見やすいので、サンプルでは print メソッドですが println メソッドの方がいいかもしれません。
以上、例示したのを順番に全部つなげれば、JSP編で一番最初に作った「テキストボックスで入力したデータをそのまま表示する」のサーブレット版です。一応全体を「サンプル 」として載せておきます。
ただしサンプルでは doGet の代わりに doPost を使ったものになってます。
さて今作ったサーブレットを動かし、テキストボックスに
<a href="about:blank" target="_blank">TEST</a>
と入力してみましょう。そして送信ボタンを押し、応答結果の表示を見てください。サーバーで受けたデータをそのまま表示している部分にはテキストボックスに入力した <a href="about:blank" target="_blank">TEST</a> がそのまま表示されるはずがリンクになってませんか。
これはHTMLがあるデータ構造を持つものではなく、単なるテキストデータ中の特定の文字列でタグを表し、タグでデータ構造を表現しているためです。ブラウザ側の表示処理時にサーバーから送られてきたテキストデータを解析し、HTMLタグを表す文字列があるとそれはそのまま表示するのではなくHTMLタグとしての処理結果を表示することになります。
最初に作ったサーブレット(これの元のJSPでも同じ)ではテキストボックスに入力したデータをそのまま表示しようとしています。しかしテキストボックスにHTMLタグを入力したため、表示のときにHTMLタグと解釈されてしまったわけです。
今の場合は表示のときに <a href="about:blank" target="_blank">TEST</a> と、< と > を変換してやればHTMLタグとは解釈されなくなるので、期待通りに <a href="about:blank" target="_blank">TEST</a> が表示されます。
この例はHTMLタグと解釈される文字列の場合でしたが、JavaScriptやVBScriptと解釈される文字列を送ってしまうと、クライアント側が思わぬ動作をしてしまいます。そこで固定値以外の、何らかの媒体から入力したデータをクライアントに送信するときは、タグと解釈される文字列がないように、いくつかの文字を変換した結果を送信するようにしましょう。HTML超入門編の「特殊文字」でもちょっとだけ触れましたが、「少なくともこれだけは変換しておけば問題ないだろう」というものを挙げておきます。
次の演習課題からはこの文字列の変換を主題にしていきます。
送信時に変換すべき文字の例
表示したい文字
&
/
<
>
"
!
?
=
%
表示文字の文字列
&
/
<
>
"
!
?
=
%
・文字列変換のしかた
文字列のある部分を変更すると言っても「文字列の仕組み 」で説明したように、元の文字列のある部分を変更する、置き換えることは出来ません。
正確には元の文字列のある部分を変更した新しい文字列を生成する、ということになります。
このためのメソッドに replace メソッドがあり、 文字列.replace(元の文字, 置き換える文字) と書きます。メソッドの戻り値は変更後の新しい文字列です。
しかしこのメソッドの引数を見ると分かるように、これはあくまでも文字、char 型の置き換えだけです。この演習課題でやりたいのは例えば > という部分を < という文字列で置き換える、ということです。
この > も文字ではなく長さ1文字の文字列と考えると必要なのは、文字列のある部分文字列を別の文字列で置き換える、という機能です。
そのためのメソッドには replaceAll メソッドと replaceFirst メソッドがあります。 replaceAll メソッドの書き方は、
文字列.replaceAll(置き換え対象の部分文字列を表す正規表現, 置き換える文字列) となります。メソッドの戻り値は変更後の新しい文字列です。
この二つのメソッドの違いは、条件に合う部分(正規表現に合う部分)を全て置き換えるか(replaceAll )、条件に合う最初の部分だけを置き換えるか(replaceFirst )です。
文字列のある部分を変更すると、その度に新しい文字列が生成されるのでメモリ使用効率からいくと確かに無駄があります。もしメモリ効率を最優先させるなら String ではなく StringBuffer を使うなり、文字列ではなく文字の配列にするなりの作業が必要です。
しかしそうすると replaceAll 等のメソッドは使えないので自分で処理を作る必要があります。
その手間と実行効率を考えると、今回の要件程度ならたいしたデータ量を扱わないので、メモリ効率についてはJavaのガベージコレクションに任せたほうがいいでしょう。
(※ガベージコレクション:簡単に言うと使われなくなったメモリ領域を、自動的に回収して再使用可能にしてくれる機能)
このメソッドを使って上の表にある文字を置き換えてやればいいんですが、順番だけ注意してください。後から & 置き換えをすると、例えば先に > を > に置き換え済みの文字列に、さらに & の置き換えをしてしまうので &gt; になってしまいます。
今の演習課題には直接必要とはしませんが、ここで文字列( String クラス)のメソッドについて主なもの(たぶんよく使いそうなもの)について簡単に説明しておきます。実際のところ、Java2 SEドキュメントのAPI仕様を見たほうが早いのですが。
・文字列中の位置指定
いくつかのメソッドでは文字列中の部分文字列を指定することができます。先にそのときの位置指定方法を説明しておきます。
Javaでは文字列中の位置は相対指定 で指定します。つまり「先頭から何文字目か」という指定です。従って一番最初の文字の位置は、先頭から0番目ということで 0 になります。けっして1文字目だから1、ではありません。
Java言語は構文などC言語を受け継いでいる部分が多々あるんですが、これは「悪しき慣習」まで引継いだ気がします。直感的に1文字目は1、のほうが分かりやすいと思うんですがね。
この1文字目を指定するのに「先頭から0番目だから0」とするのは、どちらかというとアセンブラの発想です。
ちなみにもう少し先の方で説明するんですが、配列を使う場合の添え字も同じ考え方、つまり配列の1番目は1ではなく先頭から0番目だから0になります。つまり10個の要素がある配列の場合、指定可能な添え字は1〜10ではなく0〜9です。
Stringクラスの主なメソッド
メソッド
戻り値
引数(パラメータ)
説明
equals boolean
String 比較対象
引数で指定した文字列と等しいか比較する
length int
−
対象文字列の長さ(文字数)を返す
charAt char
int 位置
指定した位置にある文字を返す
substring String
int 開始位置
指定した開始位置から最後まで切り出した部分文字列を、新しい文字列として返す
substring String
int 開始位置, int 終了位置
指定した開始位置から、指定した終了位置の直前の文字までを切り出した部分文字列を、新しい文字列として返す(終了位置の文字は、切り出した部分文字列には含まれません)
trim String
−
対象文字列の先頭部分と最終部分の空白を取り除いた新しい文字列を返す
対象文字列の先頭部分と最終部分に空白が無かったときは、対象文字列自身を返す(対象文字列のコピーではありません)
toLowerCase String
−
対象文字列を小文字に変換した結果の新しい文字列を返す
toUpperCase String
−
対象文字列を大文字に変換した結果の新しい文字列を返す
replace String
char 置換対象文字, char 置換文字
文字列中にある置換対象文字を全て、置換文字で置換えた新しい文字列として返す
置換対象文字が無く一文字も置換えされなかったときは、対象文字列自身を返す
replaceAll String
String 置換対象の正規表現文字列, String 置換文字列
文字列中にある置換対象の正規表現に合う部分文字列を全て、置換文字列で置換えた新しい文字列として返す
replaceFirst String
String 置換対象の正規表現文字列, String 置換文字列
文字列中にある置換対象の正規表現に合う最初の部分文字列を、置換文字列で置換えた新しい文字列として返す
matches boolean
String 正規表現文字列
対象文字列が、引数の正規表現文字列で指定したパターンと合うか判定する
Pattern.matches(正規表現文字列, 検査対象文字列) と同じ結果になる
startsWith boolean
String 検査文字列
対象文字列の先頭が、引数の検査文字列と等しいか判定する
引数の検査文字列が null の場合も true になる
indexOf int
char 検索文字
文字列中で指定した検索文字が最初に現れる位置を返す
検索文字が無いときは-1が返る
char 検索文字, int 開始位置
文字列中で指定した検索文字が、指定した開始位置以降で最初に現れる位置を返す
検索文字が無いときは-1が返る
String 検索文字列
文字列中で指定した検索文字列が、指定した開始位置以降で最初に現れる位置を返す
検索文字列が無いときは-1が返る
String 検索文字列, int 開始位置
文字列中で指定した検索文字列が、指定した開始位置以降で最初に現れる位置を返す
検索文字列が無いときは-1が返る
それでは応答結果を返すときに文字列変換をする、課題にチャレンジしてみてください。テストをする際には、
・応答結果が返った画面でそのまま送信する
・テキストボックスに入力するときに " を含んだものを入れてみる
のパターンを忘れないでください。
とりあえずこのサンプル と似たような形になると思います。いままで説明してきた範疇では、そう違った組み方は出来ないと思いますので。