リクエストを処理するサーブレットの作成

この項では、リクエストを処理するサーブレットの作成について学習します。

クラス名: src/main/java/com/oracle/jdbc/samples/web/WebController.java

Githubの場所: WebController.java

説明: これは、アプリケーションのすべてのフローを制御するメイン・サーブレットです。アプリケーションの新しい機能ごとに、新しいリクエストおよびレスポンスを処理するコードをdoPost()およびprocessResponse()にそれぞれ追加します。

サーブレットを作成するステップ:

  1. WebController.javaのパッケージを宣言します。次に示すように、Employeeの結果およびその他の依存クラスを表示するために、EmployeeEmployeeBeanImplおよびGoogle GSONをインポートします。特定のクラスがインポートされない場合、IntelliJにより、必要なパッケージのインポートを促すメッセージが表示されます。
    
    package com.oracle.jdbc.samples.web;
    import com.oracle.jdbc.samples.entity.Employee;
    import com.oracle.jdbc.samples.bean.EmployeeBean;
    import com.oracle.jdbc.samples.bean.EmployeeBeanImpl;
    import com.google.gson.Gson; import com.google.gson.reflect.TypeToken;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.*;
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.io.BufferedReader;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Map;
    import java.util.logging.Logger;
    
  2. サーブレットに注釈を追加します。
    @WebServlet(name = "WebController", urlPatterns = {"/WebController"})
  3. HttpServletを拡張するWebControllerクラスを宣言します。JdbcBeanImpl型のjdbcBeanを初期化します。これはグローバル変数になり、reportError()processRequest()およびdoGet()などのすべてのメソッドで使用できます。
    
    public class WebController extends HttpServlet {
    	JdbcBean jdbcBean = new JdbcBeanImpl();		
    }
  4. reportError()メソッドを作成して、エラーを取得してWebページに表示します。
    
    private void reportError(HttpServletResponse response, String message)
    throws ServletException, IOException {
      response.setContentType("text/html;charset=UTF-8"); /*Set the response content type to be “text/html” and charset=UTF-8*/
    
     /*Print the error message*/
     try (PrintWriter out = response.getWriter()) {      
        out.println("<!DOCTYPE html>");
        out.println("<html>");
        out.println("<head>");
        out.println("<title>Servlet WebController</title>");
        out.println("</head>");
        out.println("<body>");
        out.println("<h1>" + message + "</h1>");
        out.println("</body>");
        out.println("</html>");
      }
    }
  5. processRequestメソッドを作成して、HTTP GETおよびPOSTメソッドをリクエストするプロセスを作成します。
    
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
      Gson gson = new Gson();
      List<Employee> employeeList = null;
      
       if ((value = request.getParameter(LOGOUT)) != null) {
        
    /* Get session and then invalidate it */
    
        HttpSession session = request.getSession(false);
        if (request.isRequestedSessionIdValid() && session != null) {
          session.invalidate();
        }
        handleLogOutResponse(request,response);
        response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
      }
    else {
       /*Instantiate the employeeList object by invoking getEmployees method of JavaBean*/
        employeeList = jdbcBean.getEmployees();
      }
    
    if(employeeList != null) {
        response.setContentType("application/json");  /*Set the content type to 'application/json' */
     
     /* Invoke the toJson(…) method and convert the employeeList to JSON*/
        gson.toJson(employeeList,
            new TypeToken<ArrayList<Employee>>() {
            }.getType(),
            response.getWriter());
      }
    /*Add an else condition to cover the error scenario when the employeeList is empty*/
    else {
        response.setStatus(HttpServletResponse.SC_NOT_FOUND);
      }
    
    }
  6. handleLogOutResponse(request, response)メソッドを作成して、ユーザーがアプリケーションからログアウトするときにCookie情報を編集します。
    
    private void handleLogOutResponse(HttpServletRequest request, HttpServletResponse response) {
      Cookie[] cookies = request.getCookies();
      for (Cookie cookie : cookies) {
        cookie.setMaxAge(0);
        cookie.setValue(null);
        cookie.setPath("/");
        response.addCookie(cookie);
      }
    }
  7. doGetメソッドを作成して、データベースから従業員の詳細を取得し、JSONで結果を表示します。JSONは、HTMLに表示される結果の出力形式になります。
    
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
      processRequest(request, response);
    }
  8. getServletInfoメソッドを作成して、サーブレットに関する一般的な情報を表示します。
    
    public String getServletInfo() {  
      return "JdbcWebServlet: Reading Employees table using JDBC and transforming it as a JSON.";
    }