サーブレットによるユーザーログインと送信フォームの実装 - Java

サーブレットでログイン画面と注文フォームを実装します。

コード(サーブレット:LoginServlet.java)

package webApplication11;

import java.io.*;
import java.net.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class LoginServlet extends HttpServlet {
  /** Handles the HTTP <code>GET</code> method.
   * @param request servlet request
   * @param response servlet response
   */
  protected void doGet(HttpServletRequest request, HttpServletResponse response)
          throws ServletException, IOException {
  }

  /** Handles the HTTP <code>POST</code> method.
   * @param request servlet request
   * @param response servlet response
   */
  protected void doPost(HttpServletRequest request, HttpServletResponse response)
          throws ServletException, IOException {
    ServletConfig config = getServletConfig();
    // Servlet 初期化パラメータ情報
    String un = config.getInitParameter("username");
    String pw = config.getInitParameter("password");
    //processRequest(request, response);

    response.setContentType("text/html; charset=shift-jis");
    PrintWriter out = response.getWriter();
    //if (request.getParameter("username") == un){
    if (un.equals(request.getParameter("username")) == true
      && pw.equals(request.getParameter("password")) == true) {
      //セッション情報の新規作成
      HttpSession session = request.getSession(true);
      //セッションオブジェクトに保存する
      session.setAttribute("username", un);

      out.println("<HTML>");
      out.println("<HEAD>");
      out.println("<TITLE>BookStore BS</TITLE>");
      out.println("</HEAD>");
      out.println("<BODY>");
      out.println("<h3>ようこそ!" + un + "さん</h3>");
      out.println("<p><a href=\"./ProductServlet\">本の商品一覧を見る</a></p>");
      out.println("<p><a href=\"./Login.html\">ログイン画面に戻る</a>");
      out.println("</BODY>");
      out.println("</HTML>");
    } else {
      out.println("NG パスワードまたはユーザー名が違います");
    }
  }

  /** Returns a short description of the servlet. */
  public String getServletInfo() {
    return "Short description";
  }
}

解説

ログインのロジックに関してはこちらの記事を参照してください。
ログインできた場合にはセッションオブジェクトを新規作成し、メニュー画面を表示します。[本の商品一覧を見る]リンクをクリックするとProductServletにジャンプするリンクを出力します。

コード(サーブレット:ProductServlet.java)

package webApplication11;

import java.io.*;
import java.net.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class ProductServlet extends HttpServlet {
  /** Handles the HTTP <code>GET</code> method.
   * @param request servlet request
   * @param response servlet response
   */
  protected void doGet(HttpServletRequest request, HttpServletResponse response)
          throws ServletException, IOException {

    HttpSession session = request.getSession(false);

    response.setContentType("text/html; charset=shift-jis");
    PrintWriter out = response.getWriter();
    //セッションオブジェクトの獲得確認
    if (session == null || session.getAttribute("username") == null) {
     //セッションが取得できなければエラー
     out.println("Cookieが無効です。Cookieを有効にしてからもう一度ログインしなおしてください。");
    } else {
     //セッションが取得できた場合はリストを表示
     out.println("<HTML>");
     out.println("<HEAD>");
     out.println("<TITLE>BookStore BS</TITLE>");
     out.println("</HEAD>");
     out.println("<BODY>");
     out.println("<h3>ようこそ!" + session.getAttribute("username") + "さん</h3>");

     out.println("<FORM method=\"POST\" action=\"OrderServlet\">");
     out.println("<INPUT type=\"checkbox\" name=\"books\" value=\"JustTomcat\" >JustTomcat<BR>");
     out.println("<INPUT type=\"checkbox\" name=\"books\" value=\"WebService\">WebService<BR>");
     out.println("<INPUT type=\"checkbox\" name=\"books\" value=\"Stepjava\">Stepjava<BR>");
     out.println("<INPUT type=\"checkbox\" name=\"books\" value=\"Servlet\">Servlet<BR>");
     out.println("<INPUT type=\"checkbox\" name=\"books\" value=\"JSP\">JSP<BR><BR>");
     out.println("<INPUT type=\"submit\" value=\"SEND\">");
     out.println("<INPUT type=\"reset\" value=\"RESET\">");

     out.println("</BODY>");
     out.println("</HTML>");
    }
  }

  /** Handles the HTTP <code>POST</code> method.
   * @param request servlet request
   * @param response servlet response
   */
  protected void doPost(HttpServletRequest request, HttpServletResponse response)
          throws ServletException, IOException {
  }

  /** Returns a short description of the servlet. */
  public String getServletInfo() {
    return "Short description";
  }
}

解説

本の一覧リストを画面に表示します。HTMLフォームも用意します。フォーム内にチェックボックス、クリアボタン、サブミットボタンを表示します。アクション先はOrderServletサーブレットにします。

if (session == null || session.getAttribute("username") == null) {
にて、セッションオブジェクトの存在を確認することでログインが成功しているかを判定できます。

コード(サーブレット:OrderServlet.java)

package webApplication11;

import java.io.*;
import java.net.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class OrderServlet extends HttpServlet {
  /** Handles the HTTP <code>GET</code> method.
   * @param request servlet request
   * @param response servlet response
   */
  protected void doGet(HttpServletRequest request, HttpServletResponse response)
          throws ServletException, IOException {
  }

  /** Handles the HTTP <code>POST</code> method.
   * @param request servlet request
   * @param response servlet response
   */
  protected void doPost(HttpServletRequest request, HttpServletResponse response)
          throws ServletException, IOException {
    String un;

    HttpSession session = request.getSession(false);
    //セッションオブジェクトの獲得確認
    if (session == null || session.getAttribute("username") == null) {
      //セッションが取得できなければエラー
      return;
    } else {
      //セッションが取得できた場合はカウンタを取り出す
      un = (String) session.getAttribute("username");
    }

    String books[] = request.getParameterValues("books");

    response.setContentType("text/html; charset=shift-jis");
    PrintWriter out = response.getWriter();
    //クライアントに送るHTML
    out.println("<HTML>");
    out.println("<HEAD>");
    out.println("<TITLE>注文リスト</TITLE>");
    out.println("</HEAD>");
    out.println("<BODY>");
    out.println("<H1>注文リスト</H1>");
    out.println("<p>" + un + "さんの注文リスト</p>");
    out.println("<BR><HR><BR>");
    out.println("<UL>");

    //Form情報を取得
    out.println("<table border=\"1\" width=\"500\""
     +" cellspacing=\"0\" cellpadding=\"5\" bordercolor=\"#333333\">");

    if (books != null) {
      out.println("<tr>");
      out.println("<th>タイトル");
      out.println("</tr>");
      for (int i = 0; i < books.length; i++) {
        out.println("<tr>");
        out.println("<th>" + books[i] + "<BR>");
        out.println("</tr>");
      }
    } else {
      out.println("バスケットは空です");
    }
    out.println("</table>");
    out.println("<BR>");

    out.println("</UL>");
    out.println("</BODY>");
    out.println("</HTML>");
    out.close();
  }

  /** Returns a short description of the servlet. */
  public String getServletInfo() {
    return "Short description";
  }
}

解説

ProductServletサーブレットから送信されたデータを画面に表示します。
チェックボックスでチェックされた内容は
String books[] = request.getParameterValues("books");
により取得します。

if (session == null || session.getAttribute("username") == null) {
にて、セッションオブジェクトの存在を確認することでログイン済みか判定できます。

認証HTML画面 (Login.html)

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <META HTTP-EQUIV="content-type" CONTENT="text/html; charset=UTF-8">
    <title></title>
  </head>
  <body>
    <FORM method="POST" action="LoginServlet">
      UserName : <INPUT type="text" name="username"><br><br>
      Password : <INPUT type="text" name="password"><br><br>
      <INPUT type="submit" value="SEND">
      <INPUT type="reset" value="RESET">  
    </FORM>  
  </body>
</html>

コード (web.xml)

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation
    ="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
  <servlet>
    <servlet-name>LoginServlet</servlet-name>
    <servlet-class>webApplication11.LoginServlet</servlet-class>
    <init-param>
      <param-name>username</param-name>
      <param-value>taro</param-value>
    </init-param>
    <init-param>
      <param-name>password</param-name>
      <param-value>taro</param-value>
    </init-param>
  </servlet>
  <servlet>
    <servlet-name>ProductServlet</servlet-name>
    <servlet-class>webApplication11.ProductServlet</servlet-class>
  </servlet>
  <servlet>
    <servlet-name>OrderServlet</servlet-name>
    <servlet-class>webApplication11.OrderServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>LoginServlet</servlet-name>
    <url-pattern>/LoginServlet</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>ProductServlet</servlet-name>
    <url-pattern>/ProductServlet</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>OrderServlet</servlet-name>
    <url-pattern>/OrderServlet</url-pattern>
  </servlet-mapping>
  <session-config>
    <session-timeout>30</session-timeout>
  </session-config>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

実行結果

ログイン画面が表示されます。UserName,Passwordを入力します。ユーザー名とパスワードはweb.xmlに記載されたものです。


ログインできると下図の画面が表示されます。[本の商品一覧を見る]リンクをクリックします。


[本の商品一覧を見る]リンクをクリックすると下図の書籍一覧画面が表示されます。


購入したい書籍のチェックボックスにチェックをつけ[SEND]ボタンを押します。


注文リスト画面が表示されます。


このページのキーワード
  • Java
  • サーブレット
  • ユーザーログインの実装
  • 送信フォームの実装
著者
iPentecのプログラマー、最近はAIの積極的な活用にも取り組み中。
とっても恥ずかしがり。
最終更新日: 2023-12-20
作成日: 2011-02-12
iPentec all rights reserverd.