サーブレット入門

サーブレット入門

私たちががwebサイトを見るとき、実は内部では以下のような過程が行われている。
クライアントであるwebブラウザはwebサーバーにhttpリクエストを送る。そしてそのリクエストをもとにサーバーからデータを収集し、レスポンスを返しているのである。
仕組みを図解すると以下のようになる。 f:id:mmmnn1257:20170313231715p:plain

サーブレット

サーブレットとはアプリケーションサーバー内で動くjavaクラスのことである。サーブレット単独で動くことはできず制御する実行環境上(サーブレットコンテナ)で動く。
ユーザーが作るサーブレットは、servletインタフェースを直接は実装せずHttp.Servletクラスを継承する形をとる。

httpリクエスト

httpリクエストは、クライアントからサーバー側に送られる要求のことである。httpリクエストは以下のような構成になっている。

f:id:mmmnn1257:20170320184305p:plain
1行目はリクエストラインである。サーバーに要求する情報で、メソッド、リクエストURL、プロトコルバージョンで構成されている。

GET / HTTP/1.1

httpのバージョン1.1で通信を行い、/というURLに対して情報を取得(GET)したいという要求である。

GETとPOST

GETとPOSTはクライアントからサーバーに情報を送信したりするときに使用するメソッドである。HttpServletクラスにあるdoPost()・doGet()メソッドをオーバーライドしてサーブレットから呼び出す。 両者の違いは以下のようなところにある。

GETを使用して情報を送信:URLに付与する形でリクエストパラメータを送信する。URLの後ろに?を付け、名前=値の順番で記述する。
またクライアントがwebページの情報をサーバーに要求するだけの場合は基本的にGETを用いる。
POSTを使用して情報を送信:入力フォームを使用して送信する。

サーブレット側に送信されたリクエストパラメーターを取得するときはgetParameter(String name)メソッドを使用する。

httpレスポンス

HttpServletResponseオブジェクトはhttpレスポンスを表現しており、httpレスポンスは以下のような構成になっている。
f:id:mmmnn1257:20170321113914p:plain
レスポンスでhtmlを返却する場合はボディ部にhtmlが格納される。
setContentType(String type)メソッドを使用することで返却するレスポンスのコンテントタイプを指定することができる。

コンテントタイプの指定

package sample;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.ws.RespectBinding;

@WebServlet("/names")
public class NameSarvlet extends HttpServlet {

    @Override
    protected void doGet(HttpSevletRequest req,HttpServletResponse resp)throws ServletException, IOException{
    
    List<String> names = Arrays.asList("John","Paul","George","Ringo");
    
    resp.setContentType("text/html; charset=UTF-8");
    
    PrintWriter out = resp.getWriter();
    out.println("<html>");
    out.println("<head><title>Names</title></head>");
    out.println("<body>");
    out.println("<ul>");
    
    for(String name : names){
        out.println(<"li"> + name + </li"">);
    }
    
    out.println("</ul>");
    out.println("</body>");
    out.println("</html>");
}
}
@WebServlet("/names")
public class NameSarvlet extends HttpServlet {

1行目ではnamesという名前のサーブレットを作成するということを表している。この名前はURLに関連した名前である。
2行目でNameSarvletクラスはHttpServletクラスを継承している。

@Override
    protected void doGet(HttpSevletRequest req,HttpServletResponse resp)throws ServletException, IOException{

HttpServletクラスのdoGet();メソッドをオーバーライドしている。
doGetメソッドでは、サーブレットがクライアントに返すレスポンス内容を含むHttpServletResponseオブジェクトを生成している。

resp.setContentType("text/html; charset=UTF-8");

setContentTypeの引数には文字列でテキストタイプを指定する。

PrintWriter out = resp.getWriter();

レスポンスのボディ部にテキストデータを出力するためにgetWriter();メソッドからPrintWriterオブジェクトを取得する。

out.println("<html>");
out.println("<head><title>Names</title></head>");
out.println("<body>");
out.println("<ul>");
:

PrintWriterオブジェクトに対してHTMLを出力している。結果としてHTMLがレスポンスボディに格納されることになる。