**************************
package dispa;
import java.io.IOException;
import javax.servlet.*;
import javax.servlet.RequestDispatcher;
import javax.servlet.http.*;
public class Action extends HttpServlet
{
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException,IOException
{
int flag=0;
request.setAttribute("error", "エラーです");
ServletContext sc = getServletContext();
if (flag == 1)
{
request.setAttribute("count","1");
RequestDispatcher disp =
sc.getRequestDispatcher("/servlet/dispa.Login");
disp.forward(request,response);
return;
}
// コンソールコメント1 ここから
System.out.println("Action if文の外");
System.out.println(flag);
// コンソールコメント1 ここまで
RequestDispatcher disp =
sc.getRequestDispatcher("/servlet/dispa.Entry");
disp.forward(request,response);
// コンソールコメント3 ここから
System.out.println("Action Dispatch処理終了ライン");
// コンソールコメント3 ここまで
}
}
**************************
package dispa;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class Entry extends HttpServlet
{
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException,IOException
{
response.setContentType("text/html;charset=Shift_JIS");
PrintWriter out=response.getWriter();
String errorMSG = (String)request.getAttribute("error");
out.println(errorMSG);
// コンソールコメント2 ここから
System.out.println("Entry エラー");
// コンソールコメント2 ここまで
}
}
**************************
package dispa;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class Login extends HttpServlet
{
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException,IOException
{
response.setContentType("text/html;charset=Shift_JIS");
PrintWriter out=response.getWriter();
String Logcount = (String)request.getAttribute("count");
out.println("Login");
// コンソールコメント4 Login ここから
System.out.println("Login内");
// コンソールコメント4 Login ここまで
if (Logcount.equals("1") )
{
out.println("1回目のログインです");
return;
}
}
}
Action からスタート
int flag=0 のときにはif文は実行されず
コンソールコメント1 を表示
ディスパッチャーで Entry へ行き
コンソールコメント2 を表示
その後 コンソールコメント3 を表示 [END]
[質問1]
なぜ、Entryサーブレットへ行ったとき、そこには return などの記述はないのに
(元の)Actionへ戻るのか?
--------------------------------
int flag=1 と可変して同じくAction からスタート
flag=1 のときにはif文は実行され
count を 1 にセット
ディスパッチャーで Login へ行き
コンソールコメント4 を表示
Logcount ←count にて 1なら 「1回目のログインです」 return
[質問2]
なぜ、Loginサーブレットへ行ったとき、そこに わざわざ return の記述をしてるのに
(元の)Actionへ戻らないのか?
この2つの質問です。
同じディスパッチャーで飛ばして 到達先も同じvoid なのですが
片方は(Entry) returnなしでも戻り
もう片方は(Login)は return を付けても戻らない???
よろしくお願いします。
A 回答 (4件)
- 最新から表示
- 回答順に表示
No.1
- 回答日時:
回答1
forwardは処理が戻ってきません。
単に残りの処理が行われただけかと。
回答2
回答1にあったようにforwardは、呼び出し元に戻りません。
コンソールコメント1とかが実行されないのは
forward文の次のreturnのためです。
この回答への補足
ご回答ありがとうございます。
>> 回答1
>> forwardは処理が戻ってきません。
それならば、ディスパッチャーで Entry へ行き
(処理が戻ってきません ならば
そこで(Entryで)、終わる[END]はずでしょ? 戻ってきません なのだから…)
それなのに なぜ また(元の)Actionへ戻ってコンソールコメント3 を表示しているのでしょうか?
>> 回答2
>> forward文の次のreturnのためです。
このreturnは何の働きをしているのでしょうか?
No.2
- 回答日時:
>それならば、ディスパッチャーで Entry へ行き
>(処理が戻ってきません ならば
> そこで(Entryで)、終わる[END]はずでしょ? 戻ってきません なのだから…)
>それなのに なぜ また(元の)Actionへ戻ってコンソールコメント3 を表示しているのでしょうか?
forwardの処理後即座にそのスレッドを終了するか
しばらく残るかはサーブレットを動かしているAPサーバー次第なので
開発元に問い合わせるしかないけど
動きから推測するに
呼び出しもとの処理を最後まで行っている可能性があるわね。
>このreturnは何の働きをしているのでしょうか?
メソッド(doGet)の呼び出し元に返る
よ。
それ以降の
コンソールコメント1
や
コンソールコメント3
は実行されなくなるわ。
この回答への補足
参考になります。
簡単な条件分岐なのですが、流れがつかめません…
>> 呼び出しもとの処理を最後まで行っている可能性がある
どうして、そのような流れになるのでしょうか?
>このreturnは何の働き
>> メソッド(doGet)の呼び出し元に返る
それならば、[質問2] で
なぜ、Loginサーブレットへ行ったとき、そこに わざわざ return の記述をしてるのに
(元の「メソッド(doGet)の呼び出し元」である)Actionへ戻らないのか?
No.3
- 回答日時:
>> 呼び出しもとの処理を最後まで行っている可能性がある
>どうして、そのような流れになるのでしょうか?
サーバの開発元に聞かないと分かりません。
そういう風に作ったと思うしか。
基本、forward処理は遷移先に処理が移るため
わざわざforwardよりも後ろに何か記述することはないので
開発元が考慮し忘れた、なんて可能性もありますが。
> それならば、[質問2] で
> なぜ、Loginサーブレットへ行ったとき、そこに わざわざ return の記述をしてるのに
> (元の「メソッド(doGet)の呼び出し元」である)Actionへ戻らないのか?
LoginサーブレットのdoGetの呼び出し元はActionではありません。
HttpServletです。
forwardした場合は呼び出し元と呼び出し先の繋がりはありません。
この回答への補足
参考になります。
>> 基本、forward処理は遷移先に処理が移るため
>> わざわざforwardよりも後ろに何か記述することはないので
でもこの スタートのActionの return を省くと
500エラーでプログラム自体動かないんだよな…
だからやっぱり return を付けるしかないんだけど
この return は何の働きがあるのだろう???
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- Ruby 【JAVA】数字をひし形に出力するプログラムについて 2 2022/07/11 23:32
- C言語・C++・C# C# DatagridviewにExcelシートを反映するとエラーが出る 2 2023/05/06 17:12
- その他(プログラミング・Web制作) laravel 本番環境でメールが送れません。 1 2023/02/17 17:57
- JavaScript フォームが空欄の時にフォームの外をクリックすると、エラーが出るコードを調べています。 1 2023/06/25 11:51
- C言語・C++・C# Windows Formアプリからコンソールを呼び出して文字を出力させたい 8 2023/05/09 10:53
- その他(プログラミング・Web制作) python flask から fastapiへの移行時のエラー対処 1 2023/02/05 12:26
- その他(プログラミング・Web制作) Pythonで会員サイトの自動ログイン ID Nameがない 1 2022/12/16 02:09
- PHP アコーディオンPHPが上手くいかない 3 2022/07/15 16:29
- オープンソース Flaskでサーバー立ち上げに関して 1 2023/08/12 21:02
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
yyyymmddからyyyy/mm/d...
-
Java int sum = 0は必要ですか?
-
入力文字列が数字かどうかの判別
-
以下のJAVAプログラムでご質問...
-
equalsの逆
-
java.lang.NoClassDefFoundErro...
-
BufferedReaderでのエラー
-
Javaのカウント方法について
-
Javaの質問です。テキストファ...
-
javaのfor文が機能してないみた...
-
csv出力について
-
Java 読み込んだテキストファイ...
-
Javaのカウント方法について
-
ファイル読み込みで
-
JAVAでエラーがでる。
-
javaでCSVの中身から最大値を表...
-
九九を横に表示する。
-
InputStream.read()でタイムア...
-
java連結
-
Log4jで機能毎に別ファイルへ出...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
yyyymmddからyyyy/mm/d...
-
equalsの逆
-
csv出力について
-
九九を横に表示する。
-
InputStream.read()でタイムア...
-
テキストファイルから空白行をよむ
-
Java int sum = 0は必要ですか?
-
javaのfor文が機能してないみた...
-
BufferedReaderでのエラー
-
Javaの質問です。テキストファ...
-
以下のJAVAプログラムでご質問...
-
Class.forNameでエラーになる
-
ソケットを使ったサーバとクラ...
-
テキストファイルにおいて任意...
-
テキストファイルの任意の文字...
-
JAVAでエラーがでる。
-
Inputstreamについて
-
ObjectInputStreamとStreamCorr...
-
Windowsでの標準入力の終了の仕方
-
[JAVA]エラーが解決できません。
おすすめ情報