• 締切済み

ディスパッチャー処理の流れについて

************************** 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つの質問です よろしくお願いします。

  • Java
  • 回答数1
  • ありがとう数1

みんなの回答

  • nora1962
  • ベストアンサー率60% (431/717)
回答No.1

サーブレット+JSPに詳しいわけではありませんが。 基本的にサーブレット+JSPはサーブレットコンテナの配下で動作するはずです。 つまり呼び出し元はTomcatなどのコンテナになるはずです。 質問の(1)ですがJavaでも明示的にreturn文がなくてもメソッドの終端に達すれば呼び出し元に帰ります。ただし、メソッドの型がvoidでないとJavaではエラーになるかもしれませんが(ここは自信ありません)。 質問の(2)ですが、すでに述べたように戻る先はサーブレットコンテナです。

f-force777
質問者

お礼

新たに質問を設けます。 ありがとうございました。

f-force777
質問者

補足

ご回答ありがとうございます。 同じディスパッチャーで飛ばして 到達先も同じvoid なのですが 片方は(Entry) returnなしでも戻り もう片方は(Login)は return を付けても戻らない??? 簡単な条件分岐なのですが、流れがつかめません。 違う点としては スタートのActionで if文実行中 Loginへ飛ばす後に return を付けている箇所ぐらいですか。 でもこの return を省くと、500エラーでプログラム自体動かない… (でも、ここが最重要なポイントな気がしてきました) もう少し考えてみます。

関連するQ&A

  • ディスパッチャー処理の流れについて

    ************************** 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 を付けても戻らない??? よろしくお願いします。

  • Tomcat6.0 日本語が?に文字化け

    HelloWorld!!はろぅわーるど!! と書いてコンパイルすると、IEの画面で HelloWorld!!????????? と表示されます。 日本語というよりは2バイト文字が文字化けしているのかなと思います。 何が足りないのでしょうか。 どなたかよろしくお願いします。 全文はこんな感じです。 import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class HelloWorld extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { PrintWriter out = response.getWriter(); out.println("<html>"); out.println("HelloWorld!!はろぅわーるど!!"); out.println("</html>"); out.close(); } }

  • サーブレット初歩に関して。

    package oty; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Servlet implementation class Otys */ public class Otys extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public Otys() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub } } 初期状態がこんな状態なんですが、これになにを追加したらhelloworldとでますか?? 普通にJAVA入門みたいに、System.out.printlnしたらいいんでしょうか??

    • ベストアンサー
    • Java
  • このソースのコンパイルできません。

    java, サーブレット初心者でコンパイルできません。エラーは以下のとおりです。 初歩的な質問で申し訳ないですがよろしくお願いします。 http://www.javaroad.jp/opensource/js_tomcat2.htm のページのHelloServlet.javaをコピーしてコンパイルをしようとしたらエラーが、、、。 import java.io.*; import java.text.*; import java.util.*; import javax.servlet.*; import javax.servlet.http.*; public class HelloServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<HTML>"); out.println("<BODY>"); out.println(new java.util.Date()); out.println("</BODY>"); out.println("</HTML>"); } } ーーーーーーーーーーーーーーーーーーーーーーーーーーー HelloServlet.java:7: エラー: パッケージjavax.servletは存在しません import javax.servlet.*; ^ HelloServlet.java:8: エラー: パッケージjavax.servlet.httpは存在しません import javax.servlet.http.*; ^ HelloServlet.java:10: エラー: シンボルを見つけられません public class HelloServlet extends HttpServlet { ^ シンボル: クラス HttpServlet HelloServlet.java:11: エラー: シンボルを見つけられません public void doGet(HttpServletRequest request, ^ シンボル: クラス HttpServletRequest 場所: クラス HelloServlet HelloServlet.java:12: エラー: シンボルを見つけられません HttpServletResponse response) ^ シンボル: クラス HttpServletResponse 場所: クラス HelloServlet HelloServlet.java:13: エラー: シンボルを見つけられません throws IOException, ServletException { ^ シンボル: クラス ServletException 場所: クラス HelloServlet エラー6個 エラー

    • ベストアンサー
    • Java
  • 困っています

    フォームに入力したデータをセッションに登録し、次の入力画面でそこまでたまったデータと入力されたデータを追加し、入力欄と一緒に表示するフォームを作っています。特にフォームの中のデータを取り出すあたりが分かりません。どなたか、アドバイス等お願いします。下のソースは作り掛けで、以前作った買い物かごをベースにしています。 import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import java.util.*; public class form extends HttpServlet { public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException,IOException { HttpSession hs = request.getSession(true); ArrayList a = (ArrayList)hs.getAttribute("writing"); if( a == null ) { a = new ArrayList(); } request.setCharacterEncoding("JISAutoDetect"); String s1[] = request.getParameterValues("f1"); String s2 = request.getParameter("f2"); response.setContentType("text/html; charset=Shift_JIS"); PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<head><title>サーブレット</title></head>"); out.println("<body>"); out.println("<form action=http://....method=POST>"); out.println("<h2>入力フォーム</h2>"); out.println("<textarea name=f1 size=5 multiple>"); out.println("

    • ベストアンサー
    • Java
  • サーブレットについて

    こんにちは。 サーブレットに質問したいことがあります。 以下のサンプルソースで、 response.setContentType("text/html;charset=Shift_JIS"); の部分があるのですが、このようにすると日本語が文字化けしてしまいます。 ちなみにresponse.setContentType("text/html); とすると、日本語も文字化けせずに正しく表示されます。 ここで質問なのですが、 サーブレットの場合はJSPと違い、charsetを指定しなくてもよろしいのでしょうか? 何か分かることがありましたらご教授御願い致します。 ---------☆サンプルソース(HelloWorldExample.java)☆---------------- import java.io.*; import java.text.*; import java.util.*; import javax.servlet.*; import javax.servlet.http.*; public class HelloWorldExample extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { response.setContentType("text/html;charset=Shift_JIS"); PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<head>"); out.println("<title>ハローワールド</title>"); out.println("</head>"); out.println("<body>"); out.println("<h1>HelloWorld ハローワールド</h1>"); out.println("</body>"); out.println("</html>"); out.close(); } } ---------------------------------------------------

    • ベストアンサー
    • Java
  • このJAVAの課題について教えてください

    package input; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class jspmodai4Servlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("Windows-31J"); response.setContentType("text/html; charset=Windows-31J"); PrintWriter out = response.getWriter(); String[] nam = request.getParameterValues("text1"); int x = Integer.parseInt(nam[0]); int y = Integer.parseInt(nam[1]); String ans = request.getParameter("radio1"); int z = 0; for(int i = 0; i < z; i++){ } if(ans.equals("value1")){ z = x + y; out.println("奇数の結果は" + z); } }else if (ans.equals("value2") && z%2==0 ){ z = x + y; out.println("偶数の結果は" + z); }else if(x == y){ out.println("エラー"); }else{ out.println("エラー"); } } } 入力フォームから二つの数値を入力させ、「計算」ボタンを押すと、 二つの数値を含む数値間の奇数のみ足し算するプログラム。 でif値がおかしいので奇数と偶数の判定ができません テキストの問題の答えがないので、 なんともいえませんが、 友達に聞いたら、例えば2つの入力フォームで1と4を記述したら、 偶数なら2と4で6となり、奇数なら1と3で4になるそうです。 よろしくお願いします

  • コンパイルエラー

    JBuiderでコンパイルしようとするとエラーがでてしまいます。ソースは以下の通りです。 import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class TestServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session = request.getSession(); Integer count=(Integer)session.getAttribute("count"); if(count == null){  count = new Integer(0); }else{  count = new Integer(count.intValue()+1); } session.setAttribute("count",count); response.setContentType("text/html; charset=Shift_JIS"); PrintWriter out= response.getWriter(); out.println("<html>"); out.println("<head><title>TestServlet</title></head>"); out.println("<body>"); out.println(session.getId()); out.println("<p>\"count\"という名前のattribute = " + count +"</p>"); out.println("</body></html>"); out.close(); } } これをコンパイルすると、 "TestServlet.java": エラー #: 300 : メソッド getAttribute(java.lang.String) が見つかりません: インターフェース javax.servlet.http.HttpSession 行 9, 列 36 "TestServlet.java": エラー #: 300 : メソッド setAttribute(java.lang.String, java.lang.Integer) が見つかりません: インターフェース javax.servlet.http.HttpSession 行 15, 列 13 というメッセージがでます。何が原因なのか教えてください。

  • submitで日本語をおくりたい

    自分は現在JSPの勉強をしているのですが、JSPからサーブレットにsubmitをつかって、日本語を送信した場合文字化けして表示されてしまうので困っています。 ソースコードで説明させていただくと JSP側ソース <%@ page contentType="text/html;charset=Shift_JIS" pageEncoding="Shift_JIS" %> <html> <head><title>a</title></head> <body> <form action="Hello" method="post"> <textarea rows="10" cols="40" name="comment"> ここにコメントを書いて送信を押すとコメントがつきます </textarea><br> <input type="submit" value="送信"> </form> </body> </html> サーブレット側 import java.io.*; import java.text.*; import java.util.*; import javax.servlet.*; import javax.servlet.http.*; public class hello extends HttpServlet { public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { response.setContentType("text/html"); response.setCharacterEncoding("Shift_JIS"); PrintWriter out = response.getWriter(); String msg = request.getParameter("comment"); out.println("<html>"); out.println("<head>"); out.println("<title>Hello World!</title>"); out.println("</head>"); out.println("<body>"); out.println(msg);//ここで表示 out.println("</body>"); out.println("</html>"); } } この様なソースを書いたのですが、サーブレット側で日本語を表示させようとすると、文字化けしてしまいます(英語は普通に表示されます)。 どのようにすれば、サーブレット側で日本語を表示できるのでしょうか? お返事おまちしております。

    • ベストアンサー
    • Java
  • setAttribute(String, int)は適用できない

    setAttribute(String, int)は適用できない 今、servletでセッションの勉強をしています。 ある本に載っているソースコードをそのままコピーしたんですが、 「HttpSessionのメソッド setAttribute(String, Object)は(String, int)に適用できません。」 …というエラーが出て動きません。 こういう場合、実行するにはどうしたら良いのでしょうか? アクセスした回数をカウントすることなんてよくあると思うんです。 intも(Stringなんかも)Objectの下に含まれてるんじゃないんですか? intでも良い気がするんですけど…。 一応、ソースコードを貼っておきます: ### Sample229TestServlet.java ### package com.tips; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; public class Sample228TestServlet extends HttpServlet { /** * */ private static final long serialVersionUID = 1L; private int count = 0; public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=Shift_JIS"); PrintWriter out = response.getWriter(); HttpSession session = request.getSession(); session.setAttribute("param",count++); //問題の箇所 out.println("<html><head><title>Sample228</title></head><body>"); out.println("<h2>SessionAttributeListenerの例</h2>"); out.println("sessionの属性countが" + count + "に変化しました。"); out.println("</body></html>"); out.close(); } } ### Sample228.java ### package com.tips; import javax.servlet.ServletContext; import javax.servlet.http.HttpSessionAttributeListener; import javax.servlet.http.HttpSessionBindingEvent; public class Sample228 implements HttpSessionAttributeListener { public void attributeAdded(HttpSessionBindingEvent event) { } public void attributeRemoved(HttpSessionBindingEvent event) { } public void attributeReplaced(HttpSessionBindingEvent event) { ServletContext app = (event.getSession()).getServletContext(); app.log(">> Sample228 Listener detects attribute changed."); } } …必要であれば補足します。では、宜しくお願いします。

    • ベストアンサー
    • Java

専門家に質問してみよう