前提
jspファイルからサーブレットに遷移するリンクをaタグで作成したのですが、HTTPステータス404エラーが発生し遷移できません。
以下の該当ソースコードの
実現したいこと
ここに実現したいことを箇条書きで書いてください。
- リンクを押せばサーブレットに遷移するようにしたい。
発生している問題・エラーメッセージ
HTTPステータス 404 – 見つかりません。 タイプ ステータスレポート 説明 オリジンサーバーは、ターゲットリソースの現在の表現を見つけられなかったか、またはそれが存在することを開示するつもりはありません。
該当のソースコード
Login.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>ログイン画面</title> 8</head> 9<body> 10 <h1>ログイン画面</h1> 11 <form action="<%= request.getContextPath()%>/CheckLoginInfo" method="post"> 12 13 <label for="name">名前</label><br> 14 <input type="text" id="name" name="user_name"><br> 15 <label for="password">パスワード</label><br> 16 <input type="password" id="password" name="user_pass"><br> 17 18 <input type="submit" value="ログイン"><br> 19 20 21 </form> 22//該当箇所// 23 <a href="<%= request.getContextPath()%>/SignUp">新規登録はこちら</a> 24</body> 25</html>
SignUp.java
1package controller; 2 3import java.io.IOException; 4 5import javax.servlet.RequestDispatcher; 6import javax.servlet.ServletException; 7import javax.servlet.annotation.WebServlet; 8import javax.servlet.http.HttpServlet; 9import javax.servlet.http.HttpServletRequest; 10import javax.servlet.http.HttpServletResponse; 11import javax.servlet.http.HttpSession; 12 13import model.UserDataDto; 14 15/** 16 * Servlet implementation class SignUp 17 */ 18@WebServlet("/SignUp") 19public class SignUp extends HttpServlet { 20 private static final long serialVersionUID = 1L; 21 22 /** 23 * @see HttpServlet#HttpServlet() 24 */ 25 public SignUp() { 26 super(); 27 // TODO Auto-generated constructor stub 28 } 29 30 /** 31 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 32 */ 33 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 34 // TODO Auto-generated method stub 35 HttpSession session = request.getSession(); 36 UserDataDto UserOnSession = (UserDataDto)session.getAttribute("USER_DATA"); 37 38 if(UserOnSession != null) { 39 40 RequestDispatcher dispach = request.getRequestDispatcher("/WEB-INF/view/SingUp.jsp"); 41 dispach.forward(request, response); 42 43 }else { 44 response.sendRedirect("/WEB-INF/view/PortfolioPage.jsp"); 45 } 46 } 47 48 /** 49 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 50 */ 51 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 52 // TODO Auto-generated method stub 53 doGet(request, response); 54 } 55 56} 57
試したこと
hrefに記述するパスを変えてみました。
・href="/SignUp"
・href="/Portfolio/SignUp"
補足情報(FW/ツールのバージョンなど)
forwardとsendRedirect
どっちに入ってますか?
すみません。どっちに入っているというのは、何がどっちに入っているということでしょうか。理解不足で申し訳ございません。
SignUp クラスの
doGetメソッドの
if(UserOnSession != null) {
の分岐です。
どの時点で404になっているかを確認する必要があります。
IDEでしたらデバッグモードで、ブレイクポイントを貼ってどこを通っているか確認できるはずですので、
確認を。
ご返信ありがとうございます。先ほどデバックと行ったところ、Login.jspの下の方のaタグのところで404のエラーが発生しました。こちらです。→<a href="<%= request.getContextPath()%>/SignUp">新規登録はこちら</a>
そこだけで404が発生することはないと思います。
404はリクエストURLに対応するソースがないということですから。
というか、SignUp.doGet()には入ってないということですか?
404になったときのURLはどうなっていますか?アドレスバー確認してください。
重ね重ねご対応いただきありがとうございます。
SignUp.doGet()には入っており、URLを確認した所elseの中のリダイレクトが実行されていました。また、ifの中にリダイレクト、elseの中にフォワードを入れても、elseの中のフォワードが実行されましたが404エラーが出ました。
わかりました。
例えば
http://ドメイン/プロジェクト名/view/PortfolioPage.jsp
とかで直にアクセスできますか?
確かブラウザからWEB-INFって直接参照できなかった気がするので、
ブラウザから直接参照させたいのでしたら場所移動した方がいいかもしれません。
そのうえでwebappをWebルートとして有効なURLをリダイレクトに記述。
PortfolioPage用のサーブレットがあるなら、URLはサーブレットの@WebServlet設定もしくはweb.xmlの設定に合わせたURLに修正してリダイレクトを。
ご回答いただきありがとうございます。
色々試したところ、<a href="<%= request.getContextPath()%>/SignUp"></a>とするのではなく、formタグを作りaction="<%= request.getContextPath()%>/SignUp";とすると上手くいきました。
何度も真摯にご対応いただき本当にありがとうございました。
formのmethodをgetもしくは未指定にするならaタグで遷移するのも同じですよ。
URL直打ちと同じくリクエストメソッドはGETです。
※ちなみにこちらは回答ではなく質問への追記修正依頼のコメント欄で、私もまだ回答は出来ないなと思って色々確認してもらっていました。たまにそれだけで解決することもあるのですけどね。
aタグとformのgetメソッドの挙動は同じなんですね。勉強になります。
ただそうなると、aタグの時は404エラーでformの時は実行されているというのはどういったことが原因と考えられるのでしょうか。
念のため、両方のコードをもって自身で回答に記載し、いったん解決としてもらって良いですか?
サーブレット側の受け方の問題かもしれないですし。とりあえず解決は解決なので・・
https://teratail.com/help#resolve-myself
>aタグとformのgetメソッドの挙動は同じなんですね
同じではなく「リクエストメソッドがGETである」という点だけです。
formは「form内のリクエストの送信」の役割があるので、他にも色々とついてきます。
承知しました。ありがとうございます。
回答1件
あなたの回答
tips
プレビュー
