□技術メモ - JAVA Servlet JSP(サンプル)
※管理人の個人的な技術メモです。このページの内容の実行結果について
管理人はいかなる責任も負いかねますのでご自身の責任でお試しください。
-----------------------------------------------------------
○サーブレット(クライアント画面情報を取得する)
・ルートフォルダは C:/servlet/train
・Tomcat6.0\conf\train.xml において、docBase="C:/servlet/train" を設定
・C:/servlet/train/ ←form.htmlを配置
・C:/servlet/train/WEB-INF ←web.xmlを配置
・C:/servlet/train/WEB-INF/classes ←getTrainNames.classを配置
・localhost:8080/train/form.htmlで開始
・タイトルを入力、checkboxをいくつかチェックして送信をclickすると、サーブレットがClient画面情報を取得して
次の画面に表示させます。
--------
web.xml
...
getTrainNames
getTrainNames
getTrainNames
/getTrainNames
...
--------
form.html
--------
getTrainNames.java
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class getTrainNames extends HttpServlet {
public void doPost(
HttpServletRequest req,
HttpServletResponse res)
throws ServletException, IOException {
res.setContentType("text/html; charset=Windows-31J"); //レスポンスのエンコード
req.setCharacterEncoding("Windows-31J"); //リクエストのエンコード
PrintWriter out = res.getWriter(); //Writerの取得
Enumeration names=req.getParameterNames();
String s_title = req.getParameter("title1"); //title1の取得
String s_train[] = req.getParameterValues("train"); //train(複数)の取得
out.println("");
out.println("");
out.println("----タイトル:" + s_title + "
");
for (int i=0; i");
}
out.println("----パラメータ一覧
\n");
while(names.hasMoreElements()) {
out.println(names.nextElement() + "
");
}
out.println("/");
out.println("/");
}
}
--------
○サーブレット(ステータス別の画面を表示する)
・指定のURLの取得結果がForbiddenやNotFound等の場合はそれに該当するステータスをサーバは返す。
そのステータス別の画面を表示する。
・操作方法:正常系と異常系のリストから1つを選択して送信をクリックする。
・正常系の場合はステータスに該当するhtml画面をservletが生成して表示する。
・異常系の場合はresponce.sendError()メソッドによりエラー画面が呼び出される。
・localhost:8080/train3/form.html で開始
・コンボの選択はResetでクリアできる。
(※注意)
・異常系を選択するとエラー画面になるが、エラーではない。
サーブレットにより意図的にエラー画面を呼び出していることに注意。
--------
form.html
--------
setStatus.java
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class setStatus extends HttpServlet {
public void doGet(
HttpServletRequest req,
HttpServletResponse res)
throws ServletException, IOException {
res.setContentType("text/html; charset=Windows-31J"); //レスポンスのエンコード
req.setCharacterEncoding("Windows-31J"); //リクエストのエンコード
PrintWriter out = res.getWriter(); //Writerの取得
String strBuf = "";
//パラメータの取得
String stcd = req.getParameter("stcd");
String errcd = req.getParameter("errcd");
//先にエラー判定
if (errcd != null) {
if (stcd.equals("403")) { res.sendError(HttpServletResponce.SC_FORBIDDEN, "SC_FORBIDDEN"); }
if (stcd.equals("404")) { res.sendError(HttpServletResponce.SC_NOT_FOUND, "SC_NOT_FOUND"); }
if (stcd.equals("500")) { res.sendError(HttpServletResponce.SC_INTERNAL_SERVER_ERROR, "SC_INTERNAL_SERVER_ERROR"); }
if (stcd.equals("503")) { res.sendError(HttpServletResponce.SC_SERVER_UNAVAILABLE, "SC_SERVER_UNAVAILABLE"); }
} else if (stcd != null) {
if (stcd.equals("200")) { strBuf=createHtml("200:SC_OK"); }
if (stcd.equals("204")) { strBuf=createHtml("204:SC_NO_CONTENT"); }
if (stcd.equals("301")) { strBuf=createHtml("301:SC_MOVED_PERMANENTLY"); }
if (stcd.equals("302")) { strBuf=createHtml("302:SC_MOVED_TEMPORARILY"); }
out.println(strBuf); //標準出力
out.close();
} else {
res.sendRedirect("http://localhost:8080/train3/form.html");
}
}
//----正常系画面の生成
protected String createHtml(String stcd) {
StringBuffer sb = new StringBuffer(); //sbで作成する
sb.append("\n");
sb.append("正常終了\m");
sb.append("\n");
sb.append("戻る
\n");
sb.append("stcd +
\n");
sb.append("\n");
sb.append("\n");
return (new String(sb));
}
}
--------
○サーブレット(JSPによる表示)
・上記の例ではservletがhtml画面を生成していたが、事前にJSPを用意して表示する方法が推奨されている。
・ステータスコードの意味をservletで取得しているので、これをJSPに渡している。
・requestに新たなパラメータを追加することはできないが、attributeとして付加情報を追加することができる。
setAttributeで格納、getAttributeで取得できる。
・localhost:8080/train4/form.html で開始
--------
form.html
1つ前のsampleと同じ
--------
result.jsp
<%@page language="java" contentType="text/html; charset=Windows-31J" //コンテンツをWindows-31Jにエンコードして出力
pageEncoding="Windows-31J"%> //JSPファイル作成時の文字コード WindowsならWindows-31J
StatusCode
戻る
<%
String s_st = (String)request.getAttribute("stdetail");
String s_err = (String)request.getAttribute("errdetail");
out.println(s_st + "
");
out.println(s_err + "
");
%>
--------
setStatus.java
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class setStatus extends HttpServlet {
public void doGet(
HttpServletRequest req,
HttpServletResponse res)
throws ServletException, IOException {
res.setContentType("text/html; charset=Windows-31J"); //レスポンスのエンコード
req.setCharacterEncoding("Windows-31J"); //リクエストのエンコード
PrintWriter out = res.getWriter(); //Writerの取得
String strBuf1 = "----";
String strBuf2 = "----";
//パラメータの取得
String stcd = req.getParameter("stcd");
String errcd = req.getParameter("errcd");
if (errcd != null) {
if (stcd.equals("403")) { strBuf1="403:SC_FORBIDDEN"); }
if (stcd.equals("404")) { strBuf1="404:SC_NOT_FOUND"); }
if (stcd.equals("500")) { strBuf1="500:SC_INTERNAL_SERVER_ERROR"); }
if (stcd.equals("503")) { strBuf1="503:SC_SERVER_UNAVAILABLE"); }
}
if (stcd != null) {
if (stcd.equals("200")) { strBuf2="200:SC_OK"); }
if (stcd.equals("204")) { strBuf2="204:SC_NO_CONTENT"); }
if (stcd.equals("301")) { strBuf2="301:SC_MOVED_PERMANENTLY"); }
if (stcd.equals("302")) { strBuf2="302:SC_MOVED_TEMPORARILY"); }
}
//----何もない場合
if (strbuf1.equals("----") && strbuf2.equals("----")) {
res.sendRedirect("http://localhost:8080/train4/form.html"); //リダイレクト
}
//----Locationヘッダでリダイレクトする
else if (strbuf2.substring(0,3).equals("301") {
res.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);
res.setHeader("Location", "http://3rd.geocities.jp/tnoguchislg/"); //ヘッダにLocationがある場合はリダイレクトされる。
}
//----Locationヘッダで相対パスに移動
else if (strbuf2.substring(0,3).equals("302") {
res.setStatus(HttpServletResponse.SC_MOVED_TEMPORARILY);
res.setHeader("Location", "/train4/form2.html"); //RFCでは絶対パスと定義されているが、最近のブラウザはほぼ対応しているらしい。
}
//----getRequestDispatcherでフォワードする
else {
req.setAttribute("stdetail" , strBuf1); //追加情報, getAttribute()で取り出し
req.setAttribute("errdetail" , strBuf2);
RequestDispatcher dspt = req.getRequestDispatcher("/result.jsp"); //JSPを呼ぶ
dspt.forward(req, res); //フォワードによる画面遷移
}
//リダイレクトもフォワードも即時に実行されるわけではない。
//リダイレクトのコードが実行された後に、フォワードが実行されるとエラーになる。
}
}
--------
○サーブレットを3通りの方法で呼び出す
・htmlはない。localhost:8080/train2/createFormsで開始。
・カウンタをインスタンス変数として持っていて、呼び出した回数を表示する。
・呼び出し方法は以下の通り。
アンカーによるリンクで現在と同じパスを呼び出す
GETメソッド
POSTメソッド
・以下の方法でも同じURLが呼び出される。
ブラウザにて同じURLでenter。同じURLが呼び出される。
F5更新。最新のコンテンスが更新されたか確認する。
Ctrl + F5更新。強制リロード。タイムスタンプが同じでも最新のコンテンツをリロードする。
○サーブレットのライフサイクルについて
・コンテナを起動→最初にサーブレットが呼ばれた時にインスタンスが生成され、init()が呼ばれる。
・ページを閉じてもインスタンスは破棄されない。
・2回目以降にページを開いた場合は、既にインスタンスがあるので起動時間を短縮できる。
・コンテナが終了したり、一定時間が経過した時にインスタンスが破棄され、destroy()が呼ばれる。
--------
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class createForms extends HttpServlet { //HttpServletの拡張
int count; //インスタンス変数
public void init() throws ServletException{
count = 0; //インスタンスに対して1度だけ実行
log("--------createFormsを起動しました");
}
public void destroy() {
//インスタンスが破棄される際に実行
log("呼出回数:" + count); // \Tomcat 6.0\logs\localhost.YYYY-MM-DD.log に出力
}
public void doGet(HttpServletRequest req, //getで呼ばれた時
HttpServletResponse res)
throws IOException, ServletException{
count++;
res.setContentType("text/html; charset=Shift_JIS");
PrintWriter out = res.getWriter();
out.println(createHtml("GET"));
out.close();
}
public void doPost(HttpServletRequest req, //postで呼ばれた時
HttpServletResponse res)
throws IOException, ServletException{
count++;
res.setContentType("text/html; charset=Shift_JIS");
PrintWriter out = res.getWriter();
out.println(createHtml("POST"));
out.close();
}
protected String createHtml(String typeMethod){
StringBuffer sb = new StringBuffer(); //sbで作成する
sb.append("3通りの方法で呼び出し");
sb.append("method:" + typeMethod + "
\n");
sb.append("呼出回数:" + count + "
\n");
sb.append("サーブレットを直接呼び出し
\n");
sb.append("");
sb.append("");
sb.append("\n");
return (new String(sb));
}
}