java servlet

サーブレットとは、サーバー上で動くプログラム。
サーブレットをインストールするサーバーを、アプリケーションサーバーという。

全てのサーブレットは「javax.servlet」パッケージに含まれる「Servlet」インターフェースを実装する必要がある。
このインターフェースを実装しているのが「GenericServlet」クラスと「HttpServlet」クラス。
通常、このどちらかのクラスを継承して、サーブレットのクラスを作成する。

サーブレットはtomcatなどのコンテナが起動してから最初に呼び出されたときに
コンテナにロードされて、インスタンスが作られる。
アプリケーション1つに、1つのインスタンスしか作られない。なので変数は共有になるため、セッションなどを使わないと個別の設定はできない。
処理はスレッドを用いて複数をさばける。
コンテナが終了したり、一定時間サーブレットに対してアクセスがなかったら、インスタンスは破棄される。

サーブレットのコンパイル

javac -classpath %CATALINA_HOME%\lib\servlet-api.jar HelloWorld.java

doGet ウェブで入力された値を受け取る

public void doGet(HttpServletRequest request , HttpServletResponse response) throws IOException , ServletException{

}

このメソッドでWebで入力されて送られてきた情報を受け取ることができる。
JSPに、
<input type=”text” name=”aaaa”>

<select name=”aaaa”>
<option value=”book”>本</option>
<option value=”sports”>スポーツ</option>
</select>
などと、nameやvalueを設定することで
サーブレット内で
String str = request.GetParameter(“aaaa”);
などの記述をして、ユーザーの入力した値を受け取ることができる。

HTMLからサーブレットにデータを送るには

<form method=”post” action”aaaa.jsp”>
<input type=”submit” value=”送信”>
</form>
この記述で、データをaaaa.jspに送ることができる。
postとはデータの送信方法。postのほかに、getがある。
input type=”submit”で、送信ボタンを作って、それを押すことで送信ができる。

サーブレットからjspにデータを送る

jspに送るデータを保存する。
request.setAttribute(“データ名”, 値)
値は、ダブルコーテーションで囲んだ文字列や変数を使える。

jspにデータを保持したまま遷移する。
RequestDispatcher aaaa = request.getRequestDispatcher(“送信先.jps”);
aaaa.forward(request , response);
この移動の方法だと、URLの表示は変わらない。

jsp側で以下の記述をすれば、値を受け取れる。
<%
String str = request.getAttribute(“データ名”);
%>

リダイレクト

forwardのページ移動は、ブラウザに制御を戻さない?
リダイレクトは一度処理を終わらせてブラウザに制御を移した上で別ページに移動するらしい。リダイレクトはURLの表示も移動後のものに変わる。
response.sendRedirect(“URL”);

DBと接続する

DBと接続するには、まず、WEB-INFの中に「lib」というフォルダを作り、その中にMySQLのjdbcドライバを入れる。tomcatの「lib」ファイルの中でもOK?

ClassクラスのforNameメソッドを使う。
Class.forName(“com.mysql.jdbc.Driver”);
と書く。何をしているのかよくわからない。

次に、DriverManagerクラスで用意されているgetConnectionメソッドを使う。
Connection conn = null;
conn = DriverManager.getConnection(“URL”,”ユーザー名”,”パスワード”) throws SQLException

MySQLの場合、URLは以下の記述になる。
jdbc:mysql://サーバー名/データベース名
よくわからないけど、
jdbc:mysql://localhost/最初のDB?serverTimezone=JST
と、?以降の文字を入れないとエラーになった。
JSTは日本の時間らしい。サーバータイムゾーンとやらに正しい時間を入れないとエラーになる?

SQL文を実行するには、Statementオブジェクトが必要。
Statementとは、SQL文を実行して、結果を返してもらうオブジェクト。
Statementの作成は、なぜかConnectionインターフェースのcreateStatement()メソッドから行うらしい。
Statement stmt = conn.createStatement();
StatementのexecuteQuery()メソッドで、select文を実行し、結果を出す。
insert文、create文を実行するには、executeUpdate()メソッドを使う。

SQL文のselect文を実行した結果を受け取るには、ResultSetオブジェクトが必要。
ResultSet rs = stmt.executeQuery(“SQL文”);
ResultSetオブジェクトは、カーソルを持っていて、それを使って結果を1行1行参照できる。カーソルは最初は先頭のさらに上の行に位置しているので、先頭の値を参照したい場合は、先に+1する必要がある。
カーソルを先に進めるには、ResultSetのnext()メソッドを使う。
next()メソッドは、これ以上行がない場合はfalseを返すので、while文などの条件に使える。
while(rs.next()){}

rs = stmt.executeQuery(“select count(*) from テーブル名”);
としたら、rs.next()で1行進めた後で、rs.getString(1)でレコード数を取得できる。
ResultSetは、先頭の1つ上の行から始まるので、rs.next()で1行進めた後じゃないといけない。
rs.getString()で数字を引数に入れたら、何番目の項目をとるかという処理にできる。

編集画面
タイトルとURLをコピーしました