まず、コードは次のとおりです。
<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
がFirstServlet
に押された場合、およびSecondServlet button
が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>
フォームは、送信時に、他のフォームではなく、まったく同じフォームに含まれる入力データのみを送信することに注意してください。
もう一度別の方法は、押されたボタンに応じて適切なサーブレット(またはできれば適切なビジネスアクション)にさらに委任する別の単一のエントリポイントサーブレットを作成することです(それは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.
}
}
前の応答に加えて、言語の問題なしに異なるボタンを持つフォームを送信するための最良のオプションは、実際に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>
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();
}
Ifこれをより良い方法で使用する
ボタンを送信するたびにjavascriptを作成する必要がある場合があります。フォーム定義でアクションを定義する代わりに、javascriptでそれらの値を設定します。以下のようなもの。
function callButton1(form, yourServ)
{
form.action = yourServ;
form.submit();
});