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

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

ただいまの
回答率

89.65%

javaでelseになってしまいます。どうぞよろしくお願いします。

解決済

回答 2

投稿 編集

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

edoooooo

score 159

このようなLogin.Servletのコードでif文がelseに、なってしまいます。どのように改善すればいいのでしょうか?よろしくお願いします。

consoleには、このような警告が出ます。警告: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to 'org.eclipse.jst.jee.server:i' did not find a matching property.
11 21, 2015 1:00:40 午後 org.apache.tomcat.util.digester.SetPropertiesRule begin
  
  H2databaseで、SELECT * FROM ACCOUNT;と実行すると、このような表が出てきます。

  USER_ID  PASS   MAIL                              NAME      AGE
minato    1234       minato@sukkiri.com    灘 雄輔    23

 ログインする時は、ユーザーID minato  パスワード 1234 と入力しています。



//LoginServlet.java(loginの判定をするクラス)
package servlet;

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

@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet{
    private static final long serialVersionUID=1L;
    
    protected void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{
        
        //フォワード
        RequestDispatcher dispatcher=request.getRequestDispatcher("/WEB-INF/jsp/login.jsp");
        dispatcher.forward(request, response);
    }
protected void doPost(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{
        
        //リクエストパラーメータの取得
        request.setCharacterEncoding("UTF-8");
        String userId=request.getParameter("userId");
        String pass=request.getParameter("pass");
        
        //ログイン処理の実行
        Login login=new Login(userId,pass);
        LoginLogic bo=new LoginLogic();
        boolean result=bo.execute(login);
        
        //ログイン処理の成否によって処理を分岐
        if(result){//ログイン成功時
            
            //sessionスコープにユーザーIDを保存
            HttpSession session=request.getSession();
            session.setAttribute("userId",userId );
            
            //フォワード
            RequestDispatcher dispatcher=request.getRequestDispatcher("/WEB-INF/jsp/loginOK.jsp");
            dispatcher.forward(request, response);
        }else{//ログイン失敗時
            //フォワード
            RequestDispatcher dispatcher=request.getRequestDispatcher("/WEB-INF/jsp/tuika.jsp");
            dispatcher.forward(request, response);
        }






//H2databaseとの接続(AccountDAO.java)
package dao;


import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import model.Account;
import model.Login;

public class AccountDAO{
    public Account findByLogin(Login login){
        Connection conn=null;
        Account account=null;
        try{
            //JDBCドライバを読み込む
            Class.forName("org.h2.Driver");
            
            //データベースに接続
            conn=DriverManager.getConnection("jdbc:h2:file:/Users/taichi/Documents/newworkspace/sukkiriShops/h2data.dat","sa","");
            
            //SELECT文を準備
            String sql="SELECT USER_ID,PASS,MAIL,NAME,AGE FROM ACCOUNT WHERE USER_ID=? AND PASS=?";
            PreparedStatement pStmt=conn.prepareStatement(sql);
            pStmt.setString(1,login.getUserId());
            pStmt.setString(2, login.getPass());
        //SELECT 文を実行し、結果表を取得
            ResultSet rs=pStmt.executeQuery();
            
            //一致したユーザーが存在した場合
            //そのユーザーを表すAccountインスタンスを生成
            if(rs.next()){
                //結果表からデータを取得
                String userId=rs.getString("USER_ID");
                String pass=rs.getString("PASS");
                String mail=rs.getString("MAIL");
                String name=rs.getString("NAME");
                int age=rs.getInt("AGE");
                
                account =new Account(userId,pass,mail,name,age);
            }
        }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;
                }
            }
        }
        //見つかったユーザーまたはnullを返す
        return account;
    }
}






//LoginLogic.javaです。
package model;

import dao.AccountDAO;

public class LoginLogic {
public boolean execute(Login login){
    AccountDAO dao=new AccountDAO();
    Account account=dao.findByLogin(login);
    return account !=null;
    
}
}

どうぞよろしくお願いします。
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • 退会済みユーザー

    退会済みユーザー

    2015/11/21 13:41

    記載されているソースコードを確認するとif文が二か所存在します。
    現状の質問内容ですと、どちらのif文の話をしているのかが判断できないです。
    LoginServletの話をしているのでしたらLoginLogicについてもソースコードの記載をお願い致します。

    キャンセル

  • edoooooo

    2015/11/21 13:44

    回答ありがとうございます。追加いたしました。どうぞよろしくお願いします

    キャンセル

回答 2

checkベストアンサー

+1

Exceptionが発生したものの、それをcatchしたときにスタックとレースがどこかにリダイレクトされていてコンソールに出ていないだけということはありませんでしょうか? try,catchを取り去って動かしてみると、画面にエラーが表示されるってことはないですか?

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/11/21 20:58 編集

    すみません、コンパイルエラーです。
    Unhandled exception type SQLException 
    2quick fixes available
    add throws declaration
    Srround with try/catch と、赤線にカーソルを合わせると出て来ます。どのように消せばいいのでしょうか?
    conn.closeは上のコードのように変更しました。
    googleで、検索したところ、このように出たのですが、これでいいのでしょうか?
    rset.close();
    stmt.close();
    これも先ほどのコードに追加しました。
    どうぞよろしくお願いします。

    キャンセル

  • 2015/11/21 21:32

    本来はおっしゃるようにtry、catchで囲むのが正しいコーディングです。デバッグの段階では、エラーの内容がつかめないことには対処のしようがありませんので、外してみたらどうかと提案させて頂きました。
    "Unhandled exception type SQLException"は メソッドの宣言のところ「でthrows SQLException」と書いてあげれば解消しますよ。

    キャンセル

  • 2015/11/21 22:24 編集

    ありがとうございます。コメントアウトを綺麗にやり直そうとしたところ、コンパイルエラーが変わってしまいました。

            rset.close();
    stmt.close();
    のrset と、stmtの2つの文字に、赤線がついて、
    rset cannot be resolved
    20quick fixes available
    Create local variable 'rset'
    Create field 'rset'
    Create parameter 'rset'
    Create class 'rset'
    Create constant'rset'
    Change to'rs'
    というコンパイルエラーに変わってしまいました。色々と調べてみます。ありがとうございました。

    キャンセル

+1

LoginLogicのexecuteでfalseが返却されているので、Account情報が取得できていないということですね。
とりあえず順番に原因調査を行いましょう。
1.JDBCでのDBへの接続は問題なくできているか
2.SELECT文を発行した結果、想定する値が取得できているか
おそらく確認ポイントはこの二か所だけだと思います。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/11/21 15:45

    ありがとうございます。もう一つのsnsのコードに組み込んで、動かしてみます。
    ありがとうございます。

    キャンセル

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

  • ただいまの回答率 89.65%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる