プロが教えるわが家の防犯対策術!

**************************
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件)

回答1



forwardは処理が戻ってきません。
単に残りの処理が行われただけかと。



回答2

回答1にあったようにforwardは、呼び出し元に戻りません。
コンソールコメント1とかが実行されないのは
forward文の次のreturnのためです。

この回答への補足

ご回答ありがとうございます。

>> 回答1
>> forwardは処理が戻ってきません。

それならば、ディスパッチャーで Entry へ行き
(処理が戻ってきません ならば
 そこで(Entryで)、終わる[END]はずでしょ? 戻ってきません なのだから…)
それなのに なぜ また(元の)Actionへ戻ってコンソールコメント3 を表示しているのでしょうか?



>> 回答2
>> forward文の次のreturnのためです。
このreturnは何の働きをしているのでしょうか?

補足日時:2011/05/30 14:39
    • good
    • 0

>それならば、ディスパッチャーで Entry へ行き


>(処理が戻ってきません ならば
> そこで(Entryで)、終わる[END]はずでしょ? 戻ってきません なのだから…)
>それなのに なぜ また(元の)Actionへ戻ってコンソールコメント3 を表示しているのでしょうか?

forwardの処理後即座にそのスレッドを終了するか
しばらく残るかはサーブレットを動かしているAPサーバー次第なので
開発元に問い合わせるしかないけど
動きから推測するに
呼び出しもとの処理を最後まで行っている可能性があるわね。


>このreturnは何の働きをしているのでしょうか?
メソッド(doGet)の呼び出し元に返る
よ。
それ以降の
コンソールコメント1

コンソールコメント3
は実行されなくなるわ。

この回答への補足

参考になります。
簡単な条件分岐なのですが、流れがつかめません…

>> 呼び出しもとの処理を最後まで行っている可能性がある
どうして、そのような流れになるのでしょうか?


>このreturnは何の働き
>> メソッド(doGet)の呼び出し元に返る

それならば、[質問2] で
なぜ、Loginサーブレットへ行ったとき、そこに わざわざ return の記述をしてるのに
(元の「メソッド(doGet)の呼び出し元」である)Actionへ戻らないのか?

補足日時:2011/05/30 18:31
    • good
    • 0

>> 呼び出しもとの処理を最後まで行っている可能性がある


>どうして、そのような流れになるのでしょうか?
サーバの開発元に聞かないと分かりません。
そういう風に作ったと思うしか。

基本、forward処理は遷移先に処理が移るため
わざわざforwardよりも後ろに何か記述することはないので
開発元が考慮し忘れた、なんて可能性もありますが。


> それならば、[質問2] で
> なぜ、Loginサーブレットへ行ったとき、そこに わざわざ return の記述をしてるのに
> (元の「メソッド(doGet)の呼び出し元」である)Actionへ戻らないのか?
LoginサーブレットのdoGetの呼び出し元はActionではありません。
HttpServletです。
forwardした場合は呼び出し元と呼び出し先の繋がりはありません。

この回答への補足

参考になります。

>> 基本、forward処理は遷移先に処理が移るため
>> わざわざforwardよりも後ろに何か記述することはないので

でもこの スタートのActionの return を省くと
500エラーでプログラム自体動かないんだよな…
だからやっぱり return を付けるしかないんだけど
この return は何の働きがあるのだろう???

補足日時:2011/05/31 16:41
    • good
    • 0

500エラーは


Entryを呼びに行こうとしているせいじゃないかと
推測できるわね。

ますます開発元に問い合わせたくなるわ。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!