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

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

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

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

Java

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

servlet

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

Q&A

1回答

344閲覧

jspからpostでservletを呼び出せない

soufflet

総合スコア0

JSP

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

Java

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

servlet

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

0グッド

0クリップ

投稿2024/03/27 16:33

編集2024/03/28 02:58

実現したいこと

ファイルアップロード用のJSP画面にあるアップデートボタンを押下すると、doPost処理をServlet側に投げるようにしたいのですが、連携されない。

[実行環境]
・ecripse
・Tomcat10
・Java21

発生している問題・分からないこと

ファイルアップロード用のJSP画面にあるアップデートボタンを押下すると、doPost処理をServlet側に投げるようにしたいのですが、連携されない。

エラーメッセージ

error

1HTTPステータス 404 – 見つかりません 2タイプ ステータスレポート 3 4メッセージ 要求されたリソース [/Upload] は利用できません。 5 6説明 オリジンサーバーは、ターゲットリソースの現在の表現を見つけられなかったか、またはそれが存在することを開示するつもりはありません。

該当のソースコード

UploadServlet.java

1package upload; 2 3import java.io.File; 4import java.io.FileInputStream; 5import java.io.IOException; 6import java.io.InputStream; 7import java.io.PrintWriter; 8import java.util.Properties; 9 10import javax.servlet.ServletException; 11import javax.servlet.annotation.MultipartConfig; 12import javax.servlet.annotation.WebServlet; 13import javax.servlet.http.HttpServlet; 14import javax.servlet.http.HttpServletRequest; 15import javax.servlet.http.HttpServletResponse; 16import javax.servlet.http.Part; 17 18import com.amazonaws.auth.AWSStaticCredentialsProvider; 19import com.amazonaws.auth.BasicAWSCredentials; 20import com.amazonaws.client.builder.AwsClientBuilder; 21import com.amazonaws.services.s3.AmazonS3; 22import com.amazonaws.services.s3.AmazonS3ClientBuilder; 23 24@WebServlet("/Upload") 25@MultipartConfig 26public class UploadServlet extends HttpServlet { 27 28 protected void doPost(HttpServletRequest request, HttpServletResponse response) 29 throws ServletException, IOException { 30 doGet(request, response); 31 response.setContentType("text/html;charset=UTF-8"); 32 PrintWriter out = response.getWriter(); 33 34 try { 35 // アップロードされたファイルの取得 36 Part filePart = request.getPart("file"); 37 String fileName = getSubmittedFileName(filePart); 38 39 // アップロードされたファイルをサーバーの一時ディレクトリに保存 40 String uploadPath = getServletContext().getRealPath("") + File.separator + "uploads"; 41 File uploadDir = new File(uploadPath); 42 if (!uploadDir.exists()) { 43 uploadDir.mkdir(); 44 } 45 String filePath = uploadPath + File.separator + fileName; 46 filePart.write(filePath); 47 48 // プロパティファイルからAWSアクセスキー、シークレットキー、S3バケット名、ファイルのキーを読み込む 49 Properties props = new Properties(); 50 try (InputStream input = new FileInputStream("config.properties")) { 51 props.load(input); 52 } catch (IOException e) { 53 // e.printStackTrace(); 54 out.println("エラーが発生しました: " + e.getMessage()); 55 return; 56 } 57 // プロパティよりAWSのアクセスキーとシークレットアクセスキーを取得 58 String accessKey = props.getProperty("accessKey"); 59 String secretKey = props.getProperty("secretKey"); 60 61 // プロパティよりS3のバケット名とファイルキーを取得 62 String bucketName = props.getProperty("bucketName"); 63 String s3Key = props.getProperty("s3Key" + fileName); 64 65 // AWS S3クライアントを作成 66 BasicAWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey); 67 AmazonS3 s3Client = AmazonS3ClientBuilder.standard() 68 .withCredentials(new AWSStaticCredentialsProvider(credentials)) 69 .withEndpointConfiguration( 70 new AwsClientBuilder.EndpointConfiguration(props.getProperty("endpointURL"), 71 props.getProperty("region"))) 72 .build(); 73 74 // アップロードするファイルとバケット名を指定 75 File file = new File(filePath); 76 77 // S3にファイルをアップロード 78 s3Client.putObject(bucketName, s3Key, file); 79 80 // レスポンスに成功メッセージを出力 81 out.println("ファイルのアップロードが成功しました!"); 82 83 } catch (IOException | ServletException e) { 84 out.println("エラーが発生しました: " + e.getMessage()); 85 } 86 } 87 88 /** 89 * 90 */ 91 protected void doGet(HttpServletRequest request, HttpServletResponse response) 92 throws ServletException, IOException { 93 doPost(request, response); 94 } 95 96 // パートからファイル名を取得するユーティリティメソッド 97 private String getSubmittedFileName(Part part) { 98 for (String cd : part.getHeader("content-disposition").split(";")) { 99 if (cd.trim().startsWith("filename")) { 100 String fileName = cd.substring(cd.indexOf('=') + 1).trim().replace("\"", ""); 101 return fileName.substring(fileName.lastIndexOf('/') + 1).substring(fileName.lastIndexOf('\\') + 1); 102 } 103 } 104 return null; // ファイル名が見つからない場合はnullを返す 105 } 106} 107

web.xml

1<!DOCTYPE web-app PUBLIC 2 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" 3 "http://java.sun.com/dtd/web-app_2_3.dtd" > 4 5<web-app> 6 <display-name>Archetype Created Web Application</display-name> 7 <welcome-file-list> 8 <welcome-file>upload.jsp</welcome-file> 9 </welcome-file-list> 10</web-app>

upload.jsp

1<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 2<!DOCTYPE html> 3<html> 4<head> 5<title>ファイルアップロード</title> 6</head> 7<body> 8 <h2>ファイルをアップロードする</h2> 9 <form action="/Upload" method="post" enctype="multipart/form-data"> 10 <input type="file" name="file" /> <br /> <input type="submit" 11 value="アップロード" /> 12 </form> 13</body> 14</html> 15

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果
サーバー起動時の画面

サーバー起動時

アップデートボタン押下後のエラー画面

アップデートボタン押下後

javaファイル内でアノテーション、web.xmlでservletマッピングを行っていた為、jspファイルも表示されませんでしたが、web.xml内の記載を削除することでjspは表示されるようになった。
ファイルの配置構成を見直したイメージ説明

補足

特になし

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

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

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

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

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

jimbe

2024/03/27 17:52 編集

jsp はどのように実行・表示したのでしょうか。 その時の URL はどうだったでしょう。 また、サーバの名前やバージョン、java のバージョン、開発環境のそれら等も質問に追加して戴けますか?
jimbe

2024/03/27 17:54

関係無いと思いますが、 doPost は doGet を呼び doGet は doPost を呼んでいませんか。
soufflet

2024/03/28 03:01 編集

jimbe様 コメントありがとうございます。 >関係無いと思いますが、 doPost は doGet を呼び doGet は doPost を呼んでいませんか。 doPostメソッド内にあるdoGetを呼び出している箇所をコメントアウトし、再実行しましたが結果は変わりませんでした。 実行時のURLや実行環境を追記しましたので、確認いただけますでしょうか?
jimbe

2024/03/28 04:54 編集

編集追加ありがとうございます。 url に "fileup" が入っていまが、その中の form の action が "/Upload" だと fileup が入らないと思います。 form の action を "/fileup/Upload" にしてみては如何でしょうか。 action="${pageContext.request.contextPath}/Upload" が正式?なのかも知れません。 [4.フォームから送ったデータをサーブレットで受け取る] https://saycon.co.jp/portal-for-newcomer/javaweb/servlet doPost <-> doGet に関しましては 404 でサーブレットが動いていないので "まだ" 影響は無かったのかなと思います。
m.ts10806

2024/04/01 06:50

> action="${pageContext.request.contextPath}/Upload 環境依存があるので上記コンテキストパスを使うのが正解と思います。
guest

回答1

0

HTTPステータス 404 エラーが発生している原因として、ServletのURLマッピングが正しく設定されていない可能性があります。以下の点を確認および修正してみてください。

  1. URLパスの確認

UploadServlet の @WebServlet("/Upload") アノテーションが正しく設定されていますが、upload.jsp で指定されているフォームの action 属性は /Upload となっています。この場合、UploadServlet はコンテキストパス直下に配置されている必要があります。

Tomcat の場合、webapp 内に UploadServlet が WEB-INF/classes/upload/ 以下に配置されていることを確認してください。

もしアプリケーションが別のコンテキストパスでデプロイされている場合、action をそのパスに合わせて修正する必要があります。例えば、アプリケーションのコンテキストパスが myapp であれば、action="/myapp/Upload" とする必要があります。

  1. Servletマッピングの確認

web.xml で Servlet を明示的にマッピングする場合、@WebServlet アノテーションが無視されることはありませんが、web.xml にも適切なマッピングを追加することができます。

例えば、以下のように web.xml に Servlet マッピングを追加してみてください。

xml
Copy code
<servlet>
<servlet-name>UploadServlet</servlet-name>
<servlet-class>upload.UploadServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UploadServlet</servlet-name>
<url-pattern>/Upload</url-pattern>
</servlet-mapping>
3. アップデートボタンのフォーム
upload.jsp 内のフォームで action="/Upload" となっていますが、もし UploadServlet を /Upload 以外のURLでアクセスしたい場合、フォームの action 属性を適切に変更してください。

例: コンテキストパスが myapp であれば、以下のように修正します。

html
Copy code

<form action="/myapp/Upload" method="post" enctype="multipart/form-data"> 4. Tomcatの再起動 変更を加えた後は、Tomcatを再起動して、ServletやJSPが正しくデプロイされていることを確認してください。

これらの点を確認した後、もう一度アップロードを試してみてください。それでも問題が解決しない場合は、さらに詳細なログ情報を確認し、エラーの原因を特定することができます。

投稿2024/12/06 08:10

merry678

総合スコア18

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問