質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.80%

Beanからサーブレットに値を取得する

受付中

回答 0

投稿

  • 評価
  • クリップ 0
  • VIEW 639

u-to

score 7

前提・実現したいこと

独学でサーブレット、JSPを学んでおり、住宅ローン計算機をつくっております。

1.JSP(値入力)→2.サーブレット(→2.1BeanにJSPから入力された値を格納)→3.→JSP(打ち込んだ値の確認→4.サーブレット(Beanからgetterで値を取得し、その値によって条件分岐し、とぶJSPを選択)→5.JSP(出力)
をしたいのですが、4で値が取得できずjava.lang.NullPointerExceptionエラーがでます。
Beanの使い方が理解していないのか、値を一つのクラスにまとめて各サーブレット、JSPがそのクラスから値を取得できるようにしたいです。
使用しているソフトはeclipseでサーバーはTomcatを使用しております。

後々5のJSPでも値を取り出し計算して出力させるつもりです。

発生している問題・エラーメッセージ

java.lang.NullPointerException
at servlet.Result.doPost(Result.java:34)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:660)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at tool.EncodingFilter.doFilter(EncodingFilter.java:27)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:543)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:678)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:609)
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:810)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1623)
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:748)

該当のソースコード

1.JSP(入力)
<%@ page language="java" contentType="text/html; charset=UTF-8"

     pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>住宅ローンチェッカー</title>
<style>
labal{
width: 7em
}
</style>
</head>
<body>

<h1>住宅ローンチェッカー</h1>
<hr>
<h3>簡単なあなたの情報を入力して適正な金融機関と借り入れ金額を調べましょう!</h3>

<form action ="setter" method="post">
<p>
<label>年齢</label>
<input type="number" id="number" min="16" max="80" name="age">
</p>

<p>
<label>年収(100万円単位)</label>
<input type="text" name="income">
</p>

<p>
<label>お勤め先</label>
<input type="radio" name="job" value="民間企業">民間企業
<input type="radio" name="job" value="公務員">公務員
<input type="radio" name="job" value="自営業">自営業
<input type="radio" name="job" value="その他">その他
</p>

<p>
<label>役職</label>
<select name="position">
<option values="part_time">アルバイト・パート</option>
<option values="contract">契約社員(非正規雇用)</option>
<option values="normal">一般社員</option>
<option values="officer">役員</option>
<option values="president">経営者</option>
</select>
</p>

<p>
<label>勤続年数</label>
<select name="years">
<option values="zero_one">1年未満
<option values="one_three">1〜3年
<option values="three_five">3〜5年
<option values="five_">5年以上
</select>
</p>

<label>
<input type="submit" value="確認画面へ進む">
</label>

</form>


</body>
</html>

2.サーブレット
package servlet;

import java.io.IOException;
import java.io.PrintWriter;

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 bean.Info;
import tool.Page;
/**
 * Servlet implementation class Loan
 */
@WebServlet(urlPatterns= {"/setter"})
public class Setter extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        int age = Integer.parseInt(request.getParameter("age"));
        int income = Integer.parseInt(request.getParameter("income"));
        String job = request.getParameter("job");
        String position = request.getParameter("position");
        String years = request.getParameter("years");

        PrintWriter out = response.getWriter();
        Page.header(out);

        Info i = new Info();

        i.setAge(age);
        i.setIncome(income);
        i.setJob(job);
        i.setPosition(position);
        i.setYears(years);

        request.setAttribute("info", i);

        try {

            request.getRequestDispatcher("confirm.jsp")
            .forward(request, response);
        }catch(Exception e) {
            e.printStackTrace();
        }

        Page.footer(out);
    }

}

3.JSP(確認)
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@page import="bean.Info" %>
    <% Info i = (Info)request.getAttribute("info"); %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>確認画面</title>
</head>
<body>

<h1>確認画面</h1>
<hr>
<h3>入力した内容をご確認ください</h3>
<hr>

<p>
<label>年齢 :</label>
<%=i.getAge() %></p>

<p>
<label>年収 :</label>
<%=i.getIncome() %>万円
</p>

<p>
<label>お勤め先 :</label>
<%=i.getJob() %>
</p>

<p>
<label>役職 :</label>
<%=i.getPosition() %>
</p>

<p>
<label>勤続年数 :</label>
<%=i.getYears() %>
</p>

<a href="personinfo.jsp">入力し直す</a>
<p></p>

<form action="result" method="post">
<input type="submit" value="診断する">
</form>

</body>
</html>

4.サーブレット(条件分岐)
package servlet;

import java.io.IOException;
import java.io.PrintWriter;

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 bean.Info;
import tool.Page;

/**
 * Servlet implementation class Result
 */
@WebServlet("/result")
public class Result extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        PrintWriter out = response.getWriter();
        Page.header(out);

        Info i = (Info)request.getAttribute("info");
        //int term = i.getAge() + 35;

        try {
//ここでエラー
        if(i.getJob() == "自営業" || i.getJob() == "その他") {
            request.getRequestDispatcher("fix.jsp")
            .forward(request, response);
        }

        if(i.getPosition() == "officer" || i.getPosition() == "president") {
            request.getRequestDispatcher("fix.jsp")
            .forward(request, response);
        }

        if(i.getYears() == "zero_one") {
            request.getRequestDispatcher("seven_seven.jsp")
            .forward(request, response);
        }

        if(i.getJob() == "公務員") {
            request.getRequestDispatcher("sendai.jsp")
            .forward(request, response);
        }

        else {
            System.out.println("受け渡し失敗");
        }

        }catch(Exception e){
            e.printStackTrace();
        }


        Page.footer(out);


    }

}

試したこと

4で値を取得するi.getJob()をrequest.getParameterにしてもエラーが起きました

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正の依頼

  • dodox86

    2020/04/03 23:11 編集

    「3.確認のJSP」で、そもそもフォーム中のデータを何もサーブレット"/result"へ送っていないように見えますが。
    <form action="result" method="post">
    <input type="submit" value="診断する">
    </form>

    キャンセル

  • u-to

    2020/04/04 14:45

    <body>の前にactionを置けばいいってことですか?

    キャンセル

  • hoshi-takanori

    2020/04/07 08:53

    2 のサーブレットで request.setAttribute したものを 4 のサーブレットで request.getAttribute することはできない(たぶん)ので、3 の JSP で <input type="hidden"> を使って情報を受け渡す必要があると思います。(または、セッションを使うとか。)

    キャンセル

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.80%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る