32

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

<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 buttonが に押された場合の情報の送信方法を理解したいと思います。FirstServletSecondServlet buttonSecondServlet

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

4

6 に答える 6

92

これを達成する方法はいくつかあります。

おそらく最も簡単なのは、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/メンテナンスにあまり適していません。サーブレットコードを考慮に入れるのを忘れながら、別の言語でボタンを表示したり、ボタンの値を変更したりする必要がある場合はどうなりますか?


わずかな変更は、ボタンに独自の固定された一意の名前を付けることです。これにより、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.
    }

}
于 2012-08-06T14:39:30.390 に答える
4

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

<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>
于 2014-02-14T01:17:51.677 に答える
4

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();
}
于 2014-03-28T08:23:37.657 に答える
0

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

function callButton1(form, yourServ)
{
form.action = yourServ;
form.submit();
});
于 2012-08-06T14:38:14.963 に答える