Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

ショッピングサイト実装時に発生したヌルポエラー

解決したいこと

サーブレットJSPでショッピング風サイトを作成しています。
商品一覧画面から遷移する商品詳細画面の実装中に以下のようなエラーが発生しました。
解決方法を教えてください。

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

java.lang.NullPointerException
websample13_14.DetailServlet.doGet(DetailServlet.java:69)
javax.servlet.http.HttpServlet.service(HttpServlet.java:626)
javax.servlet.http.HttpServlet.service(HttpServlet.java:733)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)

該当するソースコード

【itemList.jsp】
<%@ page import="java.util.ArrayList"%>
<%@ page import="websample13_14.ItemBean"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" %>

<%-- Java入門 商品一覧画面 --%>
<!DOCTYPE html>
<html>
    <head>
        <title>Java入門</title>
        <link href="/schoo/WEB-sample13_14/css/shopping.css" rel="stylesheet" type="text/css" />
    </head>
    <body>
        <% //TODO:2-① jsp:includeでヘッダー画面を読み込む%>
        <jsp:include page="header.jsp"></jsp:include>

        <h1>商品一覧</h1>
        <%-- リクエストスコープからBeanクラスの配列を取得(eclipseの警告が出ても今回は大丈夫です) --%>
        <% ArrayList<ItemBean> itemList = (ArrayList<ItemBean>)request.getAttribute("itemList"); %>
        <form action="./DetailServlet" >
            <table class="table_list">
                <tbody>
                    <tr>
                        <%--<th>商品ID</th>--%>
                        <th>商品名</th>
                        <th>価格</th>
                        <%--<th>在庫数</th>--%>
                        <%--<th>数量</th>--%>
                    </tr>

                    <%-- Beanの要素数分(商品の種類分)テーブルを作成 --%>
                    <% for(ItemBean bean : itemList) { %>
                    <tr>

                        <%-- 商品名 --%>
                        <td><%= bean.getItemName() %></td>
                        <%-- 価格 --%>
                        <td class="int"><%= bean.getPrice() %></td>


                        <% //TODO:2-② 在庫が0の場合はリストボックスと購入ボタンを表示しない処理を入れる%>
                        <% if(bean.getQuantity() != 0) { %>
                        <% System.out.println(); %>
                        <td>
                            <select class="list" name="quantity">
                                <% for(int i = 1; i <= bean.getQuantity(); i++) { %>
                                    <%-- System.out.println("「繰り返しで表示する」:" + i); --%>
                                    <option value="<%= i %>"><%= i %></option>
                                <% } %>
                            </select>
                        </td>
                        <td>
                            <input class="common_butom" type="submit" value="詳細" >
                            <input type="hidden" name="item_id" value="<%= bean.getItemId() %>">
                            <% System.out.println(bean.getItemId()); %>
                        </td>
                        <% } else { %>
                        <td></td>
                        <td class="butom">売り切れ!</td>
                        <% } %>
                    </tr>
                <% } %>
                </tbody>
            </table>
            <input class="common_button" type="button" onclick="location.href='./WEB-sample13_14/login.jsp'" value="戻る">
        </form>
    </body>
</html>
DetailServlet.java
package websample13_14;

import java.io.IOException;

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;

/**
 * Java入門 商品購入ページ処理クラス.
 */
@WebServlet("/DetailServlet")
public class DetailServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;

    /**
     * コンストラクタ.
     */
    public DetailServlet() {
        super();
    }

    /**
     * GETメソッドで呼び出された場合の処理
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {


        // GETメソッドのパラメータ名を取得
        //Enumeration<String> names = request.getParameterNames();

        String itemId= "";      // 商品ID
        String quantity= "";    // 購入数


        itemId = request.getParameter("item_id");

        // ドロップダウンリストから購入数を取得
        quantity = request.getParameter("quantity");

        // 商品情報を取得
        Shopping shopping = new Shopping();
        ItemBean bean = shopping.getItem(itemId);

        // 商品一覧をリクエストスコープの属性にセット
        request.setAttribute("item", bean);
        request.setAttribute("quantity", quantity);

        // 購入確認画面に移動
        RequestDispatcher rd = request.getRequestDispatcher("../WEB-sample13_14/detail.jsp");
        rd.forward(request, response);
    }
}
【Detail.jsp】
<%@ page language="java" contentType="text/html; charset=UTF-8" %>
<jsp:useBean id="item" scope="request" class="websample13_14.ItemBean"/>

<%-- Java入門 購入確認画面 --%>
<!DOCTYPE html>
<html>
    <head>
        <title>Java入門</title>
        <link href="/schoo/WEB-sample13_14/css/shopping.css" rel="stylesheet" type="text/css" />
    </head>
    <body>
        <jsp:include page="header.jsp"/>
        <h1>商品詳細</h1>
        <p>つぎの商品を購入しますか?</p>
        <form action="./ResultServlet" method="post">
            <table class="table_list">
                <tbody>
                    <tr>
                        <th>商品ID</th>
                        <th>商品名</th>
                        <th>価格</th>
                        <th>在庫数</th>
                        <th>購入数</th>
                    </tr>
                    <tr>
                        <%-- リクエストスコープから表示する値を取得 --%>
                        <td><jsp:getProperty property="itemId" name="item"/></td>
                        <td><jsp:getProperty property="itemName" name="item"/></td>
                        <td class="int"><jsp:getProperty property="price" name="item"/></td>
                        <td class="int"><jsp:getProperty property="quantity" name="item"/></td>
                        <td class="int"><%=request.getAttribute("quantity")%></td>
                        <td class="button">
                            <input class="common_button" type="submit" value="購入する">
                            <% //TODO:2-⑤ hiddenでパラメータをセットしておく %>
                            <%-- 購入処理を行うため、hidden(画面には表示されない情報)に商品IDと購入数を設定しておく --%>
                            <input type="hidden" name="item_id" value="<%= item.getItemId() %>">
                            <input type="hidden" name="item_quantity" value="<%= request.getAttribute("quantity") %>">
                        </td>
                    </tr>
                </tbody>
            </table>
        </form>
        <form action="./ShoppingServlet" method="post">
            <input class="common_button" type="submit" value="一覧に戻る">
        </form>
    </body>
</html>

自分で試したこと

「DetailServlet.java」において、使用している以下の変数についてnull値が入っているか、print文を使ってコンソールにて確認しました。

itemId、quantity、bean、request、response

上記変数がnull値でないことは確認しました。

0 likes

1Answer

...
websample13_14.DetailServlet.doGet(DetailServlet.java:69)
...

のように、69行目でエラー発生と出ているが、それは提示されたソースのどこに該当する?
(提示されたソースコードが58行しかないため判断不能)

0Like

Comments

  1. 返信ありがとうございます。
    投稿する上で、プログラムを少しいじったため、ずれてしまいました。
    該当する行は以下になります。
    rd.forward(request, response);
  2. request, responseがnullでないのなら、rdがnullってことじゃないんですかね?

    rdがnullであったと仮定して、getRequestDispatcherに渡したjspの相対パスが解決できなかった(見つからなかった)ってことのように思えます。

    jspソースの先頭行にDetail.jsp、getRequestDispatcherの渡しているパスがdetail.jspと先頭文字の大文字/小文字が相違していますが問題ないですか?

  3. 返信遅れました。

    ありがとうございます。
    おっしゃる通り、jspの名前がファイル名とパスの記述で異なっていたので修正して正常に動作するようになりました。

    回答していただきありがとうございました。

Your answer might help someone💌