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

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

ただいまの
回答率

90.02%

データベースに登録済みの人が、ログインするコードを書きたいです。なぜコンパイルエラーが出るのでしょうか?

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 5,375

edoooooo

score 159

Login.javaで Mutterをimportしているのに、if(mutterList.getUserPass()!=null && mutterList.getUserName()!=null){
//の下線にコンパイルエラーがでるのでしょうか?

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

 コードの順番は、実際の流れを元に書きました。
 まず、フィールドとなるMutter.java,User.java
 そして、最初の画面でリクエストパラメータ(name,pass)の送信元となるindex.jsp
 次に、送信先となるLogin.java(servlet),
  Login.javaの中でnewされデータベースと関わるfindAll()を持つexecute()を持つLoginLogic.java(model)
  最後に、そのfindAll()を持つMutterDAO.java(model)
 の順番に記載しています。

 どうぞよろしくお願いします。

Mutter.java(model)です。

package model;

import java.io.Serializable;

public class Mutter implements Serializable{


    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はログインの時に使う

    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;}
    }

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 java.util.ArrayList;

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.LoginLogic;

//ここで Mutterをimportしているのに、if(mutterList.getUserPass()!=null && mutterList.getUserName()!=null){
//の下線にコンパイルエラーがでるのでしょうか?
import model.Mutter;
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();

        //リクエストパラメータ(index.jsp)でsubmitで送信したnameとpassに対応した(MutterDAOでWHERE句で指定)PASSとNAMEをSELECTして、それらをuserNameとuserPassに代入
        //して、それらがnullでないかをif文で確認
        if(mutterList.getUserPass()!=null && mutterList.getUserName()!=null){
          //nullでない場合は,
            //User情報をセッションスコープに保存
            HttpSession session=request.getSession();
            session.setAttribute("loginUser", user);

            //ログイン結果画面にフォワード
        RequestDispatcher dispatcher=request.getRequestDispatcher("/WEB-INF/jsp/loginResult.jsp");
        dispatcher.forward(request,response);
        }else{
            //nullだった場合は、
            response.sendRedirect("/example24/");
            //ログイン画面にリダイレクト
        }
    }
}


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(){
        MutterDAO dao=new MutterDAO();
            List<Mutter>mutterList=dao.findAll();
            return mutterList;
            //mutterListを呼び出し元のLogin.java(servlet)に返す
    }
}


MutterDAOです。

//書き換え完了(データベースからの取得内容とnew mutterの内容を変更

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(){
        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;
}

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+1

mutterListがMutterでなくList型だからですね。
Mutterのメソッドを使いたいならListから要素を取得してそれに対してメソッドのコールする必要があります。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/04/24 16:44

    ありがとうございます。

    Main.java(servletでやろうとしていたことをrequest先のloginResult.jspでやることにしました。
    リクエストスコープにmutterListを入れて、for文で変数mutterに代入しmutter.getUseName()で呼び出しました。

    //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>

    //Login.java(servlet)です。
    package servlet;

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

    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;
    //ここで Mutterをimportしているのに、if(mutterList.getUserPass()!=null && mutterList.getUserName()!=null){
    //の下線にコンパイルエラーがでるのでしょうか?
    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();

    //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);

    }
    }


    もう一つのMutterDAOのほうは、引数にuserを(色々な呼び出し元にも)入れたところ、
    コンパイルエラーが消えました。
    ありがとうございました。

    キャンセル

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

  • ただいまの回答率 90.02%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる
  • トップ
  • Javaに関する質問
  • データベースに登録済みの人が、ログインするコードを書きたいです。なぜコンパイルエラーが出るのでしょうか?