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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Java EE

Java EE(Java Enterprise Edition)はJavaベースのテクノロジーとその相互運用の仕様をまとめたものです。サーバとクライアントのアーキテクチャを規定し、特定アプリケーションのクラス用に定義されたテクノロジー設定のプロファイルを使用します。

JSP

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

スコープ

スコープとは、プログラム内で変数名など、参照可能な有効範囲のことを指します。

サーブレット

サーブレット(Servlets)とはウェブやアプリケーションサーバー上に動くプログラムのことであり、ウェブブラウザや他のHTTPクライエントとデータベースやHTTPサーバー上のアプリケーションの中間層としての働きをします。

Q&A

1回答

5844閲覧

セッションスコープに値を保存しているはずなのに、NullPointerエラーが出てしまう。

shimchan1010

総合スコア6

Java EE

Java EE(Java Enterprise Edition)はJavaベースのテクノロジーとその相互運用の仕様をまとめたものです。サーバとクライアントのアーキテクチャを規定し、特定アプリケーションのクラス用に定義されたテクノロジー設定のプロファイルを使用します。

JSP

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

スコープ

スコープとは、プログラム内で変数名など、参照可能な有効範囲のことを指します。

サーブレット

サーブレット(Servlets)とはウェブやアプリケーションサーバー上に動くプログラムのことであり、ウェブブラウザや他のHTTPクライエントとデータベースやHTTPサーバー上のアプリケーションの中間層としての働きをします。

0グッド

0クリップ

投稿2020/04/23 05:31

編集2020/04/24 05:24

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
プログラム経験のない新卒一年目SEです。
在宅勤務中の成果物でJava Servlet/JSPを使用し、簡単なWebアプリケーションを作成しています。

ユーザー登録が完了した後に、ユーザーIDとパスワードを用いてログインをしようとしている時に以下のエラーがでました。

謎が多いです。やれることはやったのですが、解決できません。

お願いします、助けてください。

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

HTTPステータス 500 - type 例外レポート メッセージ 説明 The server encountered an internal error that prevented it from fulfilling this request. 例外 java.lang.NullPointerException MainPage.User_MainPageServlet.doPost(User_MainPageServlet.java:36) javax.servlet.http.HttpServlet.service(HttpServlet.java:648) javax.servlet.http.HttpServlet.service(HttpServlet.java:729) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 注意 原因のすべてのスタックトレースは、Apache Tomcat/8.0.36のログに記録されています Apache Tomcat/8.0.36

###1.UserBean.java

package User; import java.io.Serializable; public class UserBean implements Serializable{ private String name; private String sex; private String age; private String birth; private String height; private String weight; private String userid; private String password; public UserBean() { } public String getName() { return this.name; } public void setName(String name) { this.name = name; } public String getSex() { return this.sex; } public void setSex(String sex) { this.sex = sex; } public String getAge() { return this.age; } public void setAge(String age) { this.age = age; } public String getBirth() { return this.birth; } public void setBirth(String birth) { this.birth= birth; } public String getHeight() { return this.height; } public void setHeight(String height) { this.height = height; } public String getWeight() { return this.weight; } public void setWeight(String weight) { this.weight = weight; } public String getUserid() { return this.userid; } public void setUserid(String userid) { this.userid = userid; } public String getPassword() { return this.password; } public void setPassword(String password) { this.password = password; } }

###2.User_RegisterServlet.java(サーブレットクラス)

package MainPage; import java.io.IOException; import javax.servlet.RequestDispatcher; import javax.servlet.ServletContext; 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 javax.servlet.http.HttpSession; import User.UserAuthBean; import User.UserBean; @WebServlet("/MainPage/User_RegisterServlet") public class User_RegisterServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { /*文字コードエンコーディング*/ request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8"); /*遷移先*/ String url = null; /*User情報取得*/ UserBean ub = new User.UserBean(); /*パラメータの取得*/ String name= request.getParameter("name"); String sex = request.getParameter("sex"); String age = request.getParameter("age"); String year = request.getParameter("year"); String month = request.getParameter("month"); String day = request.getParameter("day"); String height = request.getParameter("tall"); String weight = request.getParameter("weight"); String userid = request.getParameter("userid"); String password = request.getParameter("password"); String birth = year+"年"+month+"月"+day+"日"; ub.setName(name); ub.setSex(sex); ub.setAge(age); ub.setBirth(birth); ub.setHeight(height); ub.setWeight(weight); ub.setUserid(userid); ub.setPassword(password); /*パラメータを取得で来ているかどうかの確認*/ System.out.println(ub.getName()); System.out.println(ub.getSex()); System.out.println(ub.getAge()); System.out.println(ub.getBirth()); System.out.println(ub.getHeight()); System.out.println(ub.getWeight()); System.out.println(ub.getUserid()); System.out.println(ub.getPassword()); HttpSession session = request.getSession(); session.setAttribute("userbeanses", ub); UserBean ub_test = (UserBean) session.getAttribute("userbeanses"); /*セッションスコープに保存されているかの確認*/ System.out.println(ub_test.getName()); System.out.println(ub_test.getSex()); System.out.println(ub_test.getAge()); System.out.println(ub_test.getBirth()); System.out.println(ub_test.getHeight()); System.out.println(ub_test.getWeight()); System.out.println(ub_test.getUserid()); System.out.println(ub_test.getPassword()); //ログイン判定 UserAuthBean uab = new User.UserAuthBean(); if(uab.execute(ub) == true) { /*認証に成功*/ url = "/WEB-INF/Login_Register/register_end.jsp"; }else{ /*認証に失敗*/ url = "/WEB-INF/Login_Register/register_error.jsp"; } /*画面遷移*/ ServletContext servletContext = getServletContext(); RequestDispatcher rd = servletContext.getRequestDispatcher(url); rd.forward(request, response); } }

###3.login.jsp(JSPファイル)

<login.jsp(jspファイル(ログイン画面)) <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ヘルスケア-ログイン </title> </head> <body> <h1> <center> ログイン </center> </h1> <form method="POST" action="/成果物/MainPage/User_MainPageServlet"> <center> ユーザーID:<input type="text" name="userid_login"><br><br> パスワード : <input type="password" name="password_login"><br><br> <input type="submit" value="送信"> <input type="reset" value="リセット"> </center> </form> </body> </html>

###4.User_MainPageServlet.java(サーブレットクラス)

package MainPage; 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; import javax.servlet.http.HttpSession; import User.UserBean; @WebServlet("/MainPage/User_MainPageServlet") public class User_MainPageServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { /*文字コードエンコーディング*/ request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8"); /*遷移先*/ String url = null; /*ログイン-ユーザーID_パスワード情報取得*/ String userid_login = request.getParameter("userid_login"); String password_login = request.getParameter("password_login"); HttpSession session = request.getSession(); UserBean ub = (UserBean) session.getAttribute("userbeanses"); if(userid_login == ub.getUserid() && password_login == ub.getPassword()) { url = "/WEB-INF/Menu/mainmenu.jsp"; }else if((ub.getUserid() == "" && ub.getPassword() == "") || userid_login != ub.getUserid()&& password_login!=ub.getPassword()){ url = "WEB-INF/Login_Register/login_error"; } /*画面遷移*/ RequestDispatcher rd = request.getRequestDispatcher(url); rd.forward(request, response); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { /*文字コードエンコーディング*/ request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8"); /*遷移先*/ String url = null; /*ログイン-ユーザーID_パスワード情報取得*/ String userid_login = request.getParameter("userid_login"); String password_login = request.getParameter("password_login"); HttpSession session = request.getSession(); UserBean ub = (UserBean) session.getAttribute("userbeanses"); if(userid_login == ub.getUserid() && password_login == ub.getPassword()) { url = "/WEB-INF/Menu/mainmenu.jsp"; }else if((ub.getUserid() == "" && ub.getPassword() == "") || userid_login != ub.getUserid()&& password_login!=ub.getPassword()){ url = "WEB-INF/Login_Register/login_error"; } /*画面遷移*/ RequestDispatcher rd = request.getRequestDispatcher(url); rd.forward(request, response); } }

試したこと

試したことというよりかは、ちゃんとセッションスコープに保存ができているかどうかの確認なのですが、User_Registerervlet.javaの☆部分にてSystem.out.println(ub_test.~)という形でセッションスコープに値がしっかり保存されているかどうかの確認をしたところ、しっかりコンソールにて値が出力されていました。

ですが、その後ログインを試みたところ、エラーメッセージの通りなのですが、User_MainPageServlet.javaの〇部分にてエラーが発生しました。NullPointerと出ているので対象の値がNullになっているかと思ったのですが、セッションに保存されており、セッションを呼び出していると思ってますので謎が深まっております。ちなみにlogin.jspにて入力したユーザーIDとパスワードをSystem.out.println(~)にてちゃんと値が格納されているか確認をしたところ、しっかりコンソールにて出力されていました。

session.setAttribute("userbeanses", ub)で値を設定後、別のサーブレットでUserBean ub = (UserBean) session.getAttribute("userbeanses");するとnullになってしまう理由が理解できません....(get/setしているはずなのに)

多数の長いソースコードを張り付けて申し訳ありませんがご協力本当によろしくお願いいたします。

補足情報(FW/ツールのバージョンなど)

サーバー:Tomcat8.0vサーバー

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/04/23 12:39

とりあえず teratailとは のリンクを確認してマークダウンに変えて
shimchan1010

2020/04/23 16:19

マークダウンにした方が見やすいですね(笑)質問するのが初めてなもので、、(汗)ご指摘いただきありがとうございます。
guest

回答1

0

すみません。答えではないのですが。思考の参考になれば幸いです。
いくつか確認した方がよさそうなことを挙げてみます。

1つ目。エラーのMainPage.User_MainPageServlet.doPost(User_MainPageServlet.java:36)の36行目というのは、if(userid_login == ub.getUserid() && password_login == ub.getPassword())で合っていますか?私のエディタでは36行目はこの行でしたが、コードを貼り付ける際に整形などしていると、行数がずれてしまうので確認しています。
この行だとすると、NullPointerException が起こるのはubがnullだからですね。なので、

ちなみにlogin.jspにて入力したユーザーIDとパスワードを・・・

これらの入力値が格納されているかどうかは、今回の問題とは関係なさそうです。

もう一つ確認です。User_RegisterServlet.java のフォワード先が、お示し頂いた jsp にない
url = "/WEB-INF/Login_Register/register_end.jsp";
のようですが、この jsp に飛んだあと、問題の login.jsp で操作をするまでにブラウザを閉じたりしていますか?sessionに格納した情報は、ブラウザを閉じたり、タイムアウトしたりすると失われてしまいます。

それから、User_MainPageServlet.java のHttpSession session = request.getSession();ですが、実はgetSession()には引数があります。

"getSession"メソッドは、サーブレットを要求してきたクライアントに対してセッションが既に開始されていればそのセッションを返します。また引数に"ture"を指定した場合にはセッションが開始されていなければ新規にセッションを開始した後でそのセッションを返してきます。引数に"false"を指定した場合、セッションが存在しない場合にはnullが帰ってきます。

引用:セッションについて

引数なしの場合のデフォルトはtrueです。なので今回の場合、もしsessionが空なら、この行で新規にセッションを開始していることになります。その点を確認するため、HttpSession session = request.getSession(false);としたうえで、変数session をデバッグしてみてはいかがでしょうか。

投稿2020/05/12 14:57

hamham-km

総合スコア24

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問