Servlet

Servletとは

Java Servlet(Servlet)は、Webサーバで動作するJavaプログラムで 「HttpServlet」クラスを継承して作成します。

Servletの役割

JSPはHTMLを出力する(View)には便利ですが、データ処理(Model)や複雑なロジック処理(Controller、Service)には向いていません。HTTPリクエスト処理はServletで処理する、MVCで設計するのが良いとされています。

  • JSP:結果表示処理(View)
  • Servlet:HTTPリクエスト処理(Controller)

JavaのMVC

MVCでは、Servletは「Controller」、JSPは「View」として設計します。また、JavaでMVC開発するには、Webフレームワークを利用するのが一般的です。

HttpServlet

「HttpServlet」クラス継承

「HttpServlet」クラスを継承すると、Webのリクエスト&レスポンスに関する処理が利用できます。

HTTPリクエストメソッド

「HttpServlet」を利用すると、HTTPメソッド(GETやPOST)によるデータ取得ができるようになります。HTTPリクエストのメソッドは以下の種類があり、「do」ではじまるメソッド名になっています。

HTTPメソッド Servletメソッド
GET doGet()
POST doPost()
DELETE doDelete()
PUT doPut()
HEAD doHead()
TRACE doTrace()
OPTIONS doOptions()

GET/POSTリクエストメソッド

GETリクエストはdoGet() 、POSTリクエストはdoPost()で処理します。

public class クラス名 extends HttpServlet {

    //GETリクエスト
	protected void doGet(HttpServletRequest request, HttpServletResponse response) 
		throws ServletException, IOException {
		//GETリクエストの処理
	}

    //POSTリクエスト
	protected void doPost(HttpServletRequest request, HttpServletResponse response) 
		throws ServletException, IOException {
		//POSTリクエストの処理
	}

}

Servlet作成

Servletファイルを作成してみましょう。

Servletファイル作成

「ファイル > 新規 > その他...」を選択します。

ショートカットキー

新規ファイル作成は、ショートカットキーを利用すると便利です。

  • Windows:Ctrl + N
  • Mac:Cmd + N

サーブレット選択

「Web > サーブレット」を選択して【次へ】を選択します。ウィザード欄に「サーブレット」を入力して絞り込みむとよいでしょう。

サーブレットファイル設定

Javaパッケージ「sample」、クラス名「Hello」を入力して、【次へ】をクリックします。

【次へ】をクリックします。

そのまま【次へ】をクリックします。

この画面では自動挿入するHTTPメソッドを選択できますが、「doGet」「doPost」をチェックしたまま【完了】をクリックします。

「Hello」クラスが作成されました。doGet()、doPost()メソッドが自動挿入されています。

マッピング

サーブレットマッピングとは

サーブレットマッピングは、クライアントからのリクエストからServletを動かすための設定です。サーブレットマッピングは、ルーティングとも呼ばれ、2つの設定方法があります。

  • web.xmlで設定
  • WebServletアノテーション

URLとサーブレットマッピング(ルーティング)

クライアントがリクエストしたURLは、WebルートURLパターンで構成されます。

ルーティングURL

http://ホスト名:ポート番号/コンテキストルート/URLパターン

web.xmlマッピング

「web.xml」でのマッピングは、XMLフォーマットでServletの設定をします。

サーブレットの設定

サーブレット全体は、servletタグに記述します。servlet-nameタグに「サーブレット名」、servlet-classタグにServletファイルの「クラスパス」を設定します。

  <servlet>
  	<servlet-name>サーブレット名</servlet-name>
  	<servlet-class>クラスファイルパス</servlet-class>
  </servlet> 

マッピングの設定

マッピングはservlet-mappingタグに記述します。url-patternタグに「URLパターン」を設定し、「サーブレット名」と紐づけます。

<servlet-mapping>
  	<servlet-name>サーブレット名</servlet-name>
  	<url-pattern>URLパス</url-pattern>  
</servlet-mapping>

URLパターンの設定例

「Hello」サーブレットにURLパターン「/hello」でアクセスする場合です。

ルーティングURL

http://localhost:8080/SampleJSP/hello
  • コンテキストルート:SampleJSP
  • URLパターン:/hello

サーブレットクラス

サーブレットクラスは「Hello」とします。

マッピング(XML)

「web.xml」で、Servletファイル「Hello」をURLパターン「/hello」でマッピングします。

web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
  <display-name>SampleJSP</display-name>
  <servlet>
  	<servlet-name>hello-servlet</servlet-name>
  	<servlet-class>sample.Hello</servlet-class>
  </servlet> 
  
  <servlet-mapping>
  	<servlet-name>hello-servlet</servlet-name>
	<url-pattern>/hello</url-pattern>  
  </servlet-mapping>
</web-app>
  • サーブレット名:hello-servlet
  • サーブレットクラス:sample.Hello

アノテーションマッピング

各サーブレットファイルにアノテーションを指定してマッピングができます。アノテーションを使うと「web.xml」の設定なしで、Servletをマッピングできるのでシンプルです。

WebServletアノテーション

アノテーションでのマッピングは、@WebServletにURLパターンなどを設定します。

@WebServlet(URLパターン)

URLパターンの設定例

「Hello」サーブレットにURLパターン「/hello」でアクセスする場合です。

ルーティングURL

http://localhost:8080/SampleJSP/hello
  • コンテキストルート:SampleJSP
  • URLパターン:/hello

アノテーションの指定

@WebServletに「/hello」を指定します。

Hello.java
@WebServlet("/hello")
public class Hello extends HttpServlet {
    ...
}

GETリクエスト

Servletによる、GETリクエスト処理を実装してみましょう。URLパターン「/hello」でリクエストされた場合です。

http://localhost:8080/SampleJSP/hello

アノテーションの設定

「Hello」サーブレットの、WebServletアノテーションを「/hello」に修正します。

Hello.java
@WebServlet("/hello")
public class Hello extends HttpServlet {

}

GETリクエスト処理

doGet()で文字出力

GETリクエストされたときに「Hello, servlet」を表示するよう修正します。

Hello.java
	protected void doGet(HttpServletRequest request, HttpServletResponse response) 
		throws ServletException, IOException {
        //responseオブジェクトで処理
		response.getWriter().append("Hello, servlet");
	}

responseオブジェクト

「response」は、サーバレスポンス用のオブジェクトです。response.getWriter() はブラウザに文字列を出力するメソッドです。

response.getWriter().append(値);

ブラウザで確認

ブラウザで「/hello」にアクセスして確認してみましょう。

演習

問題1

クライアントからのリクエストとServletを紐づける設定をなんといいますか?

1)GETリクエスト

2)POSTリクエスト

3)マッピング

4)サーブレットクラス

問題2

Tomcatサーバーで、コンテキストルート「Shop」、URLパターン「item」のURLはどれですか?

1)http://localhost:8080/item/Shop

2)http://localhost:8080/Shop/item

3)http://localhost:8080/item/Shop/

4)http://localhost:8080/Shop/item/

問題3

ServletでPOSTリクエストのメソッドはどれですか?

1)protected void doGet(HttpServletRequest request, HttpServletResponse response) { }

2)protected void doPost(HttpServletRequest request, HttpServletResponse response) { }

3)protected void post(HttpServletRequest request, HttpServletResponse response) { }

4)protected void get(HttpServletRequest request, HttpServletResponse response) { }

問題4

HttpServletで、URLパターンを指定するアノテーションはどれですか?

1)@Override("list")

1)@URL("list")

1)@Pattern("list")

4)@HttpServlet("list")

TomcatでつくるWebアプリ