taqmi
@taqmi

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

【Java】Sessionを使って入力値を保持したい

Q&A

Closed

はじめに

今月より、Javaを勉強し始め、現在簡単なお問い合わせサイトを作成しています。

「フォームの必須入力チェック(バリデーション)で引っかかったとき」
「遷移後の入力確認画面で”内容を修正する”を押してフォーム入力画面に遷移したとき」
に入力した値を保持できるよう、セッションを用いて実装したいと考えております。

※サーバー側での処理方法を知りたいため、確認画面からフォーム画面への遷移にhistory.back()を使用しておりません。

現在、セッションに格納した値を取り出すための、コードの書き方で試行錯誤しています。
どのようにコードを記述すれば良いかご教授ください。

解決したいこと

セッションで値を保持するための記述の仕方

発生している問題・エラー

現在は、JSPの初期値(value)の出力部で「NullPointerException」が発生しております。

該当するソースコード

Controller

ContactsServlet.java
package servlet;

import java.io.IOException; // 入出力の例外

import java.util.ArrayList; // ListではInstanceを生成ができないためArrayList

import javax.servlet.RequestDispatcher; // クライアントからのリクエストを受信、サーバ上の任意のリソースに送信
import javax.servlet.ServletException; // Servletに問題が発生したときにthrow
import javax.servlet.annotation.WebServlet; // マッピング情報を含むServletの設定情報を宣言
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession; // Session

import model.Contact;

/**
 * 問い合わせ画面・確認画面の表示を行うコントローラ
 */
@WebServlet("/ContactsServlet")
public class ContactsServlet extends HttpServlet {
    /**
     * 問い合わせ画面への遷移を行う
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // Session
        HttpSession session = request.getSession(true);
        String contact = (String) session.getAttribute("contact");
        session.setAttribute("contact", contact);

        // avoid NullPointerException & ClassCastException
        ArrayList<String> error = new ArrayList<>();
        error.add("");
        request.setAttribute("error", error);

        // Forward
        RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/jsp/index.jsp");
        dispatcher.forward(request, response);
    }

    /**
     * 確認画面への遷移を行う
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // Session
        HttpSession session = request.getSession();

        // Encode
        request.setCharacterEncoding("UTF-8");

        // Get_RequestParameter
        String name = request.getParameter("name"); // 名前
        String email = request.getParameter("email"); // メールアドレス
        String tel = request.getParameter("tel"); // 電話番号
        String sex = request.getParameter("sex"); // 性別
        String item = request.getParameter("item"); // 項目
        String content = request.getParameter("content"); // 内容

        // Instance
        Contact contact = new Contact();

        // Set_Property
        contact.setName(name);
        contact.setEmail(email);
        contact.setTel(tel);
        contact.setSex(sex);
        contact.setItem(item);
        contact.setContent(content);

        // Validation
        ArrayList<String> error = new ArrayList<>();
        // nullがあった場合、「ぬるぽ」になる可能性があるため「"".equals(変数)」
        if("".equals(name)) {
            error.add("名前を入力してください。");
        }
        if("".equals(email)) {
            error.add("メールアドレスを入力してください。");
        }
        if("".equals(tel)) {
            error.add("電話番号を入力してください。");
        }
        if(item == null) { // equals(null) -> NullPointerException
            error.add("問い合わせ項目を選択してください。");
        }
        if("".equals(content)) {
            error.add("問い合わせ内容を入力してください。");
        }

        // Branch
        if(error.size() > 0){
            // Save_RequestScope/SessionScope
            request.setAttribute("error", error);
            session.setAttribute("contact", contact); // 入力値保持のため
            // Forward -> index
            RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/jsp/index.jsp");
            dispatcher.forward(request, response);
        }else{
            // Save_SessionScope
            session.setAttribute("contact", contact);
            // Forward -> confirm
            RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/jsp/confirm.jsp");
            dispatcher.forward(request, response);
        }
    }
}

Model

Contact.java
package model;

public class Contact {

    protected String name, email, tel, sex, item, content;

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return this.name;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getEmail() {
        return this.email;
    }

    public void setTel(String tel) {
        this.tel = tel;
    }

    public String getTel() {
        return this.tel;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getSex() {
        return this.sex;
    }

    public void setItem(String item) {
        this.item = item;
    }

    public String getItem() {
        return this.item;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public String getContent() {
        return this.content;
    }
}

View

index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="model.Contact" %>
<%@ page import ="java.util.ArrayList" %>
<%
// Get_RequestScope
Contact contact = (Contact) session.getAttribute("contact");
ArrayList<String> error = (ArrayList<String>) request.getAttribute("error");
%>
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="UTF-8">
    <title>問い合わせ画面</title>
    <link rel="stylesheet" href="css/style.css">
    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js"></script>
    <script src="js/index.js"></script>
  </head>
  <body>
    <div>
      <h1>株式会社〇〇</h1>
    </div>
    <div>
      <h2>問い合わせ画面</h2>
    </div>
    <div>
      <form action="#" class="contact-form">
        <h1 class="contact-title">お問い合わせ 内容入力</h1>
        <p>お問い合わせ内容をご入力の上、「確認画面へ」ボタンをクリックしてください。</p>

        <!-- error message -->
        <% for(int i=0; i<error.size(); i++){ %>
            <p class="error"><%= error.get(i) %><br/></p>
        <% } %>

        <div class="expantion-box">
          <button class="expantion" type="submit">問い合わせする</button>
        </div>
      </form>
      <div class="form-contents">
        <form action="#" method="post">
          <div class="form-item">
            <label>お名前</label>
            <input type="text" name="name" placeholder="例)山田太郎" value="<% contact.getName(); %>">
          </div>
          <div class="form-item">
            <label>メールアドレス</label>
            <input type="text" name="email" placeholder="例)guest@example.com" value="">
          </div>
          <div class="form-item">
            <label>電話番号</label>
            <input type="text" name="tel" placeholder="例)0000000000" value="">
          </div>
          <div class="form-item">
            <label>性別</label>
            <input type="radio" name="sex" value="男性" checked>男性
            <input type="radio" name="sex" value="女性">女性
          </div>
          <div class="form-item">
            <label>問い合わせ項目</label>
            <select name="item">
              <option disabled selected>お問い合わせ項目を選択してください</option>
              <option value="ご質問・お問い合わせ">ご質問・お問い合わせ</option>
              <option value="ご意見・ご感想">ご意見・ご感想</option>
            </select>
          </div>
          <div class="form-item">
            <label>問い合わせ内容</label>
            <textarea name="content" rows="5" placeholder="お問合せ内容を入力" value=""></textarea>
          </div>
          <button class="confirm" type="submit">確認画面へ</button>
        </form>
      </div>
    </div>
  </body>
</html>
confirm.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="model.Contact" %>
<%
// Get_RequestScope
Contact contact = (Contact) session.getAttribute("contact");
%>
<html lang="ja">
  <head>
    <meta charset="UTF-8">
    <title>確認画面</title>
    <link rel="stylesheet" href="css/style.css">
    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js"></script>
  </head>
  <body>
    <div>
      <h1>株式会社〇〇</h1>
    </div>
    <div>
      <h2>確認画面</h2>
    </div>
    <div>
      <form action="ContactsServlet" method="get">
        <h1 class="contact-title">お問い合わせ 内容確認</h1>
        <p>お問い合わせ内容はこちらで宜しいでしょうか?<br>よろしければ「送信する」ボタンを押して下さい。</p>
        <div>
          <div>
            <label>お名前</label>
            <p><%= contact.getName() %></p>
          </div>
          <div>
            <label>メールアドレス</label>
            <p><%= contact.getEmail() %></p>
          </div>
          <div>
            <label>電話番号</label>
            <p><%= contact.getTel() %></p>
          </div>
          <div>
            <label>性別</label>
            <p><%= contact.getSex() %></p>
          </div>
          <div>
            <label>お問い合わせ項目</label>
            <p><%= contact.getItem() %></p>
          </div>
          <div class="detail">
            <label>お問い合わせ内容</label>
            <p class="content-length"><%= contact.getContent() %></p>
          </div>
        </div>
           <input type="submit" value="内容を修正する" >
           <button type="submit" name="submit">送信する</button>
      </form>
    </div>
  </body>
</html>

自分で試したこと

下記、サイトを参考にセッションスコープについて調べましたが、
セッションを取得して表示する方法がパッとせず、悩んでおります。

参考

input textの値 保持
jspでセッションスコープの値が取得できません。
JSP セッションスコープ
Java sessionスコープ

0

1Answer

問い合わせ画面のdoGetにてセッションの値を設定していますが、セッションに値が存在しない場合、contactがnullになってしまいます。
そうなるとJSP側で参照した際にNullPointerExceptionが発生します。
この現象かなと思います。

回避方法としてはセッションの値がnullだった場合に、クラスを生成するとなります。

1Like

Comments

  1. @taqmi

    Questioner

    ご回答いただいた通りコードを書いてみましたら、無事「NullPointerException」を
    回避することができました!

    ありがとうございました!

Your answer might help someone💌