Javaサーブレットの紹介

1概要

この記事では、JavaでのWeb開発の中心的側面、つまりサーブレットについて説明します。

** 2サーブレットとコンテナ

**

簡単に言うと、サーブレットはリクエストを処理し、それらを処理し、そしてレスポンスで返答するクラスです。

たとえば、サーブレットを使用して、HTMLフォームを通じてユーザーからの入力を収集し、データベースからレコードを照会し、動的にWebページを作成することができます。

サーブレットは** __Servletコンテナと呼ばれる別のJavaアプリケーションの管理下にあります。

3. Mavenの依存関係

Webアプリケーションにサーブレットサポートを追加するには、 javax . servlet-api 依存関係が必要です。

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
</dependency>

最新のmaven依存関係はhttps://mvnrepository.com/artifact/javax.servlet/servlet-api[ここ]にあります。

もちろん、アプリをデプロイするサーブレットコンテナも設定する必要があります。 これは、TomcatにWARをデプロイする方法から始めるのに良い場所です

4サーブレットライフサイクル

サーブレットのライフサイクルを定義する一連のメソッドを見てみましょう。

** 4.1. その中に()

**

init メソッドは一度だけ呼び出されるように設計されています。サーブレットのインスタンスが存在しない場合、Webコンテナは次のことを行います。

  1. サーブレットクラスをロードします

  2. サーブレットクラスのインスタンスを作成します

  3. init メソッドを呼び出して初期化します

サーブレットが要求を受信するには、 init メソッドが正常に完了している必要があります。 init メソッドが ServletException をスローした場合、またはWebサーバーで定義された期間内に返されなかった場合、サーブレットコンテナはサーブレットをサービス状態にできません。

public void init() throws ServletException {
   //Initialization code like set up database etc....
}

** 4.2. サービス()

**

このメソッドは、サーブレットの__init()メソッドが正常に完了した後にのみ呼び出されます。

コンテナは service() メソッドを呼び出してクライアントからの要求を処理し、HTTP要求タイプ( GET POST PUT DELETE など)を解釈し、 doGet doPost doPut doDelete などを呼び出します。

適切な方法。

public void service(ServletRequest request, ServletResponse response)
  throws ServletException, IOException {
   //...
}

** 4.3. 破壊する()

**

サーブレットをサービス停止にするためにサーブレットコンテナによって呼び出されます。

このメソッドは、サーブレットの service メソッド内のすべてのスレッドが終了するか、タイムアウト期間が経過した後にのみ呼び出されます。コンテナはこのメソッドを呼び出した後、サーブレットで service メソッドを再度呼び出すことはありません。

public void destroy() {
   //
}

** 5サーブレットの例

**

  • フォームを使って情報を処理する完全な例を設定しましょう** 。

まず、フォームによってPOSTされた情報を取得し、http://docs.oracle.com/javaee/6/api/javax/servlet/RequestDispatcherを使用して結果を返すマッピング /calculateServlet を使用してサーブレットを定義しましょう。 html[RequestDispatcher]:

@WebServlet(name = "FormServlet", urlPatterns = "/calculateServlet")
public class FormServlet extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest request,
      HttpServletResponse response)
      throws ServletException, IOException {

        String height = request.getParameter("height");
        String weight = request.getParameter("weight");

        try {
            double bmi = calculateBMI(
              Double.parseDouble(weight),
              Double.parseDouble(height));

            request.setAttribute("bmi", bmi);
            response.setHeader("Test", "Success");
            response.setHeader("BMI", String.valueOf(bmi));

            RequestDispatcher dispatcher
              = request.getRequestDispatcher("index.jsp");
            dispatcher.forward(request, response);
        } catch (Exception e) {
            response.sendRedirect("index.jsp");
        }
    }

    private Double calculateBMI(Double weight, Double height) {
        return weight/(height **  height);
    }
}

上に示したように、http://docs.oracle.com/javaee/6/api/javax/servlet/annotation/WebServlet.html[ @WebServlet ]のアノテーションを付けたクラスはhttps://docs.oracle.com/を拡張する必要があります。 javaee/7/api/javax/servlet/http/HttpServlet.html[ javax.servlet.http.HttpServlet ]クラス。 @WebServlet 注釈は、Java EE 6以降でのみ使用可能であることに注意することが重要です。

@WebServlet 注釈は、デプロイ時にコンテナによって処理され、対応するサーブレットは指定された時点で使用可能になります。 URLパターン注釈を使用してURLパターンを定義することで、サーブレットマッピングに web.xml という名前のXMLデプロイメント記述子を使用することを避けることができることに注目する価値があります。

注釈なしでサーブレットをマッピングしたい場合は、代わりに従来の web.xml を使用できます。

<web-app ...>

    <servlet>
       <servlet-name>FormServlet</servlet-name>
       <servlet-class>com.root.FormServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>FormServlet</servlet-name>
        <url-pattern>/calculateServlet</url-pattern>
    </servlet-mapping>

</web-app>

次に、基本的なHTML form を作成しましょう。

<form name="bmiForm" action="calculateServlet" method="POST">
    <table>
        <tr>
            <td>Your Weight (kg) :</td>
            <td><input type="text" name="weight"/></td>
        </tr>
        <tr>
            <td>Your Height (m) :</td>
            <td><input type="text" name="height"/></td>
        </tr>
        <th><input type="submit" value="Submit" name="find"/></th>
        <th><input type="reset" value="Reset" name="reset"/></th>
    </table>
    <h2>${bmi}</h2>
</form>

最後に、すべてが期待通りに機能することを確認するために、簡単なテストも書きましょう

public class FormServletLiveTest {

    @Test
    public void whenPostRequestUsingHttpClient__thenCorrect()
      throws Exception {

        HttpClient client = new DefaultHttpClient();
        HttpPost method = new HttpPost(
          "http://localhost:8080/calculateServlet");

        List<BasicNameValuePair> nvps = new ArrayList<>();
        nvps.add(new BasicNameValuePair("height", String.valueOf(2)));
        nvps.add(new BasicNameValuePair("weight", String.valueOf(80)));

        method.setEntity(new UrlEncodedFormEntity(nvps));
        HttpResponse httpResponse = client.execute(method);

        assertEquals("Success", httpResponse
          .getHeaders("Test")[0].getValue());
        assertEquals("20.0", httpResponse
          .getHeaders("BMI")[0].getValue());
    }
}

** 6. サーブレット、HttpServlet、およびJSP

**

サーブレットテクノロジはHTTPプロトコルに限定されないことを理解することが重要です。

実際にはほとんどの場合そうですが、 Servlet は汎用インタフェースで、 HttpServlet は、 doGet doPost などのHTTP固有のサポートを追加したものです。

最後に、サーブレットテクノロジは、 JSP - JavaServer Pages 、Spring MVCなど、他の多くのWebテクノロジの主な推進力でもあります。

7. 結論

この簡単な記事では、Java Webアプリケーションにおけるサーブレットの基礎を紹介しました。

サンプルプロジェクトはhttps://github.com/eugenp/tutorials/tree/master/javax-servlets[GitHubプロジェクト]のようにダウンロードして実行できます。