これを達成する方法はいくつかあります。
おそらく最も簡単なのは、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.
}
}