@baseball89sport

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

MVC学習におけるエラーを助けてください

解決したいこと

Youtubeを参考にMVCモデルの学習をしているのですが、うまく動作しないのでどなたか教えていただきたいです。
eclipseを使用してるのですが、始めたてであまり使い方を理解していないのでそちらに関してもご教授していただけるとありがたいです。
(どの写真が必要かわからないのでいっぱい上げておきます。)

内容は、HTMLに入力した内容がJSPから返ってこずにエラーになるということです。

発生している問題・エラー

スクリーンショット 2024-12-20 23.23.27.png
スクリーンショット 2024-12-20 23.24.24.png

該当するソースコード

register.html

<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>登録画面</title>
</head>
<body>
	<h1>登録情報を入力してください</h1>
	<form action = "/SampleMVC/register" method = "post">
		名前<input type = "text" name = "name" size = "10"/><br/>
		年齢<input type = "radio" name = "age" value = "child"/>18歳未満 
			 <input type = "radio" name = "age" value = "adult"/>18歳以上<br/>
		開発経験<input type = "checkbox" name = "lang" value = "java"/>java
				<input type = "checkbox" name = "lang" value = "python"/>phthon
				<input type = "checkbox" name = "lang" value = "javascript"/>javascript<br/><br/>
		<input type = "submit" value = "送信"/>
	</form>

</body>
</html>


RegisterServlet.java

import java.io.IOException;

import jakarta.servlet.RequestDispatcher;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import bean.RegisterBean;

@WebServlet("/register")
public class RegisterServlet extends HttpServlet {
	public void doPost(HttpServletRequest req,HttpServletResponse res) 
		throws IOException,ServletException{

	req.setCharacterEncoding("utf-8");
	
	String name = req.getParameter("name");
	String age  = req.getParameter("age");
	String[] langs = req.getParameterValues("lang");
	res.setContentType("text/html;charset = utf-8");
	
	
	//Bean
	RegisterBean rb = new RegisterBean();
	rb.setName(name);
	rb.setAge(age);
	rb.setLangs(langs);
     
	req.setAttribute("rb", rb);
	
	
	//Register.JSP
	RequestDispatcher rd = req.getRequestDispatcher("/register.jsp");
	rd.forward(req, res);
	}
	public void doGet(HttpServletRequest req,HttpServletResponse res)
		throws IOException,ServletException{
		doPost(req, res);
	}
}
RegisterBean.java

package bean;

import java.io.Serializable;

public class RegisterBean implements Serializable {

	private String name;
	private String age;
	private String[] langs;
	
	public RegisterBean(){
	}
	
	public void setName(String name) {
		this.name = name;
	}
	public void setAge(String age) {
		this.age = age;
	}
	public void setLangs(String[]langs) {
		this.langs = langs;
	}
	
	public String getName() {
		return name;
	}
	public String getAge() {
		return age;
	}
	public String[] getLangs() {
		return langs;
	}
	
	public String getJpnAge() {
		String jpnAge;
		if(age.equals("child")) {
			jpnAge = "18歳未満";
		}else {
			jpnAge = "18歳以上";
		}
		return jpnAge;
	}
	
	public String getStrLangs() {
		String strLangs = "";
		for(int i = 0; i < langs.length;i++) {
			strLangs = strLangs + langs[i] + " ";
		}
		return strLangs;
	}
		
}
register.jsp

<%@ page contentType="text/html; charset=UTF-8" %>
<jsp:useBean id = "rb" scope = "request" class = "bean.RegisterBean" />

<html>
<head>
	<title>確認画面</title>
</head>
<body>
	<h2>入力情報を確認して登録ボタンを押してください</h2>
	氏名:<strong><jsp:getProperty name = "rb" property = "name"</strong><br/>
	年齢:<strong><%= rb.getJpnAge() %></strong><br/>
	開発経験:<strong><%= rb.getStrLangs() %></strong><br/>
	<input type = "submit" value = "登録"/>
	<input type = "reset" value = "戻る"/>
</body>
</html>

自分で試したこと

教材のYoutubeを参考にコードの模写ミスに関しては全て直しました。
eclipseなどに関しても調べてみたのですが、あまりわからない状態です。

模写元のコードをコピーして実行しても同じエラーが出ます。
(動画内では実行できています。)

また、eclipse上で実行コマンドがなぜかデバック状態で起動してしまいます。

わかる方おられましたらよろしくお願いいたします。

0 likes

2Answer

404 応答の原因のほとんどは要求 url が間違っていることです。form 要素の action 属性に設定した url が間違っているのでは? sample MVC といような空白が入ることはないはず。

ググって調べただけですが、url は http://<hostname>/<プロジェクト名>/<@WebServlet の設定> になるそうで、そのプロジェクト名に空白を入れるのはダメだそうです。

sample MVC は質問者さんが設定したプロジェクト名で、空白が入っているから 404 エラー(見つからない)という結果になったのでは?


【追記】

コードを載せる場合は画像でなくテキスト形式にしてください。画像では register とかのキーワードで問題の行がどこにあるのかの検索もできないし、コピペして検証することもできませんので。なお、テキスト形式で載せる場合は MarkDown 記法を使ってください。

0Like

Comments

  1. コメントありがとうございます。

    投稿の部分修正させていただきました。
    コードを載せる参考資料ありがとうございました。

    プロジェクト名を修正して空白を無くして実行してみたのですが、やはりまた同じようにエラーが出てきてしまいます。

  2. 質問に貼られている 2 つ目の画像の一番上に表示されている sample MVC というのがプロジェクト名ではないのですか? そうだとすると直ってないように見えますが。

  3. お世話になっております。
    質問の写真を貼り替えられていませんでした。

    スクリーンショット 2024-12-22 21.59.47.png

    現場の写真です。
    これでも同じようにエラーが出ます

    スクリーンショット 2024-12-21 22.47.37.png

エラーメッセージが
/sample%20MVC/register
とあるので「%20」がスペースを表していますが
これをweb.xmlやserver.xmlでこんな風にマッピングされているのか?確認してみてください。参考にされているYoutubeがどういう風にWebサーバ側で設定しているかを確認してほしい。

0Like

Comments

  1. コメントありがとうございます。

    スペースが邪魔をしているかと思い、プロジェクト名を修正してスペースを消して実行してみたのですが、同じようにエラーになってしまいます。

    スクリーンショット 2024-12-21 22.47.37.png

    大変無知で申し訳ないのですが、web.xmlやserver.xmlのマッピングの確認というのはどういうことなのでしょうか?
    お手数おかけしますが、もう少し細かく教えていただいてもよろしいでしょうか?

  2. web.xmlのマッピング

    WebアプリケーションのルートディレクトリにあるWEB-INFフォルダ内のweb.xmlファイルを開き、下記のようなサーブレットとサーブレットマッピングを追加します。
    Eclipseを利用されているようですが、左側のエクスプローラー?の名称変更だけしているなら違うと思う。

    xmlの変更により、例えば/sampleMVC/registerというURLパスがリクエストされたときにregister.jspが表示されるようになります。

    web.xml
    <servlet>
        <servlet-name>register</servlet-name>
        <jsp-file>/register.jsp</jsp-file>
    </servlet>
    <servlet-mapping>
        <servlet-name>register</servlet-name>
        <url-pattern>/sampleMVC/register</url-pattern>
    </servlet-mapping>
    

    server.xmlのマッピング
    server.xmlファイルは、Tomcatサーバー全体の設定を行うためのファイルです。このファイルは、Tomcatのconfフォルダ内にあります。

    server.xml
    <Context path="/sampleMVC" docBase="path/to/sampleMVC" />
    

    色々Eclipseの自動生成に頼って作っているのならば、今のプロジェクトは残しつつもう一度新プロジェクトをEclipse経由で最初から作ってみるのもアリだと思います。そのうえで、動かないプロジェクトとxmlを比較するのもよいかもしれません。

  3. お世話になっております。

    なんでかわからないのですが、もう一度1から作り直してみたら実行できました。
    教えていただきありがとうございました。

  4. なんでかわからないのですが、もう一度1から作り直してみたら実行できました。

    (1) 作り直したプロジェクトではプロジェクト名はどうしたのでしょう?

    空白無しにしたのか、最初の質問にあったように空白を入れても問題は出なかったのでしょうか?

    (2) web.xml ファイルでのパスの設定は必要だったのでしょうか?

    質問のコードは、WebServlet アノテーションを使っていて、web.xml に <url-parttern> の記述は不要にしているように見えますが?

  5. お世話になっております。
    作り直したプロジェクトは空白なしで作成しました。

    最終の実行できたweb.xmlを確認したのですが、上記の内容の記述は書かれていませんでした。
    (エラーが起こっていた時は上記の内容の記載がRegisterServletで記載されていました。)

Your answer might help someone💌