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

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

新規登録して質問してみよう
ただいま回答率
85.50%
JSP

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

NullPointerException

null値の参照型変数を参照しようとした場合に投げられる、Javaにおける例外のひとつです。

Java

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

スコープ

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

サーブレット

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

Q&A

1回答

7034閲覧

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

shimchan1010

総合スコア6

JSP

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

NullPointerException

null値の参照型変数を参照しようとした場合に投げられる、Javaにおける例外のひとつです。

Java

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

スコープ

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

サーブレット

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

0グッド

0クリップ

投稿2020/04/24 05:26

編集2022/01/12 10:55

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
プログラム経験のない新卒一年目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.equals(ub.getUserid()) && password_login.equals(ub.getPassword())) { url = "/WEB-INF/Menu/mainmenu.jsp"; }else{ 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.equals(ub.getUserid()) && password_login.equals(ub.getPassword())) { url = "/WEB-INF/Menu/mainmenu.jsp"; }else{ 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ページで確認できます。

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

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

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

dodox86

2020/04/24 05:54

回答ではないのでコメントのみです。 > User_Registerervlet.javaの☆部分にて > User_MainPageServlet.javaの〇部分にて ☆も〇も見当たりませんので該当箇所が分からないです。(例外のメッセージにソースコードの行番号は出ていますが、質問文中に張り付けた段階で一致しているとは限りません) で、仮にNullPointerExceptionが直ったとして、質問者さんのコード中には、Stringの比較に多数、以下のようなものがあります。 if (userid_login == ub.getUserid()... ) これらは意図的なものでしょうか。String/文字列の比較は(==)では正しくできません。
shimchan1010

2020/04/24 06:33

コメントいただき、ありがとうございます。 エラー部分や確認部分を☆と〇で付け加えまして、該当箇所をわかるようにしました。 またStringの比較を(==)をしていたところを(.equals)という形に修正しました。 ですが、エラーは改善されない状態でございます。 ご指摘いただき、ありがとうございます。
shimchan1010

2020/04/24 10:30

すみません、、、、、、、先程運営側に削除依頼を出しました。 以後気をつけます、、、、、。
xebme

2020/04/25 18:55 編集

ちょっと見ただけで不具合がありそうなことはわかります。追記をお願いします。 ・ログインのシナリオを記述してください。 ・login.jspにアクセスしたらHttpSessionがつくられてしまうのは知っていますか? login.htmlにするか、jspに<%@ page session="false"%>することの意味は? ・ログインのシナリオで以下を使い分けなければならないことがわかっていますか? HttpSession session = request.getSession(false); HttpSession session = request.getSession(true); ・ログアウトのシナリオが適切ですか? session .invalidate()はどこで実行していますか?
xebme

2020/04/26 05:01

・セッションタイムアウトの設定は?追記してください。 ・ブラウザのcookie使用の有無は?追記してください。 ・HTTPデバッガの使い方を知っていますか。 この課題を始める前に教わっているはずです。教わったかどうか追記してください。
guest

回答1

0

私の方で試したところ、問題は再現しませんでした。ですので、質問者さんの問題を直接的に解決する回答ではありません:

まず、こちらで試した環境は以下です。

  • Windows10 Pro. WSL(Ubuntu)
  • openjdk 1.8.0_252
  • apache-tomcat-8.5.54
  • Google Chrome 81.0.4044.122

質問文中にご提示のファイルは「UserBean.java、User_RegisterServlet.java、login.jsp、User_MainPageServlet.java」の4つですが、本当は Menu/mainmenu.jspや、Login_Register/login_error、User/UserAuthBean.javaなど、もっとファイルがあるはずです。足りないのでその辺は適当に修正して検証しています。

恐らく一番最初に、ユーザー登録の為のhtmlかjspからサーブレットであるUser_RegisterServletを呼ぶ作りになっているのだと思いますが、User_RegisterServletの以下の部分では、ub_testは有効な値になっていました。これは質問者さんの意図する動きだと思います。

Java

1HttpSession session = request.getSession(); 2session.setAttribute("userbeanses", ub); 3UserBean ub_test = (UserBean) session.getAttribute("userbeanses"); 4 5/*セッションスコープに保存されているかの確認*/ 6System.out.println(ub_test.getName());

ub_testnullのままとなるのは考えづらく、そうであればの部分でNullPointerExceptionとなるのは、ub_test.getName()nullを返していることが考えられます。(ただ、その前のコードでもSystem.out.println(ub.getName());とのように参照しているので、ここでエラーが起きないのもおかしいですが)

このUser_RegisterServletサーブレットはユーザー登録を想定したものだと思いますが、このサーブレットを呼び出す「ユーザー登録画面」のhtmlのフォームは、以下のようなものではありませんか。

html

1<!DOCTYPE html> 2<html> 3<head> 4<meta charset="UTF-8"> 5<title>ユーザー登録</title> 6</head> 7<body> 8ユーザー登録 9 <form method="POST" action="/成果物/MainPage/User_RegisterServlet"> 10 name:<input type="text" name="name" value="Hoge"><br><br> 11 age:<input type="text" name="age" value="20"><br><br> 12 birth:<input type="text" name="birth" value="30"><br><br> 13 <input type="submit" value="送信"> 14 <input type="reset" value="リセット"> 15 </form> 16</body> 17</html>

ここでフォームのパラメータnameが正しくセットされていないと、サーブレット中のString name= request.getParameter("name");のコードでnullになるはずです。それが後々影響して、nullの参照になっているかもしれません。

他には、sessionが取り出せないとすれば、ブラウザーのクッキー(Cookie)が使用できなくなっていることが考えられます。ブラウザーでクッキーやキャッシュの削除をして再度試してみると、状況が変わるかもしれません。再度、確認してみてください。

投稿2020/04/25 16:05

編集2020/04/25 16:09
dodox86

総合スコア9183

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

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

shimchan1010

2020/04/26 02:08

すみません。ご回答いただきありがとうございます。 指摘点につきまして 「このUser_RegisterServletサーブレットはユーザー登録を想定したものだと思いますが、このサーブレットを呼び出す「ユーザー登録画面」のhtmlのフォームは、以下のようなものではありませんか。」  ⇒ユーザー登録画面のJSPを確認したところ、しっかりnameが正しくセットされているかと思います。 ソースコードとしては、少し長いですが、以下の通りとなっております。 ``` <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ヘルスケア-会員登録 </title> </head> <body> <center> <h1> 『会員登録』 </h1> </center> <form method="POST" action="/成果物/MainPage/User_RegisterServlet"> <center> 名前:<input type="text" name="name"><br><br> 性別:男<input type="radio" name="sex" value = "男"> 女<input type="radio" name="sex" value = "女"><br><br> 年齢:<input type="text" name="age">歳<br><br> 生年月日:<select name="year"> <option value="">-</option> <option value="1900">1900</option> <option value="1901">1901</option> <option value="1902">1902</option> <option value="1903">1903</option> <option value="1904">1904</option> <option value="1905">1905</option> <option value="1906">1906</option> <option value="1907">1907</option> <option value="1908">1908</option> <option value="1909">1909</option> <option value="1910">1910</option> <option value="1911">1911</option> <option value="1912">1912</option> <option value="1913">1913</option> <option value="1914">1914</option> <option value="1915">1915</option> <option value="1916">1916</option> <option value="1917">1917</option> <option value="1918">1918</option> <option value="1919">1919</option> <option value="1920">1920</option> <option value="1921">1921</option> <option value="1922">1922</option> <option value="1923">1923</option> <option value="1924">1924</option> <option value="1925">1925</option> <option value="1926">1926</option> <option value="1927">1927</option> <option value="1928">1928</option> <option value="1929">1929</option> <option value="1930">1930</option> <option value="1931">1931</option> <option value="1932">1932</option> <option value="1933">1933</option> <option value="1934">1934</option> <option value="1935">1935</option> <option value="1936">1936</option> <option value="1937">1937</option> <option value="1938">1938</option> <option value="1939">1939</option> <option value="1940">1940</option> <option value="1941">1941</option> <option value="1942">1942</option> <option value="1943">1943</option> <option value="1944">1944</option> <option value="1945">1945</option> <option value="1946">1946</option> <option value="1947">1947</option> <option value="1948">1948</option> <option value="1949">1949</option> <option value="1950">1950</option> <option value="1951">1951</option> <option value="1952">1952</option> <option value="1953">1953</option> <option value="1954">1954</option> <option value="1955">1955</option> <option value="1956">1956</option> <option value="1957">1957</option> <option value="1958">1958</option> <option value="1959">1959</option> <option value="1960">1960</option> <option value="1961">1961</option> <option value="1962">1962</option> <option value="1963">1963</option> <option value="1964">1964</option> <option value="1965">1965</option> <option value="1966">1966</option> <option value="1967">1967</option> <option value="1968">1968</option> <option value="1969">1969</option> <option value="1970">1970</option> <option value="1971">1971</option> <option value="1972">1972</option> <option value="1973">1973</option> <option value="1974">1974</option> <option value="1975">1975</option> <option value="1976">1976</option> <option value="1977">1977</option> <option value="1978">1978</option> <option value="1979">1979</option> <option value="1980">1980</option> <option value="1981">1981</option> <option value="1982">1982</option> <option value="1983">1983</option> <option value="1984">1984</option> <option value="1985">1985</option> <option value="1986">1986</option> <option value="1987">1987</option> <option value="1988">1988</option> <option value="1989">1989</option> <option value="1990">1990</option> <option value="1991">1991</option> <option value="1992">1992</option> <option value="1993">1993</option> <option value="1994">1994</option> <option value="1995">1995</option> <option value="1996">1996</option> <option value="1997">1997</option> <option value="1998">1998</option> <option value="1999">1999</option> <option value="2000">2000</option> <option value="2001">2001</option> <option value="2002">2002</option> <option value="2003">2003</option> <option value="2004">2004</option> <option value="2005">2005</option> <option value="2006">2006</option> <option value="2007">2007</option> <option value="2008">2008</option> <option value="2009">2009</option> <option value="2010">2010</option> <option value="2011">2011</option> <option value="2012">2012</option> <option value="2013">2013</option> <option value="2014">2014</option> <option value="2015">2015</option> <option value="2016">2016</option> <option value="2017">2017</option> <option value="2018">2018</option> <option value="2019">2019</option> <option value="2020">2020</option> <option value="2021">2021</option> <option value="2022">2022</option> <option value="2023">2023</option> <option value="2024">2024</option> <option value="2025">2025</option> <option value="2026">2026</option> <option value="2027">2027</option> <option value="2028">2028</option> <option value="2029">2029</option> <option value="2030">2030</option> </select> 年 <select name="month"> <option value="">-</option> <option value="1">1</option> <option value="2">2</option> <option value="3">3</option> <option value="4">4</option> <option value="5">5</option> <option value="6">6</option> <option value="7">7</option> <option value="8">8</option> <option value="9">9</option> <option value="10">10</option> <option value="11">11</option> <option value="12">12</option> </select> 月 <select name="day"> <option value="">-</option> <option value="1">1</option> <option value="2">2</option> <option value="3">3</option> <option value="4">4</option> <option value="5">5</option> <option value="6">6</option> <option value="7">7</option> <option value="8">8</option> <option value="9">9</option> <option value="10">10</option> <option value="11">11</option> <option value="12">12</option> <option value="13">13</option> <option value="14">14</option> <option value="15">15</option> <option value="16">16</option> <option value="17">17</option> <option value="18">18</option> <option value="19">19</option> <option value="20">20</option> <option value="21">21</option> <option value="22">22</option> <option value="23">23</option> <option value="24">24</option> <option value="25">25</option> <option value="26">26</option> <option value="27">27</option> <option value="28">28</option> <option value="29">29</option> <option value="30">30</option> <option value="31">31</option> </select> 日<br><br> 身長:<input type="text" name="tall">cm<br><br> 体重:<input type="text" name="weight">kg<br><br> ユーザーID:<input type="text" name="userid"><br><br> パスワード : <input type="password" name="password"><br><br> <input type="submit" value="送信"> <input type="reset" value="リセット"> </center> </form> </body> </html> ``` 「他には、sessionが取り出せないとすれば、ブラウザーのクッキー(Cookie)が使用できなくなっていることが考えられます。ブラウザーでクッキーやキャッシュの削除をして再度試してみると、状況が変わるかもしれません。再度、確認してみてください。」  ⇒ブラウザーにてクッキーやキャッシュを削除して再度試してみましたが、状況は変わりませんでした。 すみません、後は補足なのですが、今まで実行するときのWebブラウザを内部Webブラウザーにしていたのですが、Chromeに変更をし、実行をしたところ、IDとパスワードが一致していた時のmainmenu.jsp処理はうまくいったのですが、一致しないときにlogin_error.jspの処理を行う時にエラーが発生してしまいました。
shimchan1010

2020/04/26 02:10

すみません、コメントを返信する際のMarkdown手法がうまくできていなかったため、そのままの記述となってしまいました、申し訳ありません。
dodox86

2020/04/26 02:18 編集

> 内部Webブラウザーにしていたのですが、Chromeに変更をし、実行をしたところ、 内部Webブラウザーとは、何でしょう。サーブレット内の処理なのでブラウザは恐らく関係ないと思うのですが、一般的なchromeなどのブラウザーでまず確認することをお勧めします。 > IDとパスワードが一致していた時のmainmenu.jsp処理はうまくいったのですが、一致しないときにlogin_error.jspの処理を行う時にエラーが発生 それは本質問の「session/getAttributeがおかしいっぽい」とはまた別の問題なのではないですか。long_error.jspまで今までいかなかったのですよね。 > コメントを返信する際のMarkdown手法がうまくできていなかったため、そのままの記述となってしまいました、 コメント文中ではマークダウンは使えません。
shimchan1010

2020/04/26 02:39

>内部Webブラウザーとは、何でしょう。サーブレット内の処理なのでブラウザは恐らく関係ないと思うのですが、一般的なchromeなどのブラウザーでまず確認することをお勧めします。 内部Webブラウザーとは、Eclipse内部のブラウザーです。 ご指摘いただきありがとうございます。 >それは本質問の「session/getAttributeがおかしいっぽい」とはまた別の問題なのではないですか。long_error.jspまで今までいかなかったのですよね。 すみません、別の問題です。申し訳ありません。 はい、login_error.jspまで今までいきませんでした。ですが、不思議なことがおこりまして、Webブラウザーを変更して実行することで結果が変わってしまいます。 Webブラウザー - 内部Webブラウザー(Eclipse内部のブラウザー) ⇒質問通りのNullPointerエラーが起きる Webブラウザー - デフォルトのシステムWebブラウザ ⇒質問通りのNullPointerエラーが起きる Webブラウザー - InternetExplorer ⇒質問通りのNulPointerエラーが起きる Webブラウザー - Chrome ⇒login_error.jspまでいく(mainmenu.jsp処理成功、login_error.jsp処理失敗) 別問題かと思いますけど、記述してすみませn。 >コメント文中ではマークダウンは使えません。 了解しました、ご指摘いただきありがとうございます。
退会済みユーザー

退会済みユーザー

2020/04/26 03:00

エクリプスの内部ブラウザのcash、クッキーはメモリ上に展開してるので立ち上げなおすとセッションは継続されませんよ?
dodox86

2020/04/26 03:22 編集

eclipseは使っていないので、IE11のみ確認してみました。 ユーザー登録のJSPを適用し、Windows 10のIE11の設定を既定にリセットして試しましたが、こちらでは問題は再現しません。 > ⇒質問通りのNullPointerエラーが起きる とのことですが、まずは登録「User_RegisterServlet」の以下の該当部分を再度確認してください。 > /*セッションスコープに保存されているかの確認*/ > ☆System.out.println(ub_test.getName()); (1) ☆の行でNullPointerExceptionが起きているのは確実ですか。 (2) 確実であれば、この場合、ub_test がnullなのか、ub_test.getName()が返す値がnullなのか、どちらですか。 まず、それをはっきりさせるのが先決です。
dodox86

2020/04/26 03:24

※関係ない部分だと思いますが一応補足しておくと、こちらでの確認にあたって、"/成果物/MainPage/User_RegisterServlet"の"成果物"の部分は変更してます。
shimchan1010

2020/04/26 03:33

>(1) ☆の行でNullPointerExceptionが起きているのは確実ですか。 ☆の行ではNullPointerExceptionは起こっていません。起こっているのはUser_MainPageServlet.javaの〇部分です。 >(2) 確実であれば、この場合、ub_test がnullなのか、ub_test.getName()が返す値がnullなのか、どちらですか。 ub_test&ub_test.getName()はnullではありません。 〇部分を確認したところub.getUserid()の返す値がnullかと思われます。
dodox86

2020/04/26 03:48 編集

> 起こっているのはUser_MainPageServlet.javaの〇部分です。 これは失礼しました。ソースコードが足りなく、私の方で修正しているうちに見誤っていました。では、User_RegisterServletは問題ない、と言う認識で良いのですね。それならばもう、ページ遷移した先でセッションが維持できていない(クッキーが渡されていない)と言うことなので、 断言はできませんが、ブラウザの問題もあるかもしれませんね。実際、ChromeはOK、IEとEclipseの内部ブラウザはNGと言うことなので。 Chromeならば、UserBeanは正しく渡されているということで良いのですか。エラーは別の問題として。
dodox86

2020/04/26 03:56 編集

今現在、直接関係ないですが、request.getSession()は、遷移先ではrequest.getSession(false); で既存セッションの有無を判定すべきかもしれませんね。(気になったので一応指摘)
dodox86

2020/04/26 03:59

> 〇部分を確認したところub.getUserid()の返す値がnullかと思われます。 引き継がれていないセッション(つまり、User_MainPageServletで新規に作成してしまったセッション)でsession.getAttribute("userbeanses")しているから、UserBeanオブジェクトが存在しなく、nullになっているかも、です。
dodox86

2020/04/26 04:09

ん?、と言いますか、最初にlogin.jsp からMainPage/User_MainPageServlet へ遷移するのであれば、login.jsp でsession.getAttribute("userbeanses")のセッションを新規に 作らないといけないのではないですか?今、作っていませんね。Chromeと他のブラウザの挙動の違いはそこにあるかも。Chromeではずっと残っているセッション用のクッキーを再使用しているとか。
shimchan1010

2020/04/26 05:06

ご指摘いただき、ありがとうございます。たしかにlogin.jspでセッションを新規に作成するセッション処理を行っていませんでした(汗)一度作成し、実行を試みてみます...。
shimchan1010

2020/04/26 05:33

login.jspにてsession.getAttribute("userbeanses")のセッションを新規に作成する処理を行い、実行をしましたが、現状に変化はなくNullPointerExceptionが起こってしまいます。
dodox86

2020/04/26 05:36

いや、そうではなく、login.jspと言うのは、ユーザ登録後、いったんブラウザを閉じる可能性があるのですよね。そのようなケースであれば、セッションが途切れ、すなわち新規で作成しなければいけません。session.getAttribute("userbeanses")と言うのは、前段のrequest.getSession()で生成され、利用できるようになるものです。
dodox86

2020/04/26 05:38

ブラウザーを閉じるケースがあるのであれば、ユーザー登録で作られたセッション、つまりユーザー情報であるUserBeanのフィールドの値ですか、これはいったんどこかに保存しないと再ロードできません。これは一般的なWEBアプリならば、ユーザー情報を収めるデータベースです。
dodox86

2020/04/26 05:45

Chromeでも、ユーザー登録後、いったんブラウザーを閉じ、Chromeの設定からクッキーやキャッシュなど、全消去。ユーザー登録をせず、 最初からログイン画面(login.jsp)に入ると、セッションのクッキーは削除済みだと思うので、やはりNullPointerExceptionが起きる気がします。
xebme

2020/04/26 07:51 編集

横からすみません。セッションの新規作成ですが 、ブラウザを「再起動」して「ユーザー登録画面のJSP」にアクセスした時点で、JSESSIONIDが新規に作られます。このセッションが生きている限り情報が保持されたままになっているので全てのgetSession()にfalseを指定しても問題が起きないはず。 HttpSession session = request.getSession(false); sessionがnullならば、どこかで消滅していると考えられます。また、session.getId()して表示してください。 HttpSessionをデータベースの代わりに使っている以上、最初にUserBeanを登録したセッションが最後まで生きていなければならない。login.jspから新規セッションが始まってはならない。一般のログイン処理からすると変則的ですね。
xebme

2020/04/26 07:32

User_MainPageServletのdoPostの◯の部分でNullPointerExceptionが起きる候補 ・userid_login ・password_login ・ub Stringのequals(null)はNullPointerExceptionは起きません。デバッガを使うか、上の3つのオブジェクトの内容を表示するか、ifを複数行に記述するか、確認方法があるでしょう。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問