taqmi
@taqmi

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

【Java】ArrayListで組んだ配列をJSPで表示したい

Q&A

Closed

はじめに

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

フォームに未入力項目があれば、「〇〇を入力してください。」と表示させる機能を実装中です。
こちらのサイトを参考に、配列を組んで未入力項目のみメッセージを表示させたいのですが、キャストエラーで詰まってしまいました。

どうようにすればエラーが解消し、表示させることができるのかご教授ください。

解決したいこと

  • ClassCastExceptionの解消
  • 配列をJSPで表示

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

Qiita_error.png

該当するソースコード

Controller

ContactsServlet.java
package servlet;

import java.io.IOException;

import java.util.ArrayList;
import java.util.List;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import model.Contact;

/**
 * 問い合わせ画面・確認画面の表示を行うコントローラ
 */
@WebServlet("/ContactsServlet")
public class ContactsServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * 問い合わせ画面への遷移を行う
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        request.setAttribute("error", "");
        RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/jsp/index.jsp");
        dispatcher.forward(request, response);
    }

    /**
     * 確認画面への遷移を行う
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        // 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
        List<String> error = new ArrayList<>();
        if(name == "") {
            error.add("名前を入力してください。");
        }
        if(email == "") {
            error.add("メールアドレスを入力してください。");
        }
        if(tel == "") {
            error.add("電話番号を入力してください。");
        }
        if(item == "" ) {
            error.add("問い合わせ項目を選択してください。");
        }
        if(content == "") {
            error.add("問い合わせ内容を入力してください。");
        }

        // Exchange[String] : avoid ClassCastException
        // String[] StringError = error.toArray(String[]::new);

        // Branch
        if(error.size() > 0){
            // Save_RequestScope
            request.setAttribute("error", error);
            // Forward -> index
            RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/jsp/index.jsp");
            dispatcher.forward(request, response);
        }else {
            // Save_RequestScope
            request.setAttribute("contact", contact);
            // Forward -> confirm
            RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/jsp/confirm.jsp");
            dispatcher.forward(request, response);
        }
    }
}

Model

Contact.java
package model;

import java.io.Serializable;

public class Contact implements Serializable{

    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 ="java.util.ArrayList" %>
<%@ page import = "java.util.List" %>
<%
// Get_RequestScope
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++){ %>
            <%= error.get(i) %><br/>
        <% } %>

        <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="">
          </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) request.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="#" method="post">
        <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="button" value="内容を修正する" onclick="history.back()">
        <button type="submit" name="submit">送信する</button>
      </form>
    </div>
  </body>
</html>

自分で試したこと

下記、参考のサイトを基に配列の型をStringに変換し、互換性を持たせてみました。
変換のために記述したコードは、Controllerでコメントアウトした1行ですが、エラーは変わらずでした。

参考

Listとゆかいなクラスたち
「ArrayList で変数を宣言してはいけません!」からはじまる疎結合の解説
java キャストが上手くいきません。
ArrayList から配列に変換できない
Javaで配列の内容を文字列にして表示する

0

1Answer

doGet メソッドでerror属性に文字列を設定しているのが原因ではないでしょうか。

2Like

Comments

  1. @taqmi

    Questioner

    doGetメソッドで、errorを空配列でsetAttribute()をしたら、
    無事解決しました。

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

Your answer might help someone💌