Подтвердить что ты не робот

Несколько кнопок отправки в той же форме, что и другие сервлеты

Во-первых, вот код:

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

важно:
Я хочу сделать это в той же форме, чтобы одна и та же информация была перенесена на оба сервлета. (конечно, в сервлетах я буду использовать информацию соответственно)

4b9b3361

Ответ 1

Существует несколько способов достижения этой цели.

Вероятно, самым простым было бы использование JavaScript для изменения действия формы.

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

Но это, конечно, не будет работать, если у enduser отключен JS (мобильные браузеры, программы чтения с экрана и т.д.).


Другой способ - поместить вторую кнопку в другую форму, которая может быть или не быть тем, что вам нужно, в зависимости от конкретного функционального требования, которое совсем не ясно из вопроса.

<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 job here.
} else if ("SecondServlet".equals(action)) {
    // Invoke SecondServlet job here.
}

Это не очень дружелюбный i18n/обслуживание. Что делать, если вам нужно отображать кнопки на другом языке или изменять значения кнопок, забывая при этом учитывать код сервлета?


Небольшое изменение заключается в том, чтобы дать кнопкам собственное фиксированное и уникальное имя, чтобы его присутствие в качестве параметра запроса можно было проверить вместо его значения, которое было бы чувствительным к i18n/обслуживанию:

<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 job here.
} else if (request.getParameter("second") != null) {
    // Invoke SecondServlet job here.
}

Последний способ состоял бы в том, чтобы просто использовать инфраструктуру MVC, например JSF, чтобы вы могли напрямую привязывать 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 job here.
    }

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

}

Ответ 2

В дополнение к предыдущему ответу, лучший вариант отправки формы с разными кнопками без языковых проблем на самом деле использует тег .

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

Ответ 3

Если вы используете 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();
}

Ответ 4

Вам может понадобиться написать javascript для каждой кнопки submit. Вместо определения действия в определении формы установите эти значения в javascript. Что-то вроде ниже.

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