□技術メモ - JAVA Servlet(詳細) ※管理人の個人的な技術メモです。このページの内容の実行結果について 管理人はいかなる責任も負いかねますのでご自身の責任でお試しください。 ----------------------------------------------------------- ○
・入力フォームを表示する。内部には



---- ※IEとChromeでは仕様が違うらしい。 IEは縦方向のスクロールバー表示になり、Chromeでは右下のサイズ変更つまみでareaのサイズを変更できる。 ================ ○リクエストからの値の取得 ・単数の場合と複数の場合がある String title = request.getParameter("title"); String val[] = request.getParameterValues("val"); ○全てのパラメータ名の取得 Enumeration names = req.getParameterNames(); while (names.hasMoreElements()) { String strBuf = String.valueOf(names.nextElement()); } ○全てのヘッダ名と値を取得する Enumeration heads = req.getHeaderNames(); while (heads.hasMoreElements()) { String strBuf = String.valueOf(heads.nextElement()); String strVal = String.valueOf(req.getHeader(strBuf)); //値が複数の場合は Enumeration getHeaderNames() を使用する } ○GETで日本語を送信する際に文字化けを回避する ・フォームからGETで日本語を送信する場合、POSTと同じ記述をすると文字化けします。 ・Tomcat5.xより、FORMのGETメソッドに対して、サーブレット側でのsetCharacterEncodingは無効になっています。 ・Tomcatの server.xml において、useBodyEncodingForURI="true"の追加が必要。(2015/02/06記) -------- -------- ・getBytesで文字化けを回避すること。 -------- String s_buf = req.getParameter(パラメータ名); byte[] byteData = s_buf.getBytes("ISO_8859_1"); //ISO_8859_1(Latin-1とも呼ぶ)は、URLで使用されている文字コード String s_val = new String(byteData, "Windows-31J"); -------- ・getParameterのnull判定を入れた場合 -------- String s_buf = req.getParameter(パラメータ名); String s_val = ""; if (s_buf != NULL) { s_val = new String(s_buf.getBytes("ISO_8859_1"), "Windows-31J"); } -------- ※注意 Shift_JISの文字コードについて Shift_JISは、MSがCP932という名称を付けて、メーカーごとに独自の拡張を許していた。これがいわゆる環境依存文字。(win/mac間の機種依存文字など) その後CP932は統一された。これに対するIANA登録名がWindows-31J。Javaにおける名称がMS932。 Windows-31Jで定義されている文字がShift_JISにはないため文字化けが起こることがある。その場合はWindows-31Jを使用すること。 ○ソースファイルが UTF-8 だと、javac のコンパイルでエラーになる ・Javacは、ソースがMS932(Windows-31Jと同じ)であることを前提としている。 MS932以外を使用する場合は以下のoptionが必要。 javac -encoding UTF-8 ソース名 ○画面遷移 ( sendRedirect / getRequestDispacher / Locationヘッダ / MetaタグによるRefresh / hrefによるリンク先指定 ) ・画面遷移の方法は、sendRedirect(リダイレクト)と、getRequestDispacher(フォワード)がある (1) Response.sendRedirect()によるリダイレクトは、サーバ外に遷移できるが、requestを引き継ぐことができない。 response.sendRedirect("遷移先URL"); (2) RequestDispatcher.forward()によるフォワードは、サーバ内の遷移に限られるが、requestを引き継ぐことができる。 ---- RequestDispatcher dspt = req.getRequestDispatcher("/result.jsp"); //JSPを呼ぶ dspt.forward(req, res); //フォワードによる画面遷移 ---- (3) Locationヘッダを指定した場合もリダイレクトされる。 ---- res.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY); //SC_MOVED_PERMANENTLY または SC_MOVED_TEMPORARILY の指定が必要 res.setHeader("Location", "http://3rd.geocities.jp/tnoguchislg/"); //ヘッダにLocationを指定した場合 ---- (4) Metaタグを使用した場合は遷移するまでの時間を指定できる。 //10秒後に移動する (5) アンカー ( hrefによるリンク先指定 ) その他 //target="_blank"を指定した場合は新規ページで開く //イメージボタンを使用する場合 ================ ○METAタグ (1) ・METAとは、後から追加するというような意味、EQUIVは該当するという意味。HTTPヘッダを設定した場合と同じ働きをする。 ・ は、HTTPヘッダに Refresh: URL=xxxx と指定したのと同じ意味。 (2) ・検索エンジンに情報を与える。 ・ //検索結果における簡単なページの説明欄に表示される ・ //著作権情報を書く。個人ならハンドルネーム等。法人なら法人名等。 ・ //検索エンジン向けキーワード。ただし最近の検索エンジンはほとんど無視するらしい。 ・ //ツールなどがページを生成した場合にセットされる。自分で記述してはいけない。 ================ ○HttpServletRequest における各種パスの取得 StringBuffer getRequestURL クライアントがこのリクエストを生成するのに使ったURLを返す。ただしGETパラメータは含まない。 StringBufferを返すのでリダイレクトメッセージやエラー報告のURLを簡単に作成できる。 String getRequestURI URIを返す。スキームとホスト名は返さない。 String getServletPath "/"で始まり、サーブレット名もしくはサーブレットへのパスを返す(CGI変数の SCRIPT_NAME と同じ値) 例: ブラウザのURL表示 : http://localhost:8080/u05/getPathEtc?txt=txtval getRequestURL : http://localhost:8080/u05/getPathEtc getRequestURL : /u05/getPathEtc getServletPath : /getPathEtc ○HttpServletRequest における呼び出しに関する情報の取得 String getScheme スキームを取得する。httpsならSSL通信と判断できる。 String getProtocol プロトコルバージョンが違う場合に行う処理がある場合などに使用する。 String getMethod HTTPメソッド名(GET,POSTなど)を取得する。 例: ブラウザのURL表示 : http://localhost:8080/u05/getPathEtc?txt=txtval getScheme : http getProtocol : HTTP/1.1 getMethod : GET ○HttpServletRequest における基本的なメソッド(上記以外) ====> ServletRequestより継承 void setCharacterEncoding(エンコード名) パラメータのエンコード方式を指定する。ただしPOSTメソッドの場合のみ。 GETメソッドではgetBytesによるエンコードを行うこと。 String getCharacterEncodeing() エンコード名の取得 Enumeration getParameterNames() Requestの全てのパラメータを取得する String getParameter(para) パタメータ名に対する値を取得する(単数) String[] getParameterValues(para) パタメータ名に対する値を取得する(複数) void setAttribute(name, object) アトリビュートをセットする object getAttribute(name) アトリビュートをゲットする <==== Enumeration getHeaderNames() Requestの全てのヘッダ名を取得する String getHeader(para) パタメータ名に対する値を取得する(単数) String[] getHeaders(para) パタメータ名に対する値を取得する(複数) RequestDispatcher getRequestDispatcher(コンテキストルートからの相対パス) RequestDispatcher.forward()によりフォワードによる画面遷移を行う。 (例) RequestDispatcher dspt = req.getRequestDispatcher("/getTrainNames2"); //コンテキスト内のJSPまたはサーブレット dspt.forward(req, res); //フォワードによる画面遷移 ○URLパターンの優先順位 ・WEB.XMLにおけるURLパターンマッピングは以下の優先順位が適用される。 (例) ユニークなパス /dir1/dir2/form.html // パスが完全一致している場合 パスマッピング /dir1/dir2/* // /dir1/dir2 まで一致している場合 //拡張子マッピング /*.html // 拡張子のみ一致。Tomcat 8.0 で使用するとエラーになる デフォルトマッピング / // 上記以外 ○Cookieによるセッション管理 ・Cookieを使用できない場合はURLを使う(URLRewriting) (調査中) ================