web-dev-qa-db-ja.com

異なるサーブレットを呼び出す同じフォーム内の複数の送信ボタン

まず、コードは次のとおりです。

<form action="FirstServlet" method="Post">
    Last Name: <input type="text" name="lastName" size="20">
    <br><br>
    <input type="submit" value="FirstServlet">
    <input type="submit"value="SecondServlet">
</form>

FirstServlet buttonFirstServletに押された場合、およびSecondServlet buttonSecondServletに押された場合に情報を送信する方法を理解したいと思います。

重要:
同じ情報が両方のサーブレットに転送されるように、同じ形式でそれを行いたいです。 (もちろん、サーブレットではそれに応じて情報を使用します)

31
Eli Katzav

これを実現するにはいくつかの方法があります。

おそらく最も簡単なのは、JavaScriptを使用してフォームのアクションを変更することです。

<input type="submit" value="SecondServlet" onclick="form.action='SecondServlet';">

ただし、エンドユーザーがJSを無効にしている場合(モバイルブラウザー、スクリーンリーダーなど)、これはもちろん機能しません。


もう1つの方法は、2番目のボタンを別の形式にすることです。具体的な機能要件に応じて、必要な場合とそうでない場合があります。

<form action="FirstServlet" method="Post">
    Last Name: <input type="text" name="lastName" size="20">
    <br><br>
    <input type="submit" value="FirstServlet">
</form>
<form action="SecondServlet" method="Post">
    <input type="submit"value="SecondServlet">
</form>

フォームは、送信時に、他のフォームではなく、まったく同じフォームに含まれる入力データのみを送信することに注意してください。


もう一度別の方法は、押されたボタンに応じて適切なサーブレット(またはできれば適切なビジネスアクション)にさらに委任する別の単一のエントリポイントサーブレットを作成することです(それはname ):

<form action="MainServlet" method="Post">
    Last Name: <input type="text" name="lastName" size="20">
    <br><br>
    <input type="submit" name="action" value="FirstServlet">
    <input type="submit" name="action" value="SecondServlet">
</form>

MainServletに以下を含む

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

if ("FirstServlet".equals(action)) {
    // Invoke FirstServlet's job here.
} else if ("SecondServlet".equals(action)) {
    // Invoke SecondServlet's job here.
}

これは、国際化/保守にあまり適していません。サーブレットコードを考慮するのを忘れて、別の言語でボタンを表示したり、ボタンの値を変更したりする必要がある場合はどうでしょうか。


わずかな変更は、ボタンに独自の固定された一意の名前を付けることです。これにより、i18n/maintenanceの影響を受けやすい値の代わりに、要求パラメーターとしての存在を確認できます。

<form action="MainServlet" method="Post">
    Last Name: <input type="text" name="lastName" size="20">
    <br><br>
    <input type="submit" name="first" value="FirstServlet">
    <input type="submit" name="second" value="SecondServlet">
</form>

MainServletに以下を含む

if (request.getParameter("first") != null) {
    // Invoke FirstServlet's job here.
} else if (request.getParameter("second") != null) {
    // Invoke SecondServlet's job here.
}

最後の方法は、 [〜#〜] jsf [〜#〜] のようなMVCフレームワークを使用することです。これにより、javabeanメソッドを直接ボタンにバインドできますが、既存のコードを大幅に変更する必要があります。 。

<h:form>
    Last Name: <h:inputText value="#{bean.lastName}" size="20" />
    <br/><br/>
    <h:commandButton value="First" action="#{bean.first}" />
    <h:commandButton value="Second" action="#{bean.Second}" />
</h:form>

サーブレットの代わりに次のjavabeanのみを使用

@ManagedBean
@RequestScoped
public class Bean {

    private String lastName; // +getter+setter

    public void first() {
        // Invoke original FirstServlet's job here.
    }

    public void second() {
        // Invoke original SecondServlet's job here.
    }

}
89
BalusC

前の応答に加えて、言語の問題なしに異なるボタンを持つフォームを送信するための最良のオプションは、実際にbuttonタグを使用することです。

<form>
    ...
    <button type="submit" name="submit" value="servlet1">Go to 1st Servlet</button>
    <button type="submit" name="submit" value="servlet2">Go to 2nd Servlet</button>
</form>
4
kiril

JQueryを使用する場合、次のようにできます。

<form action="example" method="post" id="loginform">
  ...
  <input id="btnin" type="button" value="login"/>
  <input id="btnreg" type="button" value="regist"/>
</form>

Jsは次のようになります。

$("#btnin").click(function(){
   $("#loginform").attr("action", "user_login");
   $("#loginform").submit();
}
$("#btnreg").click(function(){
   $("#loginform").attr("action", "user_regist");
   $("#loginform").submit();
}
3
toxin
0
gringogordo

ボタンを送信するたびにjavascriptを作成する必要がある場合があります。フォーム定義でアクションを定義する代わりに、javascriptでそれらの値を設定します。以下のようなもの。

function callButton1(form, yourServ)
{
form.action = yourServ;
form.submit();
});
0
kosa