• 締切済み

return new ActionForward("xxx.do",true);による画面遷移

tomcat、struts、mysqlで作成したアプリケーションなのですが・・・ 画面Aからリンクをクリックし画面Bへいく動作がたまに(頻繁ではありません。)おかしくなります。 画面Aからリンクをクリックすると、画面Bではなく、アプリケーションの一番始めの画面(index.jsp)へとんでしまいます。 おかしくなる条件はつかめていません。 index.jspの中身 response.sendRedirect("./tologin.do"); 画面A(A.jsp)のリンク ●<a href="open.do?・・・・" →open.doによって呼ばれるアクション  ●ActionA.java →ActionA.javaにかかれている遷移先  ●return new ActionForward("next.do",true); →next.doによって呼ばれるアクション  ●ActionB.java →ActionB.javaにかかれている遷移先  ●return mapping.findForward(SUCCESS); →画面B(B.jsp) という流れになっています。 tomcatのログを見ると・・・ *********** 正常なとき ******************** 日付 StandardContext[/application]: Mapped to servlet 'jsp' with servlet path '/jsp/A.jsp' and path info 'null' and update=true 日付 StandardContext[/application]: Mapping contextPath='/application' with requestURI='/application/open.do' and relativeURI='/open.do' 日付 StandardContext[/application]: Trying exact match 日付 StandardContext[/application]: Trying prefix match 日付 StandardContext[/application]: Trying extension match 日付 StandardContext[/application]: Mapped to servlet 'action' with servlet path '/open.do' and path info 'null' and update=true 日付 StandardContext[/application]: Mapping contextPath='/application' with requestURI='/application/next.do' and relativeURI='/next.do' 日付 StandardContext[/application]: Trying exact match 日付 StandardContext[/application]: Trying prefix match 日付 StandardContext[/application]: Trying extension match 日付 StandardContext[/application]: Mapped to servlet 'action' with servlet path '/next.do' and path info 'null' and update=true 日付 StandardContext[/application]: Mapping contextPath='/application' with requestURI='/application/jsp/B.jsp' and relativeURI='/jsp/B.jsp' *********** 異常なとき ******************** 日付 StandardContext[/application]: Mapped to servlet 'jsp' with servlet path '/jsp/A.jsp' and path info 'null' and update=true 日付 StandardContext[/application]: Mapping contextPath='/application' with requestURI='/application/open.do' and relativeURI='/open.do' 日付 StandardContext[/application]: Trying exact match 日付 StandardContext[/application]: Trying prefix match 日付 StandardContext[/application]: Trying extension match 日付 StandardContext[/application]: Mapped to servlet 'action' with servlet path '/open.do' and path info 'null' and update=true 日付 StandardContext[/application]: Mapping contextPath='/application' with requestURI='/application/' and relativeURI='/' 日付 StandardContext[/application]: Trying exact match 日付 StandardContext[/application]: Trying prefix match 日付 StandardContext[/application]: Trying extension match 日付 StandardContext[/application]: Mapped to servlet 'action' with servlet path '/' and path info 'null' and update=true 日付 StandardContext[/application]: Mapping contextPath='/application' with requestURI='/application/jsp/index.jsp' and relativeURI='/jsp/index.jsp' となっていて、パスが抜けてしまっているようです。 何度ログインをし直しても、同じ状態が繰り返され続けました。 tomcatの再起動をしても解消されず、何度か繰り返した後、ログイン画面を呼び出すパス(tologin.do)を手打ちして呼び出されたログイン画面からログインをしたところなぜか正常に戻りました。 return new ActionForward("next.do",true);がいけないのでしょうか? ちなみにreturn new ActionForward("next.do",true);をreturn new ActionForward("",true);とすると、異常な時と同じようなログが出力されます。 よくわからないのですが、return new ActionForward();で遷移するのと、return mapping.findForward();で遷移するのの違いは何でしょうか? アドバイスよろしくお願いします。

noname#82982
noname#82982
  • Java
  • 回答数1
  • ありがとう数1

みんなの回答

回答No.1

回答がつかないのでちょっと一言 ActionForwardを生成して遷移させたことが無いのでよくわかりませんが、strutsのjavadocには 「このクラスが既存のアプリケーションが使用している公開されたAPIの一部であるという事実がなければ、 このクラスの使用は推奨されずに org.apache.struts.config.ForwardConfig に置き換えられていたでしょう。」 とあります。 あまり推奨されてないようですので、ActionForwardを使わないという手段は取れないのでしょうか?

参考URL:
http://www.jajakarta.org/struts/struts1.1/documentation/ja/target/api/org/apache/struts/action/ActionForward.html
noname#82982
質問者

お礼

そうですね・・・ 他のところとは別にあえてそこだけActionForwardで遷移させているので、何か意味があるのかと思ったのですが。よくわからず困っています。 何か考えてみようと思います。ありがとうございました。

関連するQ&A

  • strutsで画面遷移

    お世話になります。struts初心者です。 test1.jspから、リンクをクリックしたら、次のページ(download.jsp)へ遷移させたいのですが、「ページが見つかりません」となってしまいます。 以下のようなソースコードにしています。 どこがおかしいのでしょうか・・・・情報少ないでしょうか。わかる方いらっしゃいましたら、おしえてください。 https://xxxxx/test/test1.jsp  ↓リンククリックで下記URLになり「ページが見つかりません」 https://xxxxx/login/menu.do ------------------------------------------------------- test1.jsp ------------------------------------------------------- <html:html> <head> <script language="JavaScript"> <!-- function gonext(){ document.menuForm.menuOperation.value ="download"; document.menuForm.submit(); } --> </script> </head> <body> <html:form action="/login/menu"> <html:hidden property="menuOperation"/> <A href="javascript:gonext()"> go next </A> </html:form> </body> </html:html> ------------------------------------------------------- struts-config.xml ------------------------------------------------------- <form-beans> <form-bean name="menuForm" type="xxx.login.CMenuActionForm"/> </form-beans> <action-mappings> <action path="/login/menu" type="xxx.login.CMenuAction" name="menuForm" scope="request"> <forward name="download" path="/common/download.jsp"/> </action> </action-mappings> ------------------------------------------------------- CMenuAction.java ------------------------------------------------------- public class CMenuAction extends CxxxDLAction{ public ActionForward execute( ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { return mapping.findForward("download"); } } ------------------------------------------------------- CMenuActionForm.java ------------------------------------------------------- public class CMenuActionForm extends ActionForm{ String menuOperation; public String getmenuOperation() { return menuOperation; } public void setmenuOperation(String menuOperation) { this.menuOperation = menuOperation; } }

  • 画面遷移時のデータ遷移について

    文字数制限があったので短くして投稿させていただきます。 入力画面で入力した値を次の確認画面で表示したいと思っているんですがどのようにしたらよいでしょうか? web.xmlでは定義してあります。 入力前のJSPは作成しました。 入力後のJSPをどのようにしたらいいでしょうか? また入力画面のJSPは変更する必要があるでしょうか? --------------------------------------------- package monndai; import java.io.IOException; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class Monsyo_NewFileDate extends HttpServlet { public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { RequestDispatcher reqDis = null; try { System.out.println(); //表示JSP決定 reqDis = req.getRequestDispatcher("/jsp/Monsyo_newFileDate.jsp"); //forward reqDis.forward(req,res); } catch (Exception e) { System.out.println("err"); e.printStackTrace(); req.setAttribute("exception", e); reqDis = req.getRequestDispatcher("/jsp/error.jsp"); reqDis.forward(req, res); } } } --------------------------------------------- package monndai; import java.io.IOException; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class Monsyo_NewFileInputData extends HttpServlet { public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { RequestDispatcher reqDis = null; try { System.out.println(); //表示JSP決定 reqDis = req.getRequestDispatcher("/jsp/Monsyo_newFileInputData.jsp"); //forward reqDis.forward(req,res); } catch (Exception e) { System.out.println("err"); e.printStackTrace(); req.setAttribute("exception", e); reqDis = req.getRequestDispatcher("/jsp/error.jsp"); reqDis.forward(req, res); } } } --------------------------------------------- <%@page language="java" %> <%@page contentType="text/html;charset=EUC-JP"%> <% String returnPath0 = null; String returnPath1 = null; %> <html> <head> <script language="JavaScript"> <!--//  function checkLength(obj, maxlen) {   if(obj.value.length > maxlen) {    obj.disabled = true;    obj.value = obj.value.substring(0,maxlen);   }   obj.disabled = false;   obj.focus(); // BackSpace防止  } function sendRequest(path) { document.fr.action = path; document.fr.submit(); } --> </script> </head> <title>新問処発行</title> <body> <form name="fr" onSubmit="true" method="POST" > <div align="left"> <h3> 新問処発行</h3> <br> <日付> (XXXX/XX/XX)<br> <input type="text" align="left" maxlength="10" name=" " size="15" > <br> <タイトル>(100文字以内)<br> <textarea rows="5" cols="60" name="title" onkeyup="checkLength(this, 100);" style="ime-mode:active"></TEXTAREA> <br> <% returnPath0 = "sendRequest('/mondai/Monsyo_NewFileInputDataServlet')"; returnPath1 = "sendRequest('/mondai/Monsyo_ToppageServlet')"; %> <br> <input type="button" value="入力" onClick="<%= returnPath0 %>"/> <input type="button" value="戻る" onClick="<%= returnPath1 %>"/> </div> </form> </body> </html> ---------------------------------------------

  • 画面遷移時のデータ遷移について

    Javaにも記載してしまったのですがこちらに記載すべきかと思い投稿させていただきました。 2重投稿になってしまうため削除しようとしたのですが24時間経たないと削除できませんでした。 24時間後に1つにしようと思います。 皆様のお力をお貸しください。 よろしくお願いします。 入力画面で入力した値を次の確認画面で表示したいと思っているんですがどのようにしたらよいでしょうか? web.xmlでは定義してあります。 入力前のJSPは作成しました。 入力後のJSPをどのようにしたらいいでしょうか? また入力画面のJSPは変更する必要があるでしょうか? --------------------------------------------- package monndai; import java.io.IOException; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class Monsyo_NewFileDate extends HttpServlet { public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { RequestDispatcher reqDis = null; try { System.out.println(); //表示JSP決定 reqDis = req.getRequestDispatcher("/jsp/Monsyo_newFileDate.jsp"); //forward reqDis.forward(req,res); } catch (Exception e) { System.out.println("err"); e.printStackTrace(); req.setAttribute("exception", e); reqDis = req.getRequestDispatcher("/jsp/error.jsp"); reqDis.forward(req, res); } } } --------------------------------------------- package monndai; import java.io.IOException; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class Monsyo_NewFileInputData extends HttpServlet { public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { RequestDispatcher reqDis = null; try { System.out.println(); //表示JSP決定 reqDis = req.getRequestDispatcher("/jsp/Monsyo_newFileInputData.jsp"); //forward reqDis.forward(req,res); } catch (Exception e) { System.out.println("err"); e.printStackTrace(); req.setAttribute("exception", e); reqDis = req.getRequestDispatcher("/jsp/error.jsp"); reqDis.forward(req, res); } } } --------------------------------------------- <%@page language="java" %> <%@page contentType="text/html;charset=EUC-JP"%> <% String returnPath0 = null; String returnPath1 = null; %> <html> <head> <script language="JavaScript"> <!--//  function checkLength(obj, maxlen) {   if(obj.value.length > maxlen) {    obj.disabled = true;    obj.value = obj.value.substring(0,maxlen);   }   obj.disabled = false;   obj.focus(); // BackSpace防止  } function sendRequest(path) { document.fr.action = path; document.fr.submit(); } --> </script> </head> <title>新問処発行</title> <body> <form name="fr" onSubmit="true" method="POST" > <div align="left"> <h3> 新問処発行</h3> <br> <日付> (XXXX/XX/XX)<br> <input type="text" align="left" maxlength="10" name=" " size="15" > <br> <タイトル>(100文字以内)<br> <textarea rows="5" cols="60" name="title" onkeyup="checkLength(this, 100);" style="ime-mode:active"></TEXTAREA> <br> <% returnPath0 = "sendRequest('/mondai/Monsyo_NewFileInputDataServlet')"; returnPath1 = "sendRequest('/mondai/Monsyo_ToppageServlet')"; %> <br> <input type="button" value="入力" onClick="<%= returnPath0 %>"/> <input type="button" value="戻る" onClick="<%= returnPath1 %>"/> </div> </form> </body> </html> ---------------------------------------------

  • struts関連 web.xmlに複数の<servlet-mappin

    struts関連 web.xmlに複数の<servlet-mapping>を記述する方法について 初歩的なことなのかもしれませんが質問させてください。 Struts1.3.5での質問なのですが、web.xmlにURLパターンを複数記述している場合に servlet-mapping の記載位置が後の方のURLパターンが、 JSPのFormタグで生成されるパスに設定されてしまい、原因が分からず困っています。 現象としては、 例えば、web.xmlの<servlet-mapping>にそれぞれ異なる URLパターンを[/abc/*]→[/xyz/*]の順で記述している場合、 web.xml(抜粋)---------------------------------------------- <servlet-mapping> <servlet-name>TestServlet</servlet-name> <url-pattern>/abc/*</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>TestServlet</servlet-name> <url-pattern>/xyz/*</url-pattern> </servlet-mapping> ---------------------------------------------------------- URLパターンが[/abc/*]となる以下のURLをブラウザで表示した所、 [https:/localhost/{コンテキストルート}/abc/LoginAction] 表示されたJSP内で指定しているformタグのアクションパスが web.xmlで記載したURLパターンのパスではなく、 web.xmlで後の方に記載した別のURLパターンのパス(/xyz/)が設定されてしまいます。 ・表示されるJSP内で指定しているアクションパス <html:form action="/LoginAction"> 上記で生成されるHTML <form name="LoginForm" method="post" action="/コンテキスト名/xyz/LoginAction">       web.xmlでURLパターンを[/xyz/*]→[/abc/*]の順で記述した場合は、 正しくURLパターンで記述したパスが設定されます。 <form name="LoginForm" method="post" action="/コンテキスト名/abc/LoginAction"> ただし、この場合はURLパターンが[/xyz/*]のURLを表示した場合に <form ~ action="/{コンテキストルート}/abc/LoginAction">となってしまいます。 どなたかこうした現象について回避策をご存知の方はいらっしゃらないでしょうか?

    • ベストアンサー
    • Java
  • JSPからサーブレットを呼び出す際に404エラー

    現在、tomcatでサーブレット/JSPの勉強をしています。 参考書に載っている、jspの入力画面で入力した値をサーブレットで受け取り、そのまま表示させるようなサンプルを作成しています。 JSPの入力画面は表示できるのですが、値を入力してサーブレットに移動する際、404エラーが出てしまいます。 ・ファイルの配置 basic |-input |...|-echo.jsp |-WEB-INF |...|-src |......|-input |.........|-EchoServlet.java |...|-classes |......|-input |.........|-EchoServlet.class |...|-web.xml ・echo.jsp内のサーブレットのパスに関する記述 <FORM ACTION="../servlet/input.EchoServlet"> ・web.xmlの記述 <servlet> <servlet-name>EchoServlet</servlet-name> <servlet-class>input.EchoServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>EchoServlet</servlet-name> <url-pattern>/servlet/EchoServlet</url-pattern> </servlet-mapping> tomcatの/confのinvokerのコメントは外していません。 過去の質問も調べてみて、上記の記述の辺りがおかしいのではないかと 思うのですが、、お気付きの点がありましたら教えて頂けないでしょうか。

    • ベストアンサー
    • Java
  • executeメソッドが複数回呼ばれている?

    こんばんは。現在、Java言語を勉強しているものです。 初めて間もないので、文章がわかり辛い点があるかとは思いますが 宜しくお願い致します。 ※strutsを使用しています。 JSPのある画面から、ボタンを押下することにより、 下記のアクションを実行しています。 しかし、一回しかボタンを押下していないにも関わらず、 executeメソッドが複数回呼ばれるパターンがあります。 public final class TestAction extends Action { public ActionForward execute( ActionMapping mapping, ActionForm form, HttpServletRequest req, HttpServletResponse res) { System.out.println("TEST"); return (new ActionForward(mapping.getInput())); } } ※ マッピングは下記のとおりです。 <action path="/test" type="package.TestAction" name="XXXXForm" validate="true" input="/pages/XXXXX.jsp" scope="request"> </action> ※コンソール上に、 TEST と表示される場合と TEST TEST と表示される場合があります。 一度しかCALLされないようにしたいのですが(一度しかCALLされないものだと思っているのですが)、 どのように対処したらいいかで困っております。 ご指南のほう、宜しくお願い致します。 宜しくお願い致しますm(_ _)m

    • ベストアンサー
    • Java
  • eclipse + lomboz + tomcatでのサーブレットの実行方法

    お世話になります。 現在、eclipse + lomboz + tomcatを連携し、メッセージを表示するサーブレット(一部抜粋:参照1)を実行しようとしているのですが、ブラウザにエラーメッセージ(内容:ページが見つかりません HTTP 404 - ファイル未検出)が表示されてしまいます。デプロイ、debug serverは成功してるのですが、サーブレットファイルがうまく配置されてないのでしょうか? web.xmlのmappingやserver.xmlの設定はチェックしております(参照2)。 直接URLで指定したjspファイル、tomcatのサンプルサーブレットの表示はできます。 参照1 ********** SC.java の一部抜粋****************** PrintWriter out = response.getWriter(); out.println("HelloServlet"); *********************************************** 参照2 ********** server.xml ************  <Context path="/SC" reloadable="true" docBase="○○" workDir="○○" /> ********************************** ********** web.xmlの編集 ********** <servlet> <servlet-name>SC</servlet-name> <servlet-class>SC</servlet-class> </servlet> <servlet-mapping> <servlet-name>SC</servlet-name> <url-pattern>/SC</url-pattern> </servlet-mapping> ********************************** ソフトのバージョン  Eclipse:3.0.2  rg.objectweb.lomboz_3.0.1.N20050106  emf-sdo-xsd-SDK-2.0.2  tomcat4.1.27 一般的に何か足りない点や間違ってる点がありましたらご教授願います。 宜しくお願いします。

  • resin.confの設定でご質問です

    resin.confの設定でご質問です。 eclipseでプログラム開発をしているのですが、 上手くソースファイルがコンパイルされません。 ご存知の方がおられましたら、ご教授ください。 よろしくお願い致します。 下記に環境を記載します。 ・resinのVersion:resin-3.0.24 ・resin.confの内容 <host id="" root-directory="."> <web-app id="/" document-directory="D:/resin-3.0.24/webapps/resinsample"> <jsp auto-compile='true' precompile='true' recompile-on-error='true'/> <servlet-mapping url-pattern='/resinsample/*' servlet-name='invoker'/> </web-app> <class-loader> <compiling-loader path='D:/resin-3.0.24/webapps/resinsample/WEB-INF/classes' source='D:/resin-3.0.24/webapps/resinsample/src'/> <library-loader path='D:/resin-3.0.24/webapps/resinsample/WEB-INF/lib'/> </class-loader> </host> ・eclipseのソースフォルダ階層 resin_project(resinプロジェクト) | |----resinsample(webapp配下) | |-----src | |-----pkg | | | |-----SimpleServlet.java ←上手くコンパイルされない | | -----SimpleServlet.java ←コンパイルされる ・web.xml内容 <?xml version="1.0" encoding="ISO-8859-1"?> <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4"> <servlet> <servlet-name>test</servlet-name> <servlet-class>SimpleServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>test</servlet-name> <url-pattern>/SimpleServlet</url-pattern> </servlet-mapping> <servlet> <servlet-name>test2</servlet-name> <servlet-class>pkg.SimpleServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>test2</servlet-name> <url-pattern>/SimpleServlet2</url-pattern> </servlet-mapping> </web-app> エラー内容 [18:23:30.421] In-place class redefinition (HotSwap) is not available. In-place class reloading during development requires a compatible JDK and -Xdebug. [18:23:30.546] com.caucho.config.LineConfigException: WEB-INF/web.xml:19: `pkg.SimpleServlet' is not a known servlet. Servlets belong in the classpath, often i n WEB-INF/classes.

  • strutsに関連したxmlのサーブレットマッピング

    失礼致します。 初歩的なことですが質問させてください。 strutsにおけるxmlファイルの記述例は次のようになります。 <servlet> <servlet-name>action</servlet-name> <servlet-class>org.apache.struts.action.ActionServlet</servlet-class> <init-param> <param-name>config</param-name> <param-value>/WEB-INF/struts-config.xml</param-value> </init-param> <load-on-startup>2</load-on-startup> </servlet> <servlet-mapping> <servlet-name>action</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> ここで、新しいサーブレット(download)を追加しようと次のように記述を加えました。 <servlet> <servlet-name>action</servlet-name> <servlet-class>org.apache.struts.action.ActionServlet</servlet-class> <servlet-name>download</servlet-name> <servlet-class>Download</servlet-class> <init-param> <param-name>config</param-name> <param-value>/WEB-INF/struts-config.xml</param-value> </init-param> <load-on-startup>2</load-on-startup> </servlet> <servlet-mapping> <servlet-name>action</servlet-name> <url-pattern>*.do</url-patte <servlet-name>download</servlet-name> <url-pattern>/download</url-pattern>rn> </servlet-mapping> すると、入り口のファイルに対し、「The requested resource (/プロジェクト名/ファイル名.jsp) is not available.」と警告されました。 strutsではサーブレットの追加は出来ないのでしょうか?ご指摘お願いします。

    • ベストアンサー
    • Java
  • HTTP 404 error

    Vine Linux,Tomcat5で (1)webapps/conf/server.xml ... <HOST> <Context path="/apress" docBase="apress" debug="0" reloadable="true" /> ... (2)webbapps/apress/login.jsp ... <table width="500" border="0" cellspacing="0" cellpadding="0"> <form name="loginForm" method="post" action="servlet/chapter2.login"> <tr><td width="402"><div align="right">User Name: </div></td> <td width="399"><input type="text" name="username"></td> </tr> ... (3)webapps/apress/WEB-INF/web.xml ... <servlet> <servlet-name>login</servlet-name> <servlet-class>chapter2.login</servlet-class> </servlet> <servlet-mapping> <servlet-name>login</servlet-name> <url-pattern>/login</url-pattern> </servlet-mapping> ... (4)webapps/apress/WEB-INF/classes/chapter2/login.java package chapter2; import javax.servlet.*; import javax.servlet.http.*; import java.io.*; import java.util.*; public class login extends HttpServlet { private String target = "/welcome.jsp"; private String getUser(String username, String password) { // Just return a statice name // If this was reality, we would perform a SQL lookup return "Bob"; } .... (4)現象: http://xxx.xxx.xxx.xxxx:8080/apress/login.jsp でsubmit action 後、次のエラーが出てきました: HTTP 404 error, The requested resource (/apress/servlet/chapter2.login) is not available. この問題はどこにあるでしょうか教えてください。

専門家に質問してみよう