サーブレットとJSPのキホンのキ

# 記事の目的
サーブレットとJSPについて入門書を一通り読みましたが、数ヵ月もして久しぶりに触れると一切思い出すことができず、悲しくなりました。今回はそんな悲しい時にさらっと確認して元気になりたいという思いから、超基本的な内容を記事にまとめてみました。

# 目次
1. はじめに
1. サーブレットとは
1. JSPとは
1. サーブレットとJSPの役割
1. 参考文献


## はじめに
サーバサイドプログラミングの仕組みを実現する技術はいくつかあるが、Javaで開発する場合は、「サーブレット」と「JSP」を使用する。
JavaでWebアプリケーションを開発するには、サーブレットコンテナを持つアプリケーションサーバが必要。
（アプリケーションサーバの機能を提供するソフトウェアのことを「サーブレットコンテナ」、または単に「アプリケーションサーバ」と呼ぶこともある）


## サーブレットとは
サーブレットはJavaを使ってサーバサイドプログラムを作るための技術。
サーブレットクラスというクラスを開発することで、アプリケーションサーバ上でそれらを実行できる。
サーブレットクラスはブラウザからのリクエストによって実行され、その実行結果をHTMLで出力する。

```java:Demo.java
package controller;

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;

/**
 * Servlet implementation class Demo
 */
@WebServlet("/Demo")
public class Demo extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public Demo() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		response.getWriter().append("Served at: ").append(request.getContextPath());
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

```

├── Javaリソース/src 
  　　　　 └── servlet ─ Demo.jsp

ブラウザからリクエストが届くと、アプリケーションサーバはサーブレットクラスの`doGet()`を呼び出す。
パラメータとして渡される、

- `HttpServletRequest`はブラウザからの「リクエスト」
- `HttpServletResponse`はサーバから送り出す「レスポンス」
処理をしてから、HTML情報を`HttpServletResponse`でブラウザに送り返す。

ブラウザからサーブレットの呼び出しは、`@WebServlet("/Demo")` で定義してあげると`http://<サーバ名>/<アプリケーション名>/Demo`で実行できる。（`Web.xml`で設定することもできる）


## JSPとは
JSP（JavaServer Pages）はサーブレットと同じサーバサイドプログラムの技術。
JSPファイルが、リクエストされるとサーブレットクラスに変換される。
つまり、サーブレットクラスで行えることはJSPファイルでも行える。
違いは、JSPファイルを使用するとHTMLの出力が楽になるという点。

Eclipseを使用している場合、JSPファイルから生成されたサーブレットクラスは、ワークスペース内
`.metadata\.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\Demo101\org\apache\jsp`
の中に生成される。
ファイル名は、`demo.jsp` -> `demo_jsp.java`となる。

```java:demo.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

</body>
</html>
```

├── WebContent ─ demo.jsp
  　　　　 └── view ─ demo.jsp

JSPファイルの正体はサーブレットクラスだけど、扱いはHTMLファイルなのでWebContentの配下に保存することで
`http://localhost:8080/<アプリケーション名>/index.jsp`
`http://localhost:8080/<アプリケーション名>/view/index.jsp`
で実行できる。


## サーブレットとJSPの役割
Webアプリケーション開発（MVCモデル）において

- ユーザからの要求（リクエスト）を受けて全体の制御を行うコントローラは、サーブレットクラスが担当
- ユーザの要求に応える処理を行うモデルは、一般的なJavaクラスが担当
- 出力を行うビューはHTMLの出力を得意とするJSPファイルが担当
となります。

また、MVCモデルに従ってWebアプリケーションを作ると、ブラウザからのリクエストされるのは基本的にサーブレットクラスとなり、JSPファイルは直接呼び出されない想定である場合が多い。そんな時は、JSPファイルを`WebContent/WEB-INF`に置くと、直接リクエスト自体を禁止することができる。


JSPファイルの呼び出しは、サーブレットクラスから`RequestDispatcher`インスタンスの`forward()`メソッドで行う。

- JSPファイルの場合　-> /WebContentからのパス
- サーブレットクラスの場合　-> /URLパターン



<a id="#reference"></a>
# 参考文献
- スッキリわかるサーブレット＆JSP入門