《今回はEclipseを使って開発を行う》
【入力パラメータの取得】
サーブレットの中で、ユーザが入力した値を取得↓
1.新規動的プロジェクトを作成
2.サーバに追加
3.サーバを起動
4.「WebContent」の中にJSPファイル作成
5.「Java Resources」の「src」の中にサーブレットファイル作成
6.「WEB-INF」の「web.xml」の中の接続させたいサーブレットクラスの<url-pattern>をformの「action=コンテキストパス/ここに指定」
*「web.xml」ファイルを変更した場合は必ずサーバ再起動!
1 |
<form action="<%=request.getContextPath() %>/EchoServlet"> |
*method=”GET / POST”を指定。
未定義の場合「GET」が定義されている。
<echo.jsp>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <h2>EchoServletの入力</h2> <form action="<%=request.getContextPath() %>/EchoServlet"> <input type="text" name="message"> <input type="submit"> </form> </body> </html> |
<EchoServlet.java>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
package input; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Servlet implementation class EchoServlet */ public class EchoServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); //取得した値の文字を再指定:文字化け防止 String msg = request.getParameter("message"); //パラメータの値取得:POSTもGETも同じ書き方。 response.setContentType("text/plain; charset=Windows-31J"); //以降記載する文字の形式を指定 PrintWriter out = response.getWriter(); out.println("message=" + msg); } } |
【パラメータの値を取得の引数は1つだけ指定(複数取得したい場合は下記コードを必要な分書く)】
1 |
getParameter("コントロールのnameの値>"); |
【複数のコントロールの名前の情報を一括取得】
1 2 3 4 |
//全ての入力パラメータの名前を取得し、Enumeration型として返す Enumeration<String> name = getParameterNames(); //入力パラメータの値の取得 String[] values = request.getParameterValues(name); |
【文字化け防止設定】
*後で「フィルタ」を紹介 → 複数のサーブレットクラスで共通実行させたい処理を指定すると便利(各ファイルで指定しなくて済むため)。
1.サーブレットファイル内に下記指定(フィルタに設定してない場合)
1 |
request.setCharacterEncoding("UTF-8"); |
2.「Servers」プロジェクトの「server.xml」のポート指定に下記追加 → サーバ再起動!
1 2 3 4 5 |
追加: useBodyEncodingForURI="true" 追加後の記述: <Connector connectionTimeout="20000" port="55000" protocol="HTTP/1.1" redirectPort="8443" useBodyEncodingForURI="true"/> |
【エンコード】・・・情報を符号化(デジタル化)すること。
*エンコードするハード・ソフト → エンコーダー、又は変換機・変換ソフトと呼ぶ
【デコード(復号)】・・・符号化されたデーターを元の情報に戻すこと。
*デコードするもの → デコーダー、又は別途プレイヤー・再生ソフト・受信機と呼ぶ。
【フィルタの利用】
*共通の処理を実行させる時に使用。
1.「Java Resources」の「src」の中にフィルタファイル作成
2.「WEB-INF」の「web.xml」の中の接続させたいサーブレットクラスの<url-pattern>をformの「action=コンテキストパス/ここに指定」
*「web.xml」ファイルを変更した場合は必ずサーバ再起動!
1 2 3 4 5 |
init() ・・・ サーバを初期化時に一度呼ばれる doFilter() ・・・ フィルタの処理を記述 destroy() ・・・ 終了時に一度呼ばれる |
<web.xml>
1 2 3 4 5 6 7 8 |
<filter> <filter-name>EncodingFilter</filter-name> <filter-class>jp.co.sss.struts30.filter.EncodingFilter</filter-class> </filter> <filter-mapping> <filter-name>EncodingFilter</filter-name> <url-pattern>/*</url-pattern> //全てのサーブレットにフィルタを実行する場合「/*」とする </filter-mapping> |
*フィルタのオン、オフ → 上記コードの<filter-mapping>タグをコメント/* */で囲む。
【画面遷移】
ディスパッチ・・・サーブレットの用語。別のプログラムに処理を依頼すること。
<処理の依頼(ディスパッチ)方法>
1 2 3 4 5 |
1.foward(フォワード)・・・依頼先に処理を丸投げ。 2.include(インクルード)・・・依頼先の処理結果を依頼元に渡す。(処理結果を要求する) 3.redirect (リダイレクト) ・・・ クライアントに「ここにアクセスしてください。」と一度ブラウザに処理を戻すことで画面遷移を行う(別サーバでの処理時など使用。) |
《fowardの実装例:サーブレット→サーブレット》
<ForwardServletA.java>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
package dispatch; import java.io.IOException; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class ForwardServletA extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("call ForwardServletA"); RequestDispatcher dispacher = request.getRequestDispatcher("/ForwardServletB"); dispacher.forward(request, response); //フォワードの実行 } } |
<ForwardServletB.java>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
package dispatch; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class ForwardServletB extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("call ForwardServletB"); response.setContentType("text/plain; charset=Windows-31J"); response.getWriter().println("ForwardServletBこんにちは"); //チェーンメソド:「.」でつないで記入。 } } |
《fowardの実装例:サーブレット→JSP》
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
package dispatch; import java.io.IOException; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class ForwardServlet2 extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { RequestDispatcher dispacher = request.getRequestDispatcher("/dispatch/foward_ok.jsp"); dispacher.forward(request, response); //フォワードの実行 } } |
<foward_ok.jsp>
1 2 3 4 5 6 7 8 9 10 11 12 |
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> フォワードされたJSPです。 </body> </html> |
関連記事
ピンバック: 研修Servlet 01:サーブレットの基本、MVCモデル – 原始人みかこのIT奮闘記
ピンバック: 研修Servlet 04: JSP、インクリード、スコープ、EL式、JSTL – 原始人みかこのIT奮闘記
ピンバック: 研修Servlet 02: JSP – 原始人みかこのIT奮闘記