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

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

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

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

Java

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

サーブレット

サーブレット(Servlets)とはウェブやアプリケーションサーバー上に動くプログラムのことであり、ウェブブラウザや他のHTTPクライエントとデータベースやHTTPサーバー上のアプリケーションの中間層としての働きをします。

Q&A

解決済

1回答

3330閲覧

サーブレット/JSP ログイン画面作成について 画面遷移が出来ない

Jun0119

総合スコア1

JSP

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

Java

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

サーブレット

サーブレット(Servlets)とはウェブやアプリケーションサーバー上に動くプログラムのことであり、ウェブブラウザや他のHTTPクライエントとデータベースやHTTPサーバー上のアプリケーションの中間層としての働きをします。

0グッド

0クリップ

投稿2021/07/08 12:19

前提・実現したいこと

プログラミング初めて1か月で、初めてteratailを使います。どうしても分からず
質問させていただきます。イメージ説明
イメージ説明
サーブレット/JSP を使ってログイン画面作成をしようとしています。
DBを使ってid、パスワードが合っていれば成功時の画面遷移、失敗時の画面遷移まで行いたいです。

発生している問題・エラーメッセージ

Tomcatサーバーで実行してログイン画面は表示出来るのですが、
DBに登録してあるid,パスワードが合っているいないに関わらずログインボタンを押すと
何も表示されません。
URLを見てみると、
ログイン画面時は
http://localhost:8080/SampleLogin/jsp/login.jsp
でログイン画面のjspになっているのですが、ボタンを押すと
http://localhost:8080/SampleLogin/servlet/Login
とjspではなく、恐らくサーブレットのLogin.javaに飛んでしまいます。

javax.naming.NameNotFoundException: 名前 [jdbc/login] はこのコンテキストにバインドされていません at org.apache.naming.NamingContext.lookup(NamingContext.java:833) at org.apache.naming.NamingContext.lookup(NamingContext.java:160) at org.apache.naming.NamingContext.lookup(NamingContext.java:843) at org.apache.naming.NamingContext.lookup(NamingContext.java:160) at org.apache.naming.NamingContext.lookup(NamingContext.java:843) at org.apache.naming.NamingContext.lookup(NamingContext.java:174) at org.apache.naming.SelectorContext.lookup(SelectorContext.java:163) at java.naming/javax.naming.InitialContext.lookup(InitialContext.java:409) at DAO.DAO.getConnection(DAO.java:16) at DAO.LoginDAO.search(LoginDAO.java:17) at servlet.Login.doPost(Login.java:32) at javax.servlet.http.HttpServlet.service(HttpServlet.java:652) at javax.servlet.http.HttpServlet.service(HttpServlet.java:733) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:687) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:893) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1707) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.base/java.lang.Thread.run(Thread.java:834)

該当のソースコード

Login.java package servlet; import java.io.IOException; 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 DAO.LoginDAO; import bean.Bean; @WebServlet(urlPatterns = { "/servlet/Login" }) public class Login extends HttpServlet { protected void doGet( HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } protected void doPost( HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session = request.getSession(); String id = request.getParameter("id"); String password = request.getParameter("password"); try { LoginDAO dao = new LoginDAO(); Bean bean = dao.search(id, password); if (bean!=null) { session.setAttribute("account", bean); request.getRequestDispatcher("../jsp/login-success.jsp") .forward(request, response); } else { request.getRequestDispatcher("../jsp/login-error.jsp") .forward(request, response); } }catch(Exception e) { e.printStackTrace(); } }}
package DAO; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import javax.servlet.annotation.WebServlet; import bean.Bean; @WebServlet(urlPatterns = { "/DAO/LoginDAO" }) public class LoginDAO extends DAO { public Bean search(String id, String password) throws Exception{ Bean bean=null; Connection con = getConnection(); PreparedStatement st=con.prepareStatement( "select*from customer where id=? and password=?"); st.setString(1, id); st.setString(2, password); ResultSet rs = st.executeQuery(); while (rs.next()) { bean = new Bean(); bean.setId(rs.getString("id")); bean.setPassword(rs.getString("password")); } st.close(); con.close(); return bean; } }
package DAO; import java.sql.Connection; import javax.naming.InitialContext; import javax.servlet.annotation.WebServlet; import javax.sql.DataSource; @WebServlet(urlPatterns = { "/DAO/DAO" }) public class DAO { static DataSource ds; public Connection getConnection() throws Exception { if (ds == null) { InitialContext ic = new InitialContext(); ds = (DataSource) ic.lookup("java:/comp/env/jdbc/login"); } return ds.getConnection(); } }
package DAO; import java.sql.Connection; import javax.naming.InitialContext; import javax.servlet.annotation.WebServlet; import javax.sql.DataSource; @WebServlet(urlPatterns = { "/DAO/DAO" }) public class DAO { static DataSource ds; public Connection getConnection() throws Exception { if (ds == null) { InitialContext ic = new InitialContext(); ds = (DataSource) ic.lookup("java:/comp/env/jdbc/login"); } return ds.getConnection(); } }
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@include file="../header.html"%> <form action="../servlet/Login" method="post"> <p>ID <input type="text" name="id" required></p> <p>パスワード <input type="text" name="password" required></p> <p><input type="submit" value="ログイン"></p> </form> <%@include file="../footer.html"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@include file="../header.html"%> IDまたはパスワードが違います。 <%@include file="../footer.html"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@include file="../header.html"%> こんにちは、${account.id}さん! <%@include file="../footer.html"%>
<?xml version="1.0" encoding="UTF-8"?> <Context> <!-- maxTotal: Maximum number of database connections in pool. Make sureyou configure your mysqld max_connections large enough to handle all of yourdb connections. Set to -1 for no limit. --> <!-- maxIdle: Maximum number of idle database connections to retain in pool.Set to -1 for no limit. See also the DBCP 2 documentation on this and theminEvictableIdleTimeMillis configuration parameter. --> <!-- maxWaitMillis: Maximum time to wait for a database connection to becomeavailable in ms, in this example 10 seconds. An Exception is thrown if thistimeout is exceeded. Set to -1 to wait indefinitely. --> <!-- username and password: MySQL username and password for database connections --> <!-- driverClassName: Class name for the old mm.mysql JDBC driver is org.gjt.mm.mysql.Driver - we recommend using Connector/J though. Class name for the official MySQLConnector/J driver is com.mysql.jdbc.Driver. --> <!-- url: The JDBC connection url for connecting to your MySQL database. --> <Resource url="jdbc:mysql://localhost:3306/book" driverClassName="com.mysql.cj.jdbc.Driver" password="password" username="root" maxWaitMillis="10000" maxIdle="30" maxTotal="100" type="javax.sql.DataSource" auth="Container" name="jdbc/book"/> </Context>

試したこと

リンク先がおかしいので、まずifの条件式が間違っているかな?と思い色々試しましたが出来ませんでした。
またリンク先の記述もおかしいのかなと思い色々試しましたがそれも出来ずといった感じです。

補足情報(FW/ツールのバージョンなど)

Tomcat9 Java11

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

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

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

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

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

guest

回答1

0

ベストアンサー

とjspではなく、恐らくサーブレットのLogin.javaに飛んでしまいます。

何を想定しているのか分かりませんが、そのlogin.jspとやらでしっかりサーブレットのマッピングを想定した送信先が指定されています。

<form action="**../servlet/Login**" method="post">

どのようなURLマッピングで設計されているのか不明ですが、「ログイン処理を受け付けて結果次第でリダイレクトする」なら一旦受けるのはサーブレットJavaでなんら問題はないのでは。

URLの仕方がこれだと環境により正しい先にならないかもしれませんのでServletContext#getContextPath()を利用してURL生成したほうが良いと思いますが。

あとはエラーの通り、InitialContext.lookupの引数と結果の整合性が取れてないんじゃないかなと。
NameNotFoundExceptionの名前が示す通り、指定した名前のオブジェクトが見つからないということですから。

全体の定義との整合性を確かめてください(提示された内容からは何とも言えません)

何も表示されなのはExceptionに落ちたらExceptionを出力して終わっている実装だからですね。他に何もありません。

java

1 2 }catch(Exception e) { 3 e.printStackTrace(); 4 }

他にも
謎の実装は沢山あります。

java

1@WebServlet(urlPatterns = { "/DAO/DAO" }) 2public class DAO {

@WebServletアノテーション はアクセスしたいリクエストURLを指定するための機能です。
DAOに直接URLでアクセスさせる設計ですか?

DAO(Data Access Object)はその名の通り、データベースにアクセスするためのオブジェクトで、データ操作が役割なので直接アクセスさせるのはその役割に反すると思います。


蛇足:
eclipseっぽいですがコードインデントが全くそろってないように見えます。
コードフォーマット機能は使いましょう。
特に{}の対応は大事です。

投稿2021/07/08 12:59

m.ts10806

総合スコア80850

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

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

Jun0119

2021/07/08 13:31

<form action="../servlet/Login" method="post"> 確かにこの指定だとservlet/Loginに行きますよね... 盲点でした。 DBに登録してあるidでログイン処理し、成功時にようこそ+id のようにサーブレットのレスポンスの出力に合わせて表示させたい為、RequestDispatcherインターフェイスを使っています。 InitialContext.lookupについては、 InitialContext ic=new InitialContext(); DataSource ds=(DataSource)ic.lookup( "java:/comp/env/jdbc/book"); Connection con=ds.getConnection(); をLoginDAOに入れることでcontext.xmlに対してオブジェクトを用意できるということでしょうか?
m.ts10806

2021/07/08 13:34

「別にURLは間違ってない、Exceptionキャッチしたときに画面出力がないだけ」というのが主旨です。 いずれにしても何のためにInitialContextを使ってますか?どういう結果を想定していますか? 手段より実際の目的や設計、要件を主として必要な機能を選択してください。
Jun0119

2021/07/08 13:49

データーベースへ接続するためのDataSourceオブジェクトを取得して、context.xmlのResource要素のname属性であるjdbc/データベース名で参照し、getConnectionメソッドで接続するという目的で使うという事ですよね? そこからSQL文でデータを引っ張り出して、setメソッドで定義してLogin.javaでログイン結果次第でそれぞれの画面遷移を行うという目的です。 つまり、Exceptionで画面出力がないという事は、上記の途中で何処か合ってない所があるということですかね?
m.ts10806

2021/07/08 14:04

>接続するという目的で使うという事ですよね? かどうかは、書かれた自身が誰よりも知っているのでは。 何も説明はないので私は質問者さん自身が書いたと思っています。 ただ、結局エラーの通り「NameNotFoundException」らしいので、 指定の仕方が間違いか、想定のxmlを参照できてないか どちらかだと思います。 > Exceptionで画面出力がないという事は、上記の途中で何処か合ってない所があるということですかね? 違います。「Exceptionに入った時に画面出力のない実装をあなたがしている」だけで、NotFoundとは関係ないです。Exceptionキャッチした後の話。 何も出ない実装なだけで、Exceptionキャッチしたときにエラー画面でも設けてそちらに遷移するように実装するだけの話。(大抵はする。printStackTraceの結果はログファイルに吐かれることはあってもユーザーには見えないから)
Jun0119

2021/07/09 01:36 編集

解決できました! 原因としては、まずcontext.xmlのjdbc/book(DB名が違う)になっていたことと、SQL文のDB名の指定が異なっていたことでした。 NameNotFoundExceptionで指定の仕方が間違いか、想定のxmlを参照出来ていない、どちらもその通りでした。 サーブレットのコードの方に何か問題があるものだと思い込んでいました。 確かにDBからデータを引っ張って来れなければif文の条件の成立せずに画面遷移しないのは当たり前ですよね。 ご丁寧な回答ありがとうございました。お手数をお掛けします。
m.ts10806

2021/07/09 01:38

この手のエラーはだいたい設定のミスです。コードもそうですが一字違えば大文字小文字すら別のものですからね。
m.ts10806

2021/07/09 01:40

>確かにDBからデータを引っ張って来れなければif文の条件の成立せずに画面遷移しないのは当たり前ですよね。 違います。 何度か先に書いたように、画面遷移はしていて画面出力の記述がないだけです。
Jun0119

2021/07/09 01:48

やはり一度書いてみて、少しづつ追っていって間違いがないかを確認するのが大事だということですかね。 e.printStackTrace()の引数に何も指定をしていない為、画面出力が行われないということですかね?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問