最終更新日:190422原本2019-01-11 

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

まず、これがコードです。

<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ボタンがFirstServletに押された場合とSecondServletボタンがSecondServletに押された場合の情報の送信方法を理解したいのですが。

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

ベストアンサー
これを実現するにはいくつかの方法があります。

おそらく最も簡単なのは、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>

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

もう1つの方法は、押されたボタンに応じて適切なサーブレット(または適切なビジネスアクション)に委任する、別の単一エントリポイントサーブレットを作成することです(それ自体が要求パラメータとして利用可能です)。

<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.
}

これは非常に国際化/メンテナンスフレンドリーではありません。サーブレットコードを考慮に入れることを忘れながら、別の言語でボタンを表示したり、ボタンの値を変更したりする必要がある場合はどうしますか?

わずかな変更はボタンにそれ自身の固定されたそしてユニークな名前を与えることです、それで国際化/メンテナンスに敏感であるであろうその値の代わりにリクエストパラメータとしてのボタンの存在がチェックされることができます:

<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.
}

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

<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.
    }

}

転載記事の出典を記入してください: java – 異なるサーブレットを呼び出す同じフォーム内の複数の送信ボタン - コードログ