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

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

ただいまの
回答率

90.22%

ログインだけのアプリケーションを作ったのですが、nullpointとなってしまいます。どうぞよろしくお願いします。

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,256

edoooooo

score 159

すでにデータベースでCREATE TABLBE やINSERT をすませログイン時に入力した
nameとpassが一致したらログインできるコードを書きました。しかしログイン時にnullpointとなってしまいます。

エラーには、loginResult.jspの     <% for(Mutter mutter:mutterList){ %>
<p><%if(mutterList!=null && mutter.getUserName()!=null && mutter.getUserPass()!=null){ %>
    </p>のなかだと思うのですがわかりません.
どうぞよろしくお願いします。

エラー

HTTP Status 500 - java.lang.NullPointerException

type Exception report

message java.lang.NullPointerException

description The server encountered an internal error that prevented it from fulfilling this request.

exception

org.apache.jasper.JasperException: java.lang.NullPointerException
    org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:556)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:477)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:395)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:339)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    servlet.Login.doPost(Login.java:63)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:650)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
root cause

java.lang.NullPointerException
    org.apache.jsp.WEB_002dINF.jsp.loginResult_jsp._jspService(loginResult_jsp.java:110)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:439)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:395)
//字数制限のため省略させていただきました。


index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>ログインだけのやつ</title>
</head>
<body>
<h1>ログインだけのやつにようこそ</h1>
<form action="/example24/Login" method="post">
ユーザー名:<input type="text" name="name"><br>
パスワード:<input type="password" name="pass"><br>
<input type="submit" value="ログイン">
</body>
</html>


Login.java(servlet)

package servlet;

import java.io.IOException;
import java.util.List;

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 model.GetMutterListLogic;
import model.LoginLogic;

import model.Mutter;
//import model.PostMutterLogic;
import model.User;


@WebServlet("/Login")
public class Login extends HttpServlet {
    private static final long serialVersionUID = 1L;


    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //リクエストパラメータの取得
        request.setCharacterEncoding("UTF-8");
        String name=request.getParameter("name");
        String pass=request.getParameter("pass");

        //Userインスタンス(ユーザー情報お)の生成
        User user=new User(name,pass);

        //ログイン処理

        LoginLogic loginLogic=new LoginLogic();
        //execute()で帰ってきたmutterListを代入
        List<Mutter>mutterList=loginLogic.execute(user);

        //mutterListをリクエストスコプに保存?
                request.setAttribute("mutterList", mutterList);
            /*    }else{
                    //エラーメッセージ
                    request.setAttribute("errorMsg","つぶやきが入力されていません");
        */
                //このエラーメッセージは、どちらにしろ変更の必要はあるがとりあえず今は、エラーは、表示しない Redirectだけにしておく


        //リクエストパラメータ(index.jsp)でsubmitで送信したnameとpassに対応した(MutterDAOでWHERE句で指定)PASSとNAMEをSELECTして、それらをuserNameとuserPassに代入
        //して、それらがnullでないかをif文で確認 
                //これは、LoginResult.jspでやる 

                //これは、jspでの記入方法がわからなかったため
                //ここに書く
            HttpSession session=request.getSession();
                session.setAttribute("loginUser", user);
            //ログイン結果画面にフォワード
        RequestDispatcher dispatcher=request.getRequestDispatcher("/WEB-INF/jsp/loginResult.jsp");
        dispatcher.forward(request,response);

        }
    }


LoginLogic.java(model)

package model;
import java.util.List;
import dao.MutterDAO;
public class LoginLogic {
    //GetMutterListLogicのfindAll()やnew MutterDAOをここでやる

    //Login.java(serlvetのexecuteめそっとのコードにコンパイルエラーが出るからここでstaticに変更
    public static List<Mutter>execute(User user){
        MutterDAO dao=new MutterDAO();
            List<Mutter>mutterList=dao.findAll(user);
            return mutterList;
            //mutterListを呼び出し元のLogin.java(servlet)に返す
    }
}


MutterDAO.java(dao)

package dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

//ここでUserをimportしているのに,なぜpStmt.setString(1, user.getName());
//pStmt.setString(2, user.getPass());のuserの下線にコンパイルエラーが出るのでしょうか?
import model.User;
import model.Mutter;

public class MutterDAO {

    private final String DRIVER_NAME="org.h2.Driver";
    private final String JDBC_URL="jdbc:h2:file:/Users/endo/Documents/networkspace/example23/h2data.dat";
    private final String DB_USER="sa";
    private final String DB_PASS="";

    public List<Mutter>findAll(User user){
        Connection conn=null;
        List<Mutter>mutterList=new ArrayList<Mutter>();
        try{
        Class.forName(DRIVER_NAME);
        conn=DriverManager.getConnection(JDBC_URL,DB_USER,DB_PASS);

        String sql="SELECT NAME,PASS FROM MUTTER WHERE NAME=(?)AND PASS=(?)";
        PreparedStatement pStmt=conn.prepareStatement(sql);
        //Insert文中の「?」に使用する値を設定しSQLを完成
        pStmt.setString(1, user.getName());
        pStmt.setString(2, user.getPass());

        //SELECTを実行
        ResultSet rs=pStmt.executeQuery();

        //SELECT文の結果をArrayList二格納
        while(rs.next()){

        //データベースのNAMEとPASSをuserNameとuserPass二代入
            String userName=rs.getString("NAME");
            //ここもString text=rs.getString("TEXT");
            String userPass=rs.getString("PASS");

        Mutter mutter=new Mutter(userName,userPass);
            mutterList.add(mutter);
        }
    }catch(SQLException e){
        e.printStackTrace();
        return null;
    }catch(ClassNotFoundException e){
        e.printStackTrace();
        return null;
    }finally{
        //データベース切断
        if(conn!=null){
            try{
                conn.close();
            }catch(SQLException e){
                e.printStackTrace();
                return null;
            }
        }
    }
    return mutterList;
}

}


loginResult.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@ page import="model.User,model.Mutter,java.util.List" %>
    <%
    //セッションスコープからユーザー情報を取得
    User loginUser=(User)session.getAttribute("loginUser");
    //リクエストスコープに保存されたつぶやきリストを取得
    List<Mutter>mutterList=(List<Mutter>)request.getAttribute("mutterList");

    %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>ログインのみ(データベースから)</title>
</head>
<body>
<h1>ログイン</h1>
//リクエストパラメータ(index.jsp)でsubmitで送信したnameとpassに対応した(MutterDAOでWHERE句で指定)PASSとNAMEをSELECTして、それらをuserNameとuserPassに代入
        //して、それらがnullでないかをif文で確認

        <% for(Mutter mutter:mutterList){ %>
<p><%if(mutterList!=null && mutter.getUserName()!=null && mutter.getUserPass()!=null){ %>
    </p>
<p>ログインに成功しました。</p>
<p>ようこそ<%=loginUser.getName() %>さん</p>

<%}else{ %>
<p>ログインに失敗しました。</p>
<a href="/example24/">TOPへ</a>
<%}} %>

</body>
</html>


Mutter.java(model)

package model;
import java.io.Serializable;

public class Mutter implements Serializable{

    //変数を変更 そして、methodの変数も変
    //本当は、id,UserName,textなのだが、textを無しにして、passをデータベースから取得して、ログインできるか確認したいからUserpassに変更
    private String userName;
    private String userPass;

    public Mutter(){}
    public Mutter(String userName,String userPass){
        this.userName=userName;
        this.userPass=userPass;
    }
    public String getUserName(){return userName;}
    public String getUserPass(){return userPass;}

    }


User.java(model)

package model;
import java.io.Serializable;
public class User implements Serializable{
    //Userはログインの時に使う
    //Mutter.java(model)にあるUserNameはこのnameから派生して作られたもの?か確認、そしてたに作った、UserPassは、どうやって作成するか考えコードを書く
    private String name;
    private String pass;

    public User(){}
    public User(String name,String pass){
        this.name=name;
        this.pass=pass;
    }
    public String getName(){return name;}
    public String getPass(){return pass;}
    }


データベースので入力したコード
CREATE TABLE MUTTER(
NAME VARCHAR(100) NOT NULL,
PASS VARCHAR(255) NOT NULL);

INSERT INTO MUTTER(NAME,PASS)VALUES('灘','1234');

INSERT INTO MUTTER(NAME,PASS)VALUES('綾部','2345');

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • takasima20

    2016/04/24 17:33

    せめて、どのソースのどこらへんでエラーになったかくらいは提示できませんか?
    まるごと(しかも机上で)デバッグしてといわれても…

    キャンセル

  • edoooooo

    2016/04/24 17:39 編集

    申し訳ありませんでした。
    エラーには、loginResult.jspの  <% for(Mutter mutter:mutterList){ %>
    <p><%if(mutterList!=null && mutter.getUserName()!=null && mutter.getUserPass()!=null){ %>
    </p>のなかだと思うのですが、
    記載したコードの並び順は、実行した時にたどる順番になっています。(フィールドのMutter,User以外)どうぞよろしくお願いします。

    キャンセル

回答 1

checkベストアンサー

+1

<h1>ログイン</h1>
//リクエストパラメータ(index.jsp)でsubmitで送信したnameとpassに対応した(MutterDAOでWHERE句で指定)PASSとNAMEをSELECTして、それらをuserNameとuserPassに代入
        //して、それらがnullでないかをif文で確認

        <% for(Mutter mutter:mutterList){ %>
<p><%if(mutterList!=null && mutter.getUserName()!=null && mutter.getUserPass()!=null){ %>
    </p>
<p>ログインに成功しました。</p>
<p>ようこそ<%=loginUser.getName() %>さん</p>

<%}else{ %>
<p>ログインに失敗しました。</p>
<a href="/example24/">TOPへ</a>
<%}} %>


すぐに思いつくことというと…
mutterList!=null の判定は for の前でやらないとまずい
ってことスかね。また違う問題が判明するかもですが
それはまた別途デバッグしていただくということで…

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/04/24 17:59

    ありがとうございます。変更してみます。
    今までは、本を写していただけで、これは新たに追加したいコードを書いてみたのですが、すぐにわからないことが出てきて、勉強の順序として間違えていませんでしょうか?
    どのような初心者も同じ状態になるのでしょうか?どうぞよろしくお願いします。

    キャンセル

  • 2016/04/24 18:06

    無事ログインできました。ありがとうございます。
    しかし、どんなパスワード,どんなIDでも、ログインできてしまいます。
    nullpointの問題は解決したので、別の質問で続きは、質問させていただきます。
    ありがとうございました。 もしよろしければ、どうぞ宜しくお願いします。

    キャンセル

  • 2016/04/24 18:10

    知らない時に参考となるものを写すのは問題ないと思います。
    ただ、できるだけ内容を理解するようつとめましょう。
    数をこなせばそのうち見えてくるものもあります。 :-)

    キャンセル

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

  • ただいまの回答率 90.22%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる
  • トップ
  • Javaに関する質問
  • ログインだけのアプリケーションを作ったのですが、nullpointとなってしまいます。どうぞよろしくお願いします。