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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

JSP

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

Java

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

servlet

Servletとは、Webページの動的な生成やデータ処理などをサーバ上で実行するために、Javaで作成されたプログラムです。 ショッピングサイトやオンラインバンキングといった、動的なウェブサイトの構築に用いられています。

Q&A

解決済

1回答

2138閲覧

Servlet間のSQL実行結果の受け渡しについて知りたいです

Yakusugi

総合スコア123

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

JSP

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

Java

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

servlet

Servletとは、Webページの動的な生成やデータ処理などをサーバ上で実行するために、Javaで作成されたプログラムです。 ショッピングサイトやオンラインバンキングといった、動的なウェブサイトの構築に用いられています。

0グッド

1クリップ

投稿2020/12/14 14:04

編集2020/12/20 03:37

Java(Servlet/JSP)で練習用に家計簿アプリを作成しています。
動きとしては、JSPから受け取る値(id, date, storeName, productName, type, price)をサーブレット「BudgetTrackerSearchController.java」で受け取り、受け取った内容を「BudgetTrackerSearchLogic.java」に渡し、Select SQLを実行し、「BudgetTrackerSearchController.java」に戻し、事項結果を変数「SqlResult」に格納し、最終的にjspファイルにSQLの結果を戻したいのですが、SQLの結果の受け渡し(BudgetTrackerSearchController.javaとBudgetTrackerSearchLogic.javaの間)がうまくできません。
下記にコードを記述していますので、SQLの結果の受け渡しについてご回答できる方がおりましたら、解決方法についてご教授頂けますでしょうか。

BudgetTrackerSearchController

1package info.budget.budgettracker; 2 3import java.io.IOException; 4import java.sql.PreparedStatement; 5import java.sql.ResultSet; 6import java.sql.SQLException; 7 8import javax.naming.InitialContext; 9import javax.naming.NamingException; 10import javax.servlet.ServletException; 11import javax.servlet.http.HttpServlet; 12import javax.servlet.http.HttpServletRequest; 13import javax.servlet.http.HttpServletResponse; 14import javax.sql.DataSource; 15 16public class BudgetTrackerSearchController extends HttpServlet { 17 18 private InitialContext ic; 19 20 public void init() throws ServletException { 21 // 初期コンテキストを取得 22 try { 23 ic = new InitialContext(); 24 } catch (NamingException e) { 25 // TODO Auto-generated catch block 26 e.printStackTrace(); 27 } 28 } 29 30 protected void doPost(HttpServletRequest request, HttpServletResponse response) 31 throws ServletException, IOException { 32 33 // 文字コードの設定 34 request.setCharacterEncoding("Windows-31J"); 35 36 // modeの取得 37 String mode = request.getParameter("mode"); 38 39 // 実行ステータスの宣言 40 String status = "Successful!"; 41 42 // データソースの取得 43 DataSource ds = null; 44 try { 45 ds = (DataSource) ic.lookup("java:comp/env/jdbc/searchman"); 46 } catch (NamingException e) { 47 // TODO Auto-generated catch block 48 e.printStackTrace(); 49 } 50 51 // JavaBeansの初期化 52 BudgetTrackerSearchLogic btSearchLogic = BudgetTrackerSearchLogicFactory.createBudgetTrackerLogic(request, ds, mode); 53 54 ResultSet rset = null; 55 try { 56 rset = btSearchLogic.searchData(); 57 } catch (Exception e) { 58 e.printStackTrace(); 59 status = "Failed!"; 60 } 61 62 63 // statusをセットして、result.jspに転送 64 request.setAttribute("status", status); 65 request.setAttribute("SqlResult", rset); 66 request.getRequestDispatcher("/searchResult.jsp").forward(request, response); 67 68 } 69 70 protected void doGet(HttpServletRequest request, HttpServletResponse response) 71 throws ServletException, IOException { 72 73 doPost(request, response); 74 } 75 76}

BudgetTrackerSearchLogic

1 2package info.budget.budgettracker; 3 4import java.sql.Connection; 5import java.sql.PreparedStatement; 6import java.sql.ResultSet; 7 8import javax.naming.InitialContext; 9import javax.servlet.ServletRequest; 10import javax.servlet.http.HttpServletRequest; 11import javax.sql.DataSource; 12 13public abstract class BudgetTrackerSearchLogic { 14 // private String yearMonth; 15 private String id; 16 private String date; 17 private String storeName; 18 private String productName; 19 private String type; 20 private String price; 21 22 // DB関連の初期設定 23 protected DataSource ds = null; 24 ResultSet rset = null; 25 26 // コンストラクタ 27 public BudgetTrackerSearchLogic(HttpServletRequest request, DataSource ds) { 28 29 setId(request.getParameter("id")); 30 setDate(request.getParameter("date")); 31 setStoreName(request.getParameter("storeName")); 32 setProductName(request.getParameter("productName")); 33 setType(request.getParameter("type")); 34 setPrice(request.getParameter("price")); 35 this.ds = ds; 36 } 37 38 // データベースへのアクション 39 // データの追加を実施 40 public ResultSet searchData() throws Exception { 41 42 Connection conn = ds.getConnection(); 43 String tableNm = getTableName(); 44 StringBuilder sql = new StringBuilder(); 45 46 // sql文を表示 47 sql.append("select id, Date, StoreName, ProductName, type, Price from " + tableNm + " where StoreName like '%'"); 48 //sql.append(storeName + "%'"); 49 System.out.println(sql); 50 51 // if id is selected, add it 52 if (id != "") { 53 sql.append("and id ='" + this.getId() + "';"); 54 } 55 56 // if Date is selected, add it 57 if (date != "") { 58 sql.append("and Date ='" + date + "'"); 59 } 60 61 // if StoreName is selected, add it 62 if (storeName != "") { 63 sql.append("and StoreName ='" + storeName + "'"); 64 } 65 66 // if ProductName is selected, add it 67 if (productName != "") { 68 sql.append("and ProductName ='" + productName + "'"); 69 } 70 71 // if Type is selected, add it 72 if (type != "") { 73 sql.append("and Type ='" + type + "'"); 74 } 75 76 // if Price is selected, add it 77 if (type != "") { 78 sql.append("and Price ='" + price + "'"); 79 } 80 81 PreparedStatement pstmt = conn.prepareStatement(new String(sql)); 82 83 84 // sql文実行 85 boolean res = pstmt.execute(); 86 rset = pstmt.executeQuery(); 87 88// ServletRequest request = null; 89// request.setAttribute("SqlResult", rset); 90 // 使用したオブジェクトを終了させる 91 pstmt.close(); 92 93 return rset; 94 95 96 97 // conn.close(); Webサーバー側のコネクションを使っているためコネクションはクローズしない 98 99 100 //return res; 101 } 102 103 // サブクラスからテーブル名を返す 104 protected abstract String getTableName(); 105 106 public String getId() { 107 return id; 108 } 109 110 public void setId(String id) { 111 this.id = id; 112 } 113 114 public String getDate() { 115 return date; 116 } 117 118 public void setDate(String date) { 119 this.date = date; 120 } 121 122 public String getStoreName() { 123 return storeName; 124 } 125 126 public void setStoreName(String storeName) { 127 this.storeName = storeName; 128 } 129 130 public String getProductName() { 131 return productName; 132 } 133 134 public void setProductName(String productName) { 135 this.productName = productName; 136 } 137 138 public String getType() { 139 return type; 140 } 141 142 public void setType(String type) { 143 this.type = type; 144 } 145 146 public String getPrice() { 147 return price; 148 } 149 150 public void setPrice(String price) { 151 this.price = price; 152 } 153 154 public DataSource getDs() { 155 return ds; 156 } 157 158 public void setDs(DataSource ds) { 159 this.ds = ds; 160 } 161}

BudgetTrackerSearchLogicFactory

1package info.budget.budgettracker; 2 3import javax.sql.DataSource; 4import javax.servlet.http.HttpServletRequest; 5 6public class BudgetTrackerSearchLogicFactory { 7 8 public static BudgetTrackerSearchLogic createBudgetTrackerLogic( 9 HttpServletRequest request, DataSource ds, String mode){ 10 BudgetTrackerSearchLogic res = null; 11 12 switch(mode) { 13 case "searchJan2020": 14 res = new Jan2020Search(request, ds); 15 break; 16 // クラスを増やすときにcaseを追加 17 default: 18 break; 19 } 20 21 return res; 22 } 23}

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

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

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

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

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

dodox86

2020/12/14 23:14

「うまくいかない」とは具体的にどういう問題が起きているのでしょうか。そもそもSELECTを実行しているBudgetTrackerSearchLogicクラスのsearchDataメソッドも、結果として得たResultSetを使っていないように見えます。(//request.setAttribute("SqlResult", rset); とコメント化されてしまっています)
dodox86

2020/12/15 01:29

「うまくできない」=「適切なやり方が分からず、できない」と言うご質問ですね。
Yakusugi

2020/12/16 14:40

ご返信ありがとうございます。 ご指摘通り、「("SqlResult", rset);」のコメントアウトを外し、下記の様に変更してみました。 ServletRequest request = null; request.setAttribute("SqlResult", rset); 具体的に不明な点としては、この「SqlResult」をどのようにして、BudgetTrackerSearchController.javaへ戻し、最終的にJSPへ渡すかヒントがあればご教授頂けないでしょうか。
guest

回答1

0

ベストアンサー

一番安直なのは、BudgetTrackerSearchLogic#searchData()の戻り値をResultSetにして、return rset;だと思います。
ただ、オブジェクト指向やセキュリティのの観点から、ぜひ以下も検討してください。

  • 戻り値をArrayListなどにして、SQLの結果をリスト形式で返却する
  • sql.append("and id ='" + this.getId() + "';");はSQLインジェクションの原因になるため、バインド変数を利用する
  • インスタンス変数をif (id != "") {と直接参照している直後にthis.getId()とメソッド経由で参照しているのは意図しているか

投稿2020/12/17 04:42

jcs502ulf

総合スコア307

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

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

Yakusugi

2020/12/19 05:13

ご回答頂きありがとうございます。 ご回答いただいた内容を元に自分でもBudgetTrackerSearchLogicのsearchDataを修正してみたのですが、BudgetTrackerSearchLogicのsearchData内で例外が発生しているらしく、NULLがBudgetTrackerSearchControllerにわたっているようです。 BudgetTrackerSearchLogic/BudgetTrackerSearchControllerともに修正してみみましたので、お気付きのエラーがありましたら、お手数ですが、ご教授いただければ幸いです。 よろしくお願いいたします。
jcs502ulf

2020/12/20 00:41

エラーメッセージを掲載してほしいです。
Yakusugi

2020/12/20 03:37

下記エラーメッセージになります。 12 20, 2020 12:35:13 午後 org.apache.catalina.core.ApplicationDispatcher invoke 重大: サーブレット [jsp] のServlet.service()が例外を投げました java.sql.SQLException: Operation not allowed after ResultSet closed at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:127) at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:95) at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:87) at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:61) at com.mysql.cj.jdbc.result.ResultSetImpl.checkClosed(ResultSetImpl.java:459) at com.mysql.cj.jdbc.result.ResultSetImpl.next(ResultSetImpl.java:1688) at org.apache.tomcat.dbcp.dbcp2.DelegatingResultSet.next(DelegatingResultSet.java:191) at org.apache.tomcat.dbcp.dbcp2.DelegatingResultSet.next(DelegatingResultSet.java:191) at org.apache.jsp.searchResult_jsp._jspService(searchResult_jsp.java:146) at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) at javax.servlet.http.HttpServlet.service(HttpServlet.java:741) at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:444) at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:386) at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:330) at javax.servlet.http.HttpServlet.service(HttpServlet.java:741) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:712) at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:459) at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:384) at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:312) at info.budget.budgettracker.BudgetTrackerSearchController.doPost(BudgetTrackerSearchController.java:66) at javax.servlet.http.HttpServlet.service(HttpServlet.java:660) at javax.servlet.http.HttpServlet.service(HttpServlet.java:741) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:494) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:651) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:407) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:754) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1376) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Unknown Source) 12 20, 2020 12:35:13 午後 org.apache.catalina.core.StandardWrapperValve invoke 重大: Servlet.service() for servlet [BTSeearchController] in context with path [/BudgetTracker] threw exception [An exception occurred processing [searchResult.jsp] at line [26] 23: <td><b>Modify</b></td> 24: </tr> 25: <% 26: while (rset.next()) { 27: %> 28: <tr> 29: <td><%=rset.getString(1)%></td> Stacktrace:] with root cause java.sql.SQLException: Operation not allowed after ResultSet closed at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:127) at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:95) at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:87) at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:61) at com.mysql.cj.jdbc.result.ResultSetImpl.checkClosed(ResultSetImpl.java:459) at com.mysql.cj.jdbc.result.ResultSetImpl.next(ResultSetImpl.java:1688) at org.apache.tomcat.dbcp.dbcp2.DelegatingResultSet.next(DelegatingResultSet.java:191) at org.apache.tomcat.dbcp.dbcp2.DelegatingResultSet.next(DelegatingResultSet.java:191) at org.apache.jsp.searchResult_jsp._jspService(searchResult_jsp.java:146) at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) at javax.servlet.http.HttpServlet.service(HttpServlet.java:741) at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:444) at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:386) at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:330) at javax.servlet.http.HttpServlet.service(HttpServlet.java:741) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:712) at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:459) at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:384) at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:312) at info.budget.budgettracker.BudgetTrackerSearchController.doPost(BudgetTrackerSearchController.java:66) at javax.servlet.http.HttpServlet.service(HttpServlet.java:660) at javax.servlet.http.HttpServlet.service(HttpServlet.java:741) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:494) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:651) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:407) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:754) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1376) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Unknown Source)
jcs502ulf

2020/12/20 07:37 編集

java.sql.SQLException: Operation not allowed after ResultSet closed が原因ですね。 pstmt.close(); をコメントアウトすると動くと思います。
Yakusugi

2020/12/20 13:43

ありがとうございます。 無事動く事確認出来ました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問