• ベストアンサー

getRequestDispatcher の機能について

こんいちは。 下記の機能を使用して転送したいのですがエラーになってしまいます。 tomcatの設定ファイル、web.xmlなどのファイルに何か情報を登録しなければならないのでしょうか? どなたかご存知でしたら教えていただけないでしょうか? 環境 tomcat4.1 機能 ****** getServletConfig().getServletContext().getRequestDispatcher("/cc/t_1.jsp").forward(request,response); ****** ソース package cc; import mng.*; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class t_1 extends HttpServlet { public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException { //response.sendRedirect("/cc/t_1.jsp"); getServletConfig().getServletContext().getRequestDispatcher("/cc/t_1.jsp").forward(request,response); } public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException { doGet(request,response); } } 下記がエラー内容になります。 HTTP Status 404 - /cc/t_1.jsp The requested resource (/cc/t_1.jsp) is not available.

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

質問者が選んだベストアンサー

  • ベストアンサー
  • lawson
  • ベストアンサー率44% (29/65)
回答No.3

もう、解決済みかもしれませんが。 sendRedirectは webサーバがことなっていてもOK forwardの場合は 同一Webサーバ内でのみ 有効の遷移方法だった淡い記憶があります。 ですから。 /からはじまるパス表記の意味合いがことなる可能性が あります。 forwardは/から始まる場合は ccからはじまる。 sendRedirectは /からはじまる場合 Webappsとかそのあたりからかもしれません。 環境がからむのはいつも最初のほうなので。 いつも、適当に試行錯誤して、 いつも詳細を忘れてしまいます。 なので、この発言も適当です。 まったく、ためしていませんし、間違っているかも しれませんが・・・。 /t_1.jsp をforwardで指定してみてはいかがでしょうか?

sys_com
質問者

お礼

ご連絡ありがとうございました。すばらしい。1発で表示ができました。まさにそのとおりでした。lawson 様ありがとうございました。

sys_com
質問者

補足

ご連絡ありがとうございました。すばらしい。1発で表示ができました。まさにそのとおりでした。lawson 様ありがとうございました。

その他の回答 (2)

  • lawson
  • ベストアンサー率44% (29/65)
回答No.2

どの設定が原因で あるのか情報不足で詳細は不明です。 404はファイルノットファウンドの エラーだと思います。 ただ、デバッグ方法として、アドバイスがあると すれば、一度JAVAソースから離れて、 http://loacalhost:8080/アプリケーション名/cc/t_1.jsp など、考えられるいろんなURLをブラウザ上で直接なんども、たたいて、ためしてみるのはどうでしょうか? ファイルノットファウンドエラー 以外のエラーまたは、正常に動作する 状態になってから、 JAVAソースに再び目を向ける。 つまり、404のエラーを取り除くことだけに 集中するということです。

sys_com
質問者

補足

ご連絡いただきましてありがとうございました。 getServletConfig().getServletContext().getRequestDispatcher("/cc/t_1.jsp").forward(request,response);の箇所を response.sendRedirect("/cc/t_1.jsp"); と置き換えた場合うまく動作するのですが、パスの記述方法がわるいのでしょうか?

  • jun-1
  • ベストアンサー率29% (18/61)
回答No.1

$CATALINA_HOME/webapps 以下に「cc」というディレクトリはありますか? あるなら、そこに「t_1.jsp」ファイルは存在しますか?

参考URL:
http://www.jajakarta.org/tomcat/tomcat3.2-4.0/tomcat-4.0/webapps/tomcat-docs-ja/
sys_com
質問者

補足

はいございます。他のjspやサーブレットは問題なく動作しております。web.xmlの<servlet-mapping>と<servlet>の設定は行っております。

関連するQ&A

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

    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
  • サーブレットのコンパイルについて

    はじめまして。 学校の課題の方でJSP/サーブレットをやっているのですが、サーブレットのコンパイルが通りません。 プログラムとエラーと環境変数は以下の通りです。 【プログラム】 import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class HelloServlet extends HttpServlet { public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException,ServletException { printWriter out = response.getWriter(); out.println("hello"); } } 【エラー】 HelloServlet.java:2: パッケージ javax.servlet は存在しません。 import javax.servlet.*; ^ HelloServlet.java:3: パッケージ javax.servlet.http は存在しません。 import javax.servlet.http.*; ^ HelloServlet.java:5: シンボルを解決できません。 シンボル: クラス HttpServlet 場所 : HelloServlet の クラス public class HelloServlet extends HttpServlet ^ HelloServlet.java:7: シンボルを解決できません。 シンボル: クラス HttpServletRequest 場所 : HelloServlet の クラス public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException,ServletException ^ HelloServlet.java:7: シンボルを解決できません。 シンボル: クラス HttpServletResponse 場所 : HelloServlet の クラス public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException,ServletException ^ HelloServlet.java:7: シンボルを解決できません。 シンボル: クラス ServletException 場所 : HelloServlet の クラス public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException,ServletException ^ HelloServlet.java:9: シンボルを解決できません。 シンボル: クラス printWriter 場所 : HelloServlet の クラス printWriter out = response.getWriter(); 【環境変数】 CATALINA_HOME C:\servletbook\apache-tomcat CLASSPATH %CATALINA_HOME%\common\lib\jsp-api.jar;%CATALINA_HOME%\webapps\atmarkit\WEB-INF\classes;%CATALINA_HOME%\common\lib\servlet-jsp.jar; よろしくお願いします。

  • サーブレットの動作

    以下のようなサーブレットのプログラムがあります。 本サーブレットを実行すると、simpleDB.jspに飛ぶようになっています。 疑問点は以下です。 ・GetやPostを使って送られてくるデータがないのに、なぜ  本プログラムが動くのか分かりません(根本的に分かって  ないんですが)。 ・getServletContext().setAttribute("list", employeeList)で  listに設定をしてますが、listは飛ぶ先のsimpleDB.jspで定義  されています。なぜこのサーブレットで定義されていないものを、  設定することが可能なのでしょうか? 以上、ご回答頂けると幸いです。 ---------- import java.io.IOException; import文以下略 public class EmployeeServlet extends javax.servlet.http.HttpServlet { /** * 初期化メソッド * 社員一覧をapplicationスコープにセットします */ public void init() { EmployeeDAO dao = new EmployeeDAO();     //EmployeeDAOクラスは他で定義済み ArrayList<Employee> employeeList = dao.findAll(); getServletContext().setAttribute("list", employeeList); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } /** * リクエストを処理するメソッド * simpleDB.jspに移動し、社員一覧を表示します */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String nextPage = "/view/simpleDB.jsp"; ServletContext context = getServletContext(); RequestDispatcher rd = context.getRequestDispatcher(nextPage); rd.forward(request, response); } }

    • ベストアンサー
    • Java
  • javaservletの質問

    package test; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; @WebServlet(urlPatterns={"/test/Test2"}) public class Test2 extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session = request.getSession(false); // セッションを取得(新しいセッションを作成しないようにする) if (session != null) { response.getWriter().write("yes, World!"); // クライアントにテキストを出力 } else { response.getWriter().write("no, World!"); // クライアントにテキストを出力 } } }sessionがある場合にはyesを、無い場合にはnoを出力したいのですが必ずyesになってしまいます。 HttpSession session = request.getSession(false); でsessionがない場合には作成しないようにしているはずなのになぜでしょうか

  • doPost+doGet

    public class Class{ public void doPost (HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException try{ //処理 }catch(Exception e){ e.printStackTrace(); } } public void doGet (HttpServletRequest request,HttpServletResponse response){ try{ doPost(request, response); }catch(Exception e){ e.printStackTrace(); } } } この処理は、doGetで送信されたものをdoPostに送って処理するということでよろしいのでしょうか? 分かる方がいましたら、よろしくお願いします。

    • ベストアンサー
    • Java
  • ディスパッチャー処理の流れについて

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

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

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

  • 干支の計算で。。。

    jspの"year"パラメータから生年を受け取って干支を表示するプログラムなのですが、 計算(year + 8)%12の所でなぜ「+8」をするのか分かりません。 技術的といいますか算数レベルの問題ですが どなたかご教授をお願いいたします。 ちなみに自分なりの考えだと紀元前1年が申にあたるからでしょうか? だとしても何かスッキリしません。 宜しくお願いいたします。 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 EtoServlet extends HttpServlet{ //インデントしてなく見難いですが・・・。すみません。。。。 private final String [] ETOS = {"子","丑","寅","卯","辰","巳","午", "未","申","酉","戌","亥"}; public void doGet(HttpServletRequestrequest,HttpServletResponse response) throws IOException, ServletException{ String yearStr = request.getParameter("year"); int year = Integer.parseInt(yearStr); int index = (year + 8) % 12; String etoText = ETOS[index]; response.setContentType("text/plain;charset=Shift_JIS"); PrintWriter out = response.getWriter(); out.println("あなたの干支は "+etoText + "デス"); } }

    • ベストアンサー
    • Java
  • 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(); } }

  • サーブレットを始めようとしたのですが・・・

    サーブレットを始めようとして、「10日でおぼえるJSP/サーブレット入門教室」を使って勉強しようとしているのですが、最初のファイルをコンパイルしようとしたら下記のようなエラーが出てコンパイルできませんでした。 SrvIntro.java:6: パッケージ javax.servlet は存在しません。 import javax.servlet.ServletException; ^ SrvIntro.java:7: パッケージ javax.servlet.http は存在しません。 import javax.servlet.http.HttpServlet; ^ SrvIntro.java:8: パッケージ javax.servlet.http は存在しません。 import javax.servlet.http.HttpServletRequest; ^ SrvIntro.java:9: パッケージ javax.servlet.http は存在しません。 import javax.servlet.http.HttpServletResponse; ^ SrvIntro.java:11: シンボルを解決できません。 シンボル: クラス HttpServlet 場所 : day07.SrvIntro の クラス public class SrvIntro extends HttpServlet{ ^ SrvIntro.java:12: シンボルを解決できません。 シンボル: クラス HttpServletRequest 場所 : day07.SrvIntro の クラス public void doGet(HttpServletRequest request, HttpServletResponse respon se) ^ SrvIntro.java:12: シンボルを解決できません。 シンボル: クラス HttpServletResponse 場所 : day07.SrvIntro の クラス public void doGet(HttpServletRequest request, HttpServletResponse respon se) ^ SrvIntro.java:13: シンボルを解決できません。 シンボル: クラス ServletException 場所 : day07.SrvIntro の クラス throws ServletException, IOException{ ^ エラー 8 個 調べた感じだとクラスパスの設定が間違っている可能性大ということらしいのですが、何度確かめてもクラスパスは合ってると思うのです・・ 何かこれじゃないか?という原因に心当たりがあればよろしくお願いします。

    • ベストアンサー
    • Java

専門家に質問してみよう