4

この解決策を見つけた後、以前に投稿した質問を解決したと思いました。フォーム送信へのJavascript投稿新しいウィンドウを開きます。しかし、それは私が望むことを完全には実行せず、何が欠けているのか理解できません。

ここに問題があります...フォームが含まれているjspがあります。フォームが(JavaScriptを介して)送信されるとき、親ウィンドウが常に別のページにリダイレクトされるようにしたい。ただし、ユーザーの入力値によっては、条件付きで別のウィンドウを開き、そのウィンドウを別のページにリダイレクトしたい場合もあります。したがって、常に親をリダイレクトし、場合によっては子を開いてリダイレクトします。

jspの私のコード:

<script>
  function handleFormSubmit() {
    var form = document.getElementById("myForm");
    ...
    if (checkbox.checked) {
      // this code creates the child window, but ONLY if the checkbox is checked
      myForm.setAttribute("target", "newResultPage");
      window.open("childpage.jsp", "newResultPage", "width=850,height=550,...");
    }

    form.submit();
  }
</script>

そして、これがhtmlフォームです。

<form id='myForm' method='post' action='someAction' accept-charset='UTF-8'>
 // some hidden input elements here
</form>

そしてサーブレットロジック:

public class MyServlet extends HttpServlet {

  protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    String redirectedPage = "/parentPage";

    if (someCondition) {
      redirectedPage = "/childpage.jsp";
    }

    RequestDispatcher reqDispatcher = getServletConfig().getServletContext().getRequestDispatcher(redirectedPage);
    reqDispatcher.forward(request,response);
  }
}

条件が満たされない場合、すべてが正常に機能します。サーブレットが呼び出され、呼び出し元のページがparentPageにリダイレクトされます。ただし、条件が満たされた場合、サーブレットは新しい子ウィンドウでchildpage.jspを正しく開きますが、呼び出し元のページをparentPageにリダイレクトしません。

明示的なredirect( "parentPage.jsp");を追加してみました。form.submit();の後 、しかし、それは競合状態を作成し、フォームが送信された後に何も呼び出されるべきではないため、良い解決策ではありません。

また、サーブレット内のロジックを変更し、条件が検出された場合にのみリダイレクトしようとしました。ただし、これにより、条件が存在しない場合に問題が発生します。これは、サーブレットが次にユーザーを送信する場所を認識していないためです。

複数のフォームをサーブレットに渡してJava経由で処理する方法はありますか?どんな助けでも大歓迎です。

-ボブ

4

1 に答える 1

3

質問を投稿してから数時間後に自分でこれを理解しましたが、返信する前に解決策が機能することを確認したかったのです。

私の論理によれば、私は常に「親」ページをリダイレクトすることを認識していました。したがって、元のサーブレットから子ウィンドウを開こうとするのではなく、そのロジックを親ページに移動し、onload関数を使用して(条件付きで)起動しました。明確にするために更新されたコードは次のとおりです。

更新されたjspコード:

<script>
  function handleFormSubmit() {
    var form = document.getElementById("myForm");
    ...
    if (checkbox.checked) {
      // we pass an additional parameter that will make its way to the new parent page
      myForm.setAttribute("launchNow", "1");

      /*
       * this code no longer applies
       */
      // myForm.setAttribute("target", "newResultPage");
      // window.open("childpage.jsp", "newResultPage", "width=850,height=550,...");
    }

    form.submit();
  }
</script>

Htmlフォームコード(変更されていません!):

<form id='myForm' method='post' action='someAction' accept-charset='UTF-8'>
 // some hidden input elements here
</form>

更新されたサーブレットロジック:

public class MyServlet extends HttpServlet {

  protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    String redirectedPage = "/parentPage";

    String launchNow = request.getParameter("launchNow");

    if (someCondition) {

      /*
       * Rather than redirecting, we pass an additional params to the new parent page
       */
      // redirectedPage = "/childpage.jsp";

       request.setAttribute("launchNow", launchNow);
       request.setAttribute("anotherParam", someValue);
    }

    RequestDispatcher reqDispatcher = getServletConfig().getServletContext().getRequestDispatcher(redirectedPage);
    reqDispatcher.forward(request,response);
  }
}

最後に、新しい親jspページで、追加のパラメーターを確認し、それに応じて動作します。

<html>
  <head></head>

  <%
    String launchNow    = request.getParameter( "launchNow" );
    String anotherParam = request.getParameter( "anotherParam" );
  %>

  <body onload="loadOnLaunch(<%= launchNow %>)">
    <form id="hiddenForm" method="post" target="newResultPage" action="anotherAction">
      <input id='anotherParam' type='hidden' name='anotherParam' value='<%= anotherParam %>'/>
    </form>

    <script type='text/javascript'>

      function loadOnLaunch(launchNow) {
        if (launchNow != null && launchNow == "1") {

          /*
           * NOTE: that this block used to reside in the original parent form!
           * It stayed the same, but the action getting called is different
           * thus invoking a different servlet
           */
          var myForm = document.getElementById("hiddenForm");
          myForm.setAttribute("target", "newResultPage");
          window.open("childpage.jsp", "newResultPage", "width=850,height=550,...");
        }
      }

    </script>
    ...
  </body>
</html>
于 2013-01-09T16:55:08.883 に答える