第4章 クライアントへの出力(HttpServletResponse)
クライアントへの出力(HttpServletResponse)
homepage
# **クライアントへの出力(HttpServletResponse)** *** ## **1.HttpServletResponseインターフェース** サーブレットに対して「GET」メソッドでリクエストがあった場合に呼び出される「doGet」メソッドを見てください。 ``` import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class Sample extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException{ /* ... */ } } ``` <br> ## **2.HttpServletResponseインターフェースの定義とメソッド** 「HttpServletResponse」インターフェースは次のように定義されています。 ``` javax.servlet.http Interface HttpServletResponse public interface HttpServletResponse extends ServletResponse ``` 親インターフェースである「ServletResponse」インタフェースを継承しています。 「HttpServletResponse」インターフェースと「ServletResponse」インタフェースでは多くのメソッドが用意されています。 <br> ## **3.コンテンツタイプの設定(setContentType)** クライアントに対して何か出力するにあたってまず行うべき事はどのようなデータを送るのかを指定するコンテンツタイプの設定です。HTTPレスポンスヘッダの中の「Content-Type」を設定します。<br> **コンテンツタイプには次のような種類があります。** <table border="1"> <tr style="width:600px ;background-color:#C6E0B4 ;text-align:center;"> <th>種類</th> <th>拡張子</th> <th>Content-Type</th> </tr> <tr> <td>HTMLファイル</td> <td>html, htm</td> <td>text/html</td> </tr> <tr><td>テキストファイル</td><td>txt</td><td>text/plain</td></tr> <tr><td>GIF</td><td>gif</td><td>image/gif</td></tr> <tr><td>PNG</td><td>png</td><td>image/png</td></tr> <tr><td>Windows 実行ファイル</td><td>exe</td><td>application/octet-stream</td></tr> </table> クライアントは受け取ったデータのヘッダーに含まれるコンテンツタイプを見て、データをどのようにするかを処理するかを判別します。例えばブラウザに表示したり、ファイルに保存するかどうかを確認したり、といったことです。この挙動はブラウザやクライアント側の設定に依存します。 <br> コンテンツタイプを設定するには「HttpServletResponse」インターフェースの親インターフェースである「ServletResponse」インタフェースで定義されている「setContentType」メソッドを使います。 **setContentType** ``` public void setContentType(java.lang.String type) ``` 実際に使う場合には次のように記述します。 ``` import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class Sample extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException{ response.setContentType("text/html"); /* ... */ } } ``` またコンテンツタイプの中には含まれるデータの文字セットを合わせて指定できるものがあります。例えばHTMLファイルやテキストファイルです。文字コードを合わせて指定する場合には次のように「charset=」の後に文字コードを記述します。 ``` response.setContentType("text/html;charset=UTF-8"); ``` <br> ## **4.setCharacterEncodingメソッド** 文字セットの指定には「HttpServletResponse」インターフェースの親インターフェースである「ServletResponse」インタフェースで定義されている「setCharacterEncoding」メソッドを使っても設定が可能です。 **setCharacterEncoding** ``` public void setCharacterEncoding(java.lang.String charset) ``` 使い方としては次のようになります。 ``` response.setContentType("text/html"); response.setCharacterEncoding("UTF-8"); ``` これは次のように記述した場合とまったく同じです。 ``` response.setContentType("text/html;charset=UTF-8"); ``` 日本語の場合、charset=UTF-8、中国の場合、charset=GB2312を設定します。 <br> ## **5.文字出力用のストリームの取得(getWriter)** コンテンツタイプを設定したら、クライアントに対してデータ本文を送ります。データを送信するには出力用のストリームを取得し、そのストリームに書き出していきます。 出力ストリームを取得するには「HttpServletResponse」インターフェースの親インターフェースである「ServletResponse」インタフェースで定義されている「getWriter」メソッドを使います。 <br> **getWriter** ``` public java.io.PrintWriter getWriter() throws java.io.IOException ``` このメソッドによってクライアントに対して文字を出力するための「PrintWriter」クラスのオブジェクトを取得出来ます。使い方としては次の通りです。 ``` import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class Sample extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException{ response.setContentType("text/html"); PrintWriter out = response.getWriter(); /* ... */ } } ``` 「PrintWriter」クラスのオブジェクトは、文字を出力する時にコンテンツタイプに設定されている文字セットを使ってエンコーディングしていきます。そのため「getWriter」メソッドを実行する前に「setContentType」メソッド又は「setCharacterEncoding」メソッドで文字コードを設定しておく必要があります。 <br> ## **6.PrintWriterクラス** 「PrintWriter」クラスについても簡単に見ておきます。クラス定義は下記のようになっています。 ``` java.lang.Object java.io.Writer java.io.PrintWriter public class PrintWriter extends Writer ``` 主なメソッドは「print」メソッドと「println」メソッドです。この2つのメソッドの違いは文字を出力した後に改行するかどうかです。それぞれのメソッドの引数には各データ型に対応したものがそれぞれ用意されていますので、データ型を意識することなく利用できます。<br> またその他のメソッドとして「close」メソッドや「flush」メソッドなどがあります。 <br> **・「close」メソッド:** ``` public void close() ``` ストリームを閉じます。 <br> **・「flush」メソッド:** ``` public void flush() ``` ストリームをフラッシュします。 <br> ## **7.ステータスコードの設定(setStatus)** クライアントにレスポンスを返す際に、ステータスコードを設定しなかった場合にはデフォルトで「SC_OK」が設定されます。正常なデータを返す場合にはこのままで構いませんが他のステータスコードをクライアントに返す方法を確認します。 <br> ステータスコードを設定するには「HttpServletResponse」インターフェースで定義されている「setStatus」メソッドを使います。 **setStatus** ``` public void setStatus(int sc) ``` このメソッドを使う場合はエラーが発生せずに正常にデータが送信される場合に利用します。引数には「HttpServletResponse」インターフェースで定義されてる定数を使用します。一部を抜粋すると次のようなものがあります。 <table border="1"> <tr style="width:600px ;background-color:#C6E0B4 ;text-align:center;"> <th>コード</th> <th>定数</th> <th>意味</th> </tr> <tr><td>200</td><td>SC_OK</td><td>成功</td></tr> <tr><td>404</td><td>SC_NOT_FOUND</td><td>見つかりません</td></tr> <tr><td>500</td><td>SC_INTERNAL_SERVER_ERROR</td><td>サーバ側のエラー</td></tr> </table> 「setStatus」メソッドを使ってスタータスコードの設定を行った場合、画面に表示する内容は別途作成する必要があります。 <br> ## **8.リダイレクトの設定(sendRedirect)** ステータスコードとLocationヘッダーの設定によってURLを転送させる事が出来ますが、リダイレクト用のメソッドが別途用意されているのでそれを利用することでも他のページへ転送させる事が出来ます。 <br> リダイレクトを設定するには「HttpServletResponse」インターフェースで定義されている「sendRedirect」メソッドを使います。 **sendRedirect** ``` public void sendRedirect(java.lang.String location) throws java.io.IOException ``` 引数にリダイレクト先のURLを指定します。URLは絶対パスの他に相対パスでの指定も可能です。 クライアント側のフォームで指定したURLへリダイレクトするようにします。<br> リダイレクト先を選択するフォームが含まれるHTMLページは、次のようなものです。<br> #### **例** **ResponseSample.html** ``` <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>サンプル</title> </head> <body> <p>リダイレクト先の設定</p> <form action="ResponseSample" method="get"> <table> <tr> <td>リダイレクト先の選択</td> <td><select name="url" size="2"> <option value="www.yahoo.co.jp">YAHOO</option> <option value="www.google.co.jp">GOOGLE</option> </select></td> </tr> </table> <input type="submit" name="button1" value="送信"> </form> </body> </html> ``` **ResponseSample.java** ``` package hello; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/ResponseSample") public class ResponseSample extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { response.setContentType("text/html; charset=UTF-8"); String tmp; String url = ""; tmp = request.getParameter("url"); if (tmp == null || tmp.length() == 0) { url = "http://www.excite.co.jp/"; } else { url = "http://" + tmp; } response.sendRedirect(url); } } ``` #### **実行結果** <!--graph4-1.png --> <img src="https://i.loli.net/2019/06/27/5d1476cddf5dc18693.png" width="40%"/>
content
戻る