Javaサーブレットの紹介

Javaサーブレットの概要

1. 概要

この記事では、Java-サーブレットでのWeb開発の中核的な側面を見ていきます。

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

簡単に言えば、サーブレットは、リクエストを処理し、リクエストを処理し、レスポンスで返信するクラスです。

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

サーブレットは、Servlet Container.と呼ばれる別のJavaアプリケーションの制御下にあります。Webサーバーで実行されているアプリケーションがリクエスト,を受信すると、サーバーはリクエストをサーブレットコンテナに渡し、サーブレットコンテナはそれをターゲットに渡します。サーブレット。

3. Mavenの依存関係

Webアプリにサーブレットのサポートを追加するには、javaxservlet-apiの依存関係が必要です。


    javax.servlet
    javax.servlet-api
    3.1.0

最新のMaven依存関係はhereで見つけることができます。

もちろん、アプリをデプロイするサーブレットコンテナも設定する必要があります。 this is a good place to start on how to deploy a WAR on Tomcat

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

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

4.1. init()

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

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

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

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

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

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

4.2. service()

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

コンテナはservice()メソッドを呼び出してクライアントからのリクエストを処理し、HTTPリクエストタイプ(GETPOSTPUTDELETEなど)を解釈します。 )そしてdoGetdoPostdoPutdoDeleteなどを呼び出します。 適切なメソッド。

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

4.3. destroy()

サーブレットをサービスから外すために、サーブレットコンテナによって呼び出されます。

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

public void destroy() {
    //
}

5. サーブレットの例

フォームを使用して情報を処理するLet’s now setup a full example

まず、フォームによってPOSTされた情報をキャプチャし、RequestDispatcherを使用して結果を返すマッピング/calculateServletを使用してサーブレットを定義しましょう。

@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);
    }
}

上に示したように、@WebServletアノテーションが付けられたクラスは、javax.servlet.http.HttpServletクラスを拡張する必要があります。 @WebServletアノテーションは、Java EE6以降でのみ使用可能であることに注意してください。

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

アノテーションなしでサーブレットをマップしたい場合は、代わりに従来のweb.xmlを使用できます。



    
       FormServlet
       com.root.FormServlet
    
    
        FormServlet
        /calculateServlet
    

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

Your Weight (kg) :
Your Height (m) :

${bmi}

最後に、すべてが期待どおりに機能していることを確認するために、簡単なテストも作成しましょう。

public class FormServletLiveTest {

    @Test
    public void whenPostRequestUsingHttpClient_thenCorrect()
      throws Exception {

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

        List 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

the Servlet technology is not limited to the HTTP protocol.を理解することが重要です

実際にはほとんどの場合そうですが、Servletは汎用インターフェースであり、HttpServletはそのインターフェースの拡張であり、doGetdoPostなどのHTTP固有のサポートを追加します。等

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

7. 結論

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

サンプルプロジェクトは、a GitHub projectとしてダウンロードしてそのまま実行できます。