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

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

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

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

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Tomcat

TomcatはApache Software Foundation (ASF)で開発されたオープンソースのWebコンテナです。

Q&A

解決済

2回答

2639閲覧

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

edoooooo

総合スコア476

Java

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

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Tomcat

TomcatはApache Software Foundation (ASF)で開発されたオープンソースのWebコンテナです。

0グッド

0クリップ

投稿2015/11/21 04:17

編集2015/11/21 04:51

このような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;

}
}

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

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2015/11/21 04:41

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

2015/11/21 04:44

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

回答2

0

ベストアンサー

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

投稿2015/11/21 08:24

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

edoooooo

2015/11/21 11:59 編集

ありがとうございます。try,catchを取り除こうとして、コメントアウトしようとして、//や/* */を書いてみたのですが、エラーが大量に、出てしまいます。場所が間違っているのでしょうか?すみませんよろしくお願いします。   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/endoutaichi/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();          rset.close();         stmt.close(); /* }catch(SQLException e){ e.printStackTrace(); return null; } } } */ //見つかったユーザーまたはnullを返す return account; } }
退会済みユーザー

退会済みユーザー

2015/11/21 10:57

「エラーが大量に」というのはどのようなエラーでしょうか? 文法上は間違ってなさそうです。  今気づいたのですが、StatementやResultSetがclose()されていない点も気になります。これらがcloseせずに何度も実行した結果、SQLExceptionが発生していてnullが返されているというのが私の仮説です。 Connectionは元々closeしていたけどコメントアウトされたので、最終的にはcloseしないとセッションリークを起こします。
edoooooo

2015/11/21 12:10 編集

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

退会済みユーザー

2015/11/21 12:32

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

2015/11/26 00:52 編集

ありがとうございます。コメントアウトを綺麗にやり直そうとしたところ、コンパイルエラーが変わってしまいました。         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' というコンパイルエラーに変わってしまいました。色々と調べてみます。ありがとうございました。
guest

0

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

投稿2015/11/21 05:18

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

edoooooo

2015/11/21 06:45

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問