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

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

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

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

Q&A

解決済

2回答

624閲覧

Javaのリクエストセッションについてです。

TK.

総合スコア2

Java

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

0グッド

0クリップ

投稿2021/06/08 02:19

編集2021/06/08 03:45

Javaのリクエストセッションについてです。

サーブレットからjspに値を渡すため、リクエストセッションを用いているのですが、うまくいかないため質問させていただきます。
画像では、関数の結果(H2 Databaseより値を取得)を配列に渡し、その結果をリクエストセッションに設定しているのですが、
Nullで設定されjspでNullPointerExceptionとなります。

イメージ説明

Nullになる理由はなぜでしょうか。

開発環境:Eclipse

コードは以下となります。

Java

1・サーブレット 2@WebServlet("/Main") 3public class Main extends HttpServlet { 4 private static final long serialVersionUID = 1L; 5 6 /** 7 * @see HttpServlet#HttpServlet() 8 */ 9 public Main() { 10 super(); 11 // TODO Auto-generated constructor stub 12 } 13 14 /** 15 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 16 */ 17 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 18 // TODO Auto-generated method stub 19 GetMutterListLogic getMutterListLogic = new GetMutterListLogic(); 20 List<Mutter> mutterList = getMutterListLogic.execute(); 21 request.setAttribute("mutterList", mutterList); 22 23 24 HttpSession session = request.getSession(); 25 User loginUser = (User) session.getAttribute("loginUser"); 26 27 if(loginUser == null) { 28 response.sendRedirect("/docoTsubu/"); 29 }else { 30 RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/jsp/main.jsp"); 31 dispatcher.forward(request, response); 32 } 33 } 34 /** 35 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 36 */ 37 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 38 // TODO Auto-generated method stub 39 request.setCharacterEncoding("UTF-8"); 40 String text = request.getParameter("text"); 41 42 if(text !=null && text.length() !=0) { 43 44 HttpSession session = request.getSession(); 45 User loginUser = (User)session.getAttribute("loginUser"); 46 47 Mutter mutter = new Mutter(loginUser.getName(),text); 48 PostMutterLogic postMutterLogic = new PostMutterLogic(); 49 postMutterLogic.execute(mutter); 50 51 } else { 52 request.setAttribute("errorMsg", "入力されていません"); 53 } 54 GetMutterListLogic getMutterListLogic = new GetMutterListLogic(); 55 List<Mutter> mutterList = getMutterListLogic.execute(); 56 request.setAttribute("mutterList", mutterList); 57 58 RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/jsp/main.jsp"); 59 dispatcher.forward(request, response); 60 61 } 62} 63 64・JSP 65<%@ page language="java" contentType="text/html; charset=UTF-8" 66 pageEncoding="UTF-8"%> 67<%@ page import="model.User,model.Mutter,java.util.List" %> 68<% 69User loginUser = (User) session.getAttribute("loginUser"); 70List<Mutter>mutterList = (List<Mutter>) application.getAttribute("mutterList"); 71%> 72<!DOCTYPE html> 73<html> 74<head> 75<meta charset="UTF-8"> 76<title>test</title> 77</head> 78<body> 79<h1>どこつぶメイン</h1> 80<p> 81<%= loginUser.getName() %>さん、ログイン中 82<a href = "/docoTsubu/Logout">ログアウト</a> 83</p> 84<p><a href= "/docoTsubu/Main">更新</a></p> 85<form action = "/docoTsubu/Main" method="post"> 86<input type="text" name = "text"> 87<input type="submit" value= "つぶやく"> 88</form> 89<% for(Mutter mutter : mutterList) {%> 90 <p><%= mutter.getName() %>:<%= mutter.getText() %></p> 91 <%} %> 92</body> 93</html> 94 95・クラス 96public class Mutter implements Serializable{ 97 98 private String userName; 99 private String text; 100 private int id; 101 102 public Mutter() {} 103 public Mutter(String userName,String text) { 104 this.userName = userName; 105 this.text = text; 106 } 107 public Mutter(int id,String userName,String text) { 108 this.id = id; 109 this.userName = userName; 110 this.text = text; 111 } 112 public int getId() {return id;} 113 public String getName() {return userName;} 114 public String getText() {return text;} 115 }

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

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

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

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

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

neonemo

2021/06/08 02:33

サーブレットからjspへはどうやって切り替えさせていますか? ソースをスクショでなくテキストでご提示ください。 また、少なくとも私はスクショのソースだけで【Nullになる理由】には辿り着けません。 redirectなら、request変数のスコープ切れで値が取れないのは当然ですし、 forwardなら別の要因がありそうです。
m.ts10806

2021/06/08 02:39

コードは一部ではなく全体がわかる状態で、テキストでご提示ください
TK.

2021/06/08 03:45 編集

失礼しました 質問本文に記載しました
m.ts10806

2021/06/08 03:14

質問は編集できます。 こちらのコメント欄ではマークダウンが使えませんので原則本文に追記を。コードもマークダウン使ってくださいね。
K_3578

2021/06/08 03:48

ファイル毎に分けてくれた方が見やすいかなぁ。 ```Java @WebServlet("/Main") 以下略 ``` ```JSP <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 以下略 ``` って感じで
guest

回答2

0

ベストアンサー

RequestDispatcher#getRequestDispatcher()を使っているんでforwardですかね

って事で原因はこっちのJSPのじゃないですか?
application変数になってますけど、request変数にかえたらどうなりますか?

jsp

1List<Mutter>mutterList = (List<Mutter>) application.getAttribute("mutterList");

この辺はスコープ範囲も暗黙の変数自体も異なっているのでややこしいかも知れないですけど、把握された方が良いかと思います。

application変数: サーバ起動してから停止まで
session変数 : 1セッションまで(Cookieやアプリの作り、ブラウザ設定等いろんな条件で期間は変わる)
request変数 : 1リクエスト1レスポンスまで

投稿2021/06/08 03:56

編集2021/06/08 04:04
neonemo

総合スコア191

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

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

TK.

2021/06/08 04:15

回答ありがとうございます。 request変数で解決できました。 もう少しスコープ範囲など勉強し直します
neonemo

2021/06/08 04:47

はい、頑張ってください。
guest

0

Nullになる理由はなぜでしょうか。

その前の行でNullを返してるから、ですね

投稿2021/06/08 02:48

y_waiwai

総合スコア87747

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問