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

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

詳細はこちら
INSERT

INSERTとは、行を追加する、コンピュータのデータベース言語SQLにおけるデータ操作言語(DML)ステートメントの1つである

Java

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

servlet

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

Q&A

解決済

1回答

1026閲覧

テキストをDBにINSERTする際に送信エラーが起きる原因がわかりません。

kjrk

総合スコア15

INSERT

INSERTとは、行を追加する、コンピュータのデータベース言語SQLにおけるデータ操作言語(DML)ステートメントの1つである

Java

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

servlet

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

0グッド

0クリップ

投稿2021/01/07 02:27

前提・実現したいこと

WEBとしてテキストファイルをアップロード可能な画面を用意する。
上記のテキストファイルをサーバ側のJAVAプログラムで読み込み
一連のルールに従って、内容をDBに保存して、完了画面をクライアントに返すプログラム

こちらを作ろうとしているのですが、受け取ったテキストファイルの中身を読みこみ、
DBに保存しようとしているのですが、アップロード画面から送信をしようとした際にエラーになります。

一つのクラスで書いているときにはうまくいっているのですが、
DB関連の処理をDaoクラスにまとめて、複数のクラスからなるプログラムにしようとすると
うまくいきません。うまくいかない原因を知りたいです。

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

このページは動作していません localhostからデータが送信されませんでした。 ERR_EMPTY_RESPONSE

該当のソースコード

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>Insert title here</title> 8</head> 9<body> 10 <form action="/FileInputOutputApp/MainServlet" enctype="multipart/form-data" accept=".txt" method="POST" required> 11 アップロードするテキストファイルを選択してください<br> 12 <input type="file" name="uploadFile"><br> 13 <input type="submit" value="upload"> 14 </form> 15</body> 16</html> 17

Java

1import java.io.BufferedReader; 2import java.io.File; 3import java.io.FileReader; 4import java.io.IOException; 5import java.sql.SQLException; 6 7import javax.servlet.RequestDispatcher; 8import javax.servlet.ServletException; 9import javax.servlet.annotation.MultipartConfig; 10import javax.servlet.annotation.WebServlet; 11import javax.servlet.http.HttpServlet; 12import javax.servlet.http.HttpServletRequest; 13import javax.servlet.http.HttpServletResponse; 14import javax.servlet.http.Part; 15 16import model.FileDao; 17 18/** 19 * 20 * @author 21 * mainServlet 22 * 23 */ 24@WebServlet("/MainServlet") 25@MultipartConfig(maxFileSize = 20971520, maxRequestSize = 20971520, fileSizeThreshold = 1048576, location = "/opt/apache-tomcat-8.5.61/temp") 26public class MainServlet extends HttpServlet { 27 private static final long serialVersionUID = 1L; 28 29 /** 30 * doGet() 31 */ 32 @Override 33 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 34 35 // フォワード 36 RequestDispatcher dispatcher = request.getRequestDispatcher("/jsp/input.jsp"); 37 dispatcher.forward(request, response); 38 39 } 40 41 /** 42 * doPost() 43 */ 44 @Override 45 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 46 47 // 文字コード指定 48 response.setContentType("text/html; charset=UTF-8"); 49 50 // Partオブジェクトの取得 51 Part part = request.getPart("uploadFile"); 52 53 // アップロードされたファイル名の取得 54 String fileName = getFileName(part); 55 56 // ファイルパスの指定 57 String filePath = "/uploaded"; 58 59 // ディレクトリーの作成 60 File uploadDir = mkdirs(filePath); 61 62 // 指定されたパスにファイルを保存 63 part.write(getServletContext().getRealPath(uploadDir.getPath() + "/" + fileName)); 64 65 // ファイルクラスの生成 66 File file = new File(getServletContext().getRealPath(uploadDir.getPath() + "/" + fileName)); 67 68 // ファイルを1文字ずつ読み込む 69 FileReader fileReader = new FileReader(file); 70 71 // ファイルを1行ずつ読み込む 72 @SuppressWarnings("resource") 73 BufferedReader bufferedReader = new BufferedReader(fileReader); 74 String str = bufferedReader.readLine(); 75 String br = System.getProperty("line.separator"); 76 StringBuilder contentStr = new StringBuilder(); 77 78 // DBに接続・テーブルにテキストをINSERT 79 FileDao fileDao = new FileDao(); 80 try { 81 fileDao.create(contentStr, str, br); 82 } catch (SQLException e) { 83 e.printStackTrace(); 84 } catch (InstantiationException e) { 85 e.printStackTrace(); 86 } catch (IllegalAccessException e) { 87 e.printStackTrace(); 88 } catch (ClassNotFoundException e) { 89 e.printStackTrace(); 90 } 91  } 92 93 /** 94 * ディレクトリーの作成をするメソッド 95 */ 96 private File mkdirs(String filePath) { 97 File uploadDir = new File(filePath); 98 uploadDir.mkdirs(); 99 return uploadDir; 100 } 101 102 /** 103 * ファイル名を取得するメソッド 104 */ 105 private String getFileName(Part part) { 106 String name = null; 107 for (String dispotion : part.getHeader("Content-Disposition").split(";")) { 108 if(dispotion.trim().startsWith("filename")) { 109 name = dispotion.substring(dispotion.indexOf("=") + 1).replace("\"", "").trim(); 110 name = name.substring(name.lastIndexOf("\") + 1); 111 break; 112 } 113 } 114 return name; 115 } 116 117 118} 119 120

Java

1package model; 2 3import java.sql.Connection; 4import java.sql.DriverManager; 5import java.sql.PreparedStatement; 6import java.sql.SQLException; 7 8/** 9 * 10 * @author kijima 11 * SQL処理の関連をまとめたクラス 12 * 13 */ 14 public class FileDao { 15 16 // DB接続に使用する情報 17 private final String url = "jdbc:mariadb://localhost/upload_db"; 18 private final String user = "****"; 19 private final String password = "****"; 20 21 Connection conn = null; 22 PreparedStatement ps = null; 23 24 /** 25 * DBにテキストデータをINSERT 26 * @throws ClassNotFoundException 27 * @throws IllegalAccessException 28 * @throws InstantiationException 29 */ 30 public void create(StringBuilder contentStr, String str, String br) throws SQLException, InstantiationException, IllegalAccessException, ClassNotFoundException { 31 32 // JDBCドライバのロード 33 Class.forName("org.mariadb.jdbc.Driver").newInstance(); 34 35 // DB接続 36 conn = DriverManager.getConnection(url, user, password); 37 38 //INSERT文の準備 39 String insertSql = "INSERT INTO `upload_file` (`contents`) VALUES (?)"; 40 ps = conn.prepareStatement(insertSql); 41 while(str != null) { 42 contentStr.append(str+br); 43 } 44 ps.setString(1, contentStr.toString()); 45 46 ps.executeUpdate(); 47 conn.commit(); 48 49 // DB接続切断 50 conn.close(); 51 } 52 53 54} 55

補足情報

以下は動作確認できているクラスです

Java

1import java.io.BufferedReader; 2import java.io.File; 3import java.io.FileReader; 4import java.io.IOException; 5import java.io.PrintWriter; 6import java.sql.Connection; 7import java.sql.DriverManager; 8import java.sql.PreparedStatement; 9import java.sql.ResultSet; 10import java.sql.SQLException; 11import java.sql.Statement; 12 13import javax.servlet.RequestDispatcher; 14import javax.servlet.ServletException; 15import javax.servlet.annotation.MultipartConfig; 16import javax.servlet.annotation.WebServlet; 17import javax.servlet.http.HttpServlet; 18import javax.servlet.http.HttpServletRequest; 19import javax.servlet.http.HttpServletResponse; 20import javax.servlet.http.Part; 21 22/** 23 * 24 * @author 25 * 26 */ 27@WebServlet("/MainServlet") 28@MultipartConfig(maxFileSize = 20971520, maxRequestSize = 20971520, fileSizeThreshold = 1048576, location = "/opt/apache-tomcat-8.5.61/temp") 29public class MainServlet extends HttpServlet { 30 private static final long serialVersionUID = 1L; 31 32 /** 33 * doGet() 34 */ 35 @Override 36 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 37 38 RequestDispatcher dispatcher = request.getRequestDispatcher("/jsp/input.jsp"); 39 dispatcher.forward(request, response); 40 41 } 42 43 /** 44 * doPost() 45 */ 46 @Override 47 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 48 49 response.setContentType("text/html; charset=UTF-8"); 50 51 Connection conn = null; 52 PreparedStatement ps = null; 53 54 String url = "jdbc:mariadb://localhost/upload_db"; 55 String user = "****"; 56 String password = "****"; 57 String insertSql = "INSERT INTO `upload_file` (`contents`) VALUES (?)"; 58 59 Part part = request.getPart("uploadFile"); 60 61 String fileName = getFileName(part); 62 63 String filePath = "/uploaded"; 64 65 File uploadDir = mkdirs(filePath); 66 67 part.write(getServletContext().getRealPath(uploadDir.getPath() + "/" + fileName)); 68 69 File file = new File(getServletContext().getRealPath(uploadDir.getPath() + "/" + fileName)); 70 71 FileReader fileReader = new FileReader(file); 72 73 @SuppressWarnings("resource") 74 BufferedReader bufferedReader = new BufferedReader(fileReader); 75 String str; 76 77 try { 78 79 Class.forName("org.mariadb.jdbc.Driver").newInstance(); 80 81 conn = DriverManager.getConnection(url, user, password); 82 83 ps = conn.prepareStatement(insertSql); 84 85 String br = System.getProperty("line.separator"); 86 StringBuilder contentStr = new StringBuilder(); 87 while((str = bufferedReader.readLine()) != null) { 88 contentStr.append(str+br); 89 } 90 ps.setString(1,contentStr.toString()); 91 ps.executeUpdate(); 92 System.out.println("アップロードされたファイルのテキストをデータベースに保存しました<br>"); 93 94 conn.commit(); 95 96 }catch (ClassNotFoundException e){ 97 System.out.println("ClassNotFoundException:" + e.getMessage()); 98 }catch (SQLException e){ 99 System.out.println("SQLException:" + e.getMessage()); 100 }catch (Exception e){ 101 System.out.println("Exception:" + e.getMessage()); 102 }finally{ 103 try{ 104 if (conn != null){ 105 conn.close(); 106 }else{ 107 System.out.println("コネクションがありません"); 108 } 109 }catch (SQLException e){ 110 System.out.println("SQLException:" + e.getMessage()); 111 } 112 } 113 } 114}

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

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

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

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

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

guest

回答1

0

ベストアンサー

ごちゃっとしすぎです。
「役割分担」を明確にしましょう。

Daoにデータ処理任せるならcreateにはテキストの中身だけ渡してはどうでしょうか。
SystemPropertyもStringBuilderも基本的にどこからでも呼び出せるので、わざわざ引数として渡す必要はないです。

doPostメソッドの行数が多く感じるのでしたら「Partを受け取り中身のテキスト情報を取得するメソッド」を別途用意してそちらに中身の解析を任せるのでも良いです。

投稿2021/01/07 02:42

m.ts10806

総合スコア80875

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

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

kjrk

2021/01/07 02:50

頭の整理ができていませんでした。 パーツをより意識して作ってみます。 ありがとうございました。
m.ts10806

2021/01/07 02:53

オブジェクト指向の本質は「役割分担」です。 もちろんはじめは1つになんでも詰め込みがちですが、共通点が見つかれば「任せる」ことで少ないコードでも最大限の仕事をしてくれます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問