🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
MySQL

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

JSP

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

Java

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

servlet

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

Q&A

解決済

2回答

4352閲覧

フォームで入力した値でsqlを検索できない

masaking

総合スコア30

MySQL

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

JSP

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

Java

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

servlet

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

0グッド

0クリップ

投稿2019/11/13 06:38

編集2019/11/14 00:44

IpCheckのサーブレットファイルを実行し、ipEntryでパソコンの管理番号を入力し、データベースにアクセスして、ipアドレスを引き出して、ipResultで出力するだけのプログラムを作ろうとしています。
ipEntryにpcのidを打ち込んでも、フォームに入力した値は特に関係なく、パソコン名やIPアドレスの一覧が表示されるだけです。

どうすれば、データベースからフォームに入力した値をもとに、データベースからipアドレスを引っ張り出して表示することができるでしょうか

画面遷移、およびデータ全部のリストは、jspのビューまでしっかり渡せられています。

ipResult.jsp

jsp

1<%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3<%@ page import="model.IP,java.util.List" %> 4<% List<IP> ipList = (List<IP>)request.getAttribute("ipList"); %> 5<!DOCTYPE html> 6<html> 7<head> 8<meta charset="UTF-8"> 9<title>ip結果</title> 10</head> 11<body> 12<h1>ip結果</h1> 13<% for(IP ips : ipList){%> 14 <P> 15 パソコンID:<%= ips.getPcID() %><br> 16 パソコンの名前:<%= ips.getIpAddress() %><br> 17 IPアドレス:<%= ips.getPcName() %> 18 </P> 19<% } %> 20<a href="/ipchecker/ipEntry">戻る</a> 21</body> 22</html>

ipEntry.jsp

jsp

1<%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3<!DOCTYPE html> 4<html> 5<head> 6<meta charset="UTF-8"> 7<title>IP調査</title> 8</head> 9<body> 10 <h1>IP調査</h1> 11 <form action="/ipChecker/IpCheck" method="post"> 12 PCのID: <input type="text" name="pcID"> 13 <br> 14 <input type="submit" value="送信"> 15 </form> 16</body> 17</html>

ipCheck.java

java

1package servlet; 2 3import java.io.IOException; 4import java.util.List; 5 6import javax.servlet.RequestDispatcher; 7import javax.servlet.ServletException; 8import javax.servlet.annotation.WebServlet; 9import javax.servlet.http.HttpServlet; 10import javax.servlet.http.HttpServletRequest; 11import javax.servlet.http.HttpServletResponse; 12 13import model.IP; 14import model.IpSelect; 15 16 17@WebServlet("/IpCheck") 18public class IpCheck extends HttpServlet { 19 private static final long serialVersionUID = 1L; 20 21 22 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 23 RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/jsp/ipEntry.jsp"); 24 dispatcher.forward(request, response); 25 } 26 27 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ 28 29 30 // モデルの実行 31 IpSelect ipSelect = new IpSelect(); 32 List<IP> ipList = ipSelect.execute(); 33 34 // 結果の保存 35 request.setAttribute("ipList", ipList); 36 37 RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/jsp/ipResult.jsp"); 38 dispatcher.forward(request, response); 39 } 40} 41

IP.java

java

1package model; 2 3import java.io.Serializable; 4 5public class IP implements Serializable{ 6 private String pcID; 7 private String pcName; 8 private String ipAddress; 9 10 11 public IP(String pcID, String ipAddress, String pcName) { 12 this.pcID=pcID; 13 this.pcName=pcName; 14 this.ipAddress=ipAddress; 15 } 16 17 public String getPcName() { 18 return pcName; 19 } 20 21 public void setPcName(String pcName) { 22 this.pcName = pcName; 23 } 24 25 public IP (String pcID,String ipAddress) { 26 this.pcID = pcID; 27 this.ipAddress=ipAddress; 28 } 29 30 public String getIpAddress() { 31 return ipAddress; 32 } 33 public void setIpAddress(String ipAddress) { 34 this.ipAddress = ipAddress; 35 } 36 public String getPcID() { 37 return pcID; 38 } 39 public void setPcID(String pcID) { 40 this.pcID = pcID; 41 } 42 43} 44

IpSelect.java

java

1package model; 2 3import java.util.List; 4 5import dao.IpDAO; 6 7public class IpSelect { 8 9 public List<IP> execute(){ 10 IpDAO dao = new IpDAO(); 11 List<IP> ipList = dao.findAll(); 12 return ipList; 13 } 14} 15

IpDAO.java

java

1package dao; 2 3import java.sql.Connection; 4import java.sql.DriverManager; 5import java.sql.PreparedStatement; 6import java.sql.ResultSet; 7import java.sql.SQLException; 8import java.util.ArrayList; 9import java.util.List; 10 11import model.IP; 12 13 14 15public class IpDAO{ 16 17 private final String JDBC_URL = "jdbc:mysql://localhost:3306/pcm?serverTimezone=JST"; 18 private final String DB_USER = "root"; 19 private final String DB_PASS = "y21password"; 20 21 public List<IP> findAll() { 22 List<IP> ipList = new ArrayList<>(); 23 24 try (Connection conn = DriverManager.getConnection(JDBC_URL, DB_USER, DB_PASS)){ 25 26 String sql 27 = "SELECT mng_pc.pc_id, pc_name, ip_address\r\n" + 28 "FROM pcm.mng_pc\r\n" + 29 "JOIN pcm.ip_address\r\n" + 30 "on mng_pc.pc_id=ip_address.pc_id" where pc_id=; 31 32 PreparedStatement pStmt = conn.prepareStatement(sql); 33 ResultSet rs = pStmt.executeQuery(); 34 35 while (rs.next()) { 36 String id = rs.getString("pc_id"); 37 String name = rs.getString("pc_name"); 38 String ip = rs.getString("ip_address"); 39 IP ipbeans = new IP(id, name, ip); 40 ipList.add(ipbeans); 41 } 42 } catch (SQLException e) { 43 e.printStackTrace(); 44 return null; 45 } 46 return ipList; 47 } 48} 49

Microsoft Windows [Version 10.0.17763.737]
Widnows10 Pro version 1809

mysql Ver 8.0.17 for Win64 on x86_64 (MySQL Community Server - GPL)
mysql-connector-java-8.0.17.jar
java version "1.8.0_221"

Eclipse
Version: 2019-09 R (4.13.0)
Build id: 20190917-1200

C:\Program Files (x86)\Java\jre1.8.0_221
C:\Program Files (x86)\Java\jdk1.5.0

ipDAOの、sql分の最後にwhere句を足さないといけないことはわかるのですが、どうやって書いてもエラーになります。

ご指摘いただけると幸いです。

2019/11/14 以下追記

IpDAOにて、

Java

1PreparedStatement pStmt = conn.prepareStatement(sql); 2pStmt.setString(1, 画面で入力した値); 3ResultSet rs = pStmt.executeQuery();

の用に書き換え、

IpCheckにて、

Java

1protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ 2 3request.setCharacterEncoding("UTF-8"); 4String name = request.getParameter("pcID"); 5 6// モデルの実行 7IpSelect ipSelect = new IpSelect(); 8List<IP> ipList = ipSelect.execute();

の用に書き換えました。

そのあとに、サーブレットを起動した結果、画面上で送信ボタンを押した後に、

HTTPステータス 500 – Internal Server Error
タイプ 例外報告

メッセージ サーブレットの実行により例外を投げました

説明 サーバーは予期しない条件に遭遇しました。それはリクエストの実行を妨げます。

例外

javax.servlet.ServletException: サーブレットの実行により例外を投げました
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
根本原因

java.lang.Error: Unresolved compilation problem:
画面で入力した値 を変数に解決できません

dao.IpDAO.findAll(IpDAO.java:33)
model.IpSelect.execute(IpSelect.java:11)
servlet.IpCheck.doPost(IpCheck.java:34)
javax.servlet.http.HttpServlet.service(HttpServlet.java:660)
javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
注意 原因のすべてのスタックトレースは、サーバのログに記録されています

と表示されました。

コンソールで確認したところ、

重大: パス[/ipChecker3]を持つコンテキスト内のサーブレット[servlet.IpCheck]のServlet.service() が例外[サーブレットの実行により例外を投げました]が根本的要因と共に投げられました。
java.lang.Error: Unresolved compilation problem:
画面で入力した値 を変数に解決できません

とメッセージが出ました。

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

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

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

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

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

masaking

2019/11/14 00:40

IpDAOにて、 PreparedStatement pStmt = conn.prepareStatement(sql); pStmt.setString(1, 画面で入力した値); ResultSet rs = pStmt.executeQuery(); の用に書き換え、 IpCheckにて、 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ request.setCharacterEncoding("UTF-8"); String name = request.getParameter("pcID"); // モデルの実行 IpSelect ipSelect = new IpSelect(); List<IP> ipList = ipSelect.execute(); の用に書き換えました。 そのあとに、サーブレットを起動した結果、画面上で送信ボタンを押した後に、 HTTPステータス 500 – Internal Server Error タイプ 例外報告 メッセージ サーブレットの実行により例外を投げました 説明 サーバーは予期しない条件に遭遇しました。それはリクエストの実行を妨げます。 例外 javax.servlet.ServletException: サーブレットの実行により例外を投げました org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) 根本原因 java.lang.Error: Unresolved compilation problem: 画面で入力した値 を変数に解決できません dao.IpDAO.findAll(IpDAO.java:33) model.IpSelect.execute(IpSelect.java:11) servlet.IpCheck.doPost(IpCheck.java:34) javax.servlet.http.HttpServlet.service(HttpServlet.java:660) javax.servlet.http.HttpServlet.service(HttpServlet.java:741) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) 注意 原因のすべてのスタックトレースは、サーバのログに記録されています と表示されました。 コンソールで確認したところ、 重大: パス[/ipChecker3]を持つコンテキスト内のサーブレット[servlet.IpCheck]のServlet.service() が例外[サーブレットの実行により例外を投げました]が根本的要因と共に投げられました。 java.lang.Error: Unresolved compilation problem: 画面で入力した値 を変数に解決できません とメッセージが出ました。
guest

回答2

0

ベストアンサー

where が文字列の外になってますね。
念の為 sql 文の文字列の中の \r\n は半角のブランクに変えましゃう。
画面で入力した値で検索するなら?記号を使って次のように。

Java

1String sql 2 = "SELECT mng_pc.pc_id, pc_name, ip_address " + 3 "FROM pcm.mng_pc " + 4 "JOIN pcm.ip_address " + 5 "on mng_pc.pc_id=ip_address.pc_id where pc_id=?;

その後、pStmtに prepareStatement の結果がセットされた次の行で、?の部分に実際の値を設定するために次のようにコードを書きます。

Java

1pStmt.setString(1, 画面で入力した値);

画面で入力した値は A-pZ さんのコメントのとおり、doPost の処理で引数の request から取り出す必要があります。
また、IpDao の findAll メソッドに取り出した値を渡すための引数を追加して、呼び出す時に request から取り出した値を渡しましょう。

基本的に足りていないと思われた点は以上ですので、そこまでやってどうなるかをみたら良いとおもいます。

投稿2019/11/13 11:22

ironya

総合スコア456

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

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

masaking

2019/11/14 00:36

IpDAOにて、 PreparedStatement pStmt = conn.prepareStatement(sql); pStmt.setString(1, 画面で入力した値); ResultSet rs = pStmt.executeQuery(); の用に書き換え、 IpCheckにて、 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ request.setCharacterEncoding("UTF-8"); String name = request.getParameter("pcID"); // モデルの実行 IpSelect ipSelect = new IpSelect(); List<IP> ipList = ipSelect.execute(); の用に書き換えました。 https://qiita.com/chihiro/items/d3d9a028cd5dd8e84649 などを参考にしたのですが、「findAll メソッドに取り出した値を渡すための引数を追加」 が良くわかっていないため、ここから先に進めないです。 もう少しだけご教授いただけないでしょうか。
masaking

2019/11/14 00:45

sql文は、ご指摘いただいたように変えております。ありがとうございます。
ironya

2019/11/14 02:01 編集

意図しているのは次のように書くということです。 public List<IP> findAll(String pcID) ですが、メソッドに引数を設ける方法は、ネットにたくさん情報がありますので、検索してみてください。 入門書でも必ず出てくると思います。端折らずに熟読してください。 本件ではこれ以上のアドバイスは必要がない思うので、後はご自分で頑張ってみてください。解決することを祈ります。
masaking

2019/11/14 06:37

ありがとうございます。上司からJavaじゃなくてサーブレットの勉強をしろ、と言われていたので、スコープを使う以外で、データの受け渡しを行う方法があることを初めて知りました。 とても勉強になりました。 メソッドの中のカッコが大事、ということを学べたのが今回の学びです。
ironya

2019/11/14 07:53

Java 知らずにサーブレットの学習は無理ですよ。サーブレットの土台はJavaですから。 無茶苦茶なこと言う上司ですね。ちょっと驚きました。あなたもご不幸な環境で、ご愁傷様です。
guest

0

IpCheck サーブレットのdoPostメソッドで、画面からのリクエストパラメータを一切受け取っていないため、検索条件はどこからも拾えていないようです。

投稿2019/11/13 07:03

A-pZ

総合スコア12011

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

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

masaking

2019/11/14 00:37

サーブレットクラスにて、 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ request.setCharacterEncoding("UTF-8"); String name = request.getParameter("pcID"); // モデルの実行 IpSelect ipSelect = new IpSelect(); List<IP> ipList = ipSelect.execute(); の用に書き換えました。 リクエストパラメーターが実際に引き渡されているかは、確認方法がわからないので、わからないです。 どのように確認すればよいでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問