Какая динамически созданная кнопка была нажата в сервлете

У меня есть динамически созданные кнопки.

<form action="/" method="post">
    <table cellpadding="4">
        <%
            List<Room> rl = (List<Room>) request.getAttribute("roomList");
            if(rl != null) {
                for (Room r : rl) {
                    String name = r.getName();
        %>
            <tr>
                <td><%=name%></td>
                <td><input type="submit" value="Add a Booking" name=<%=name%> /></td>
            </tr>
        <%
                }
            }
   %>
   </table>

I know which button was clicked with the following code;

String addButton = req.getParameter("addButton");

Однако в этой ситуации я не могу узнать имя кнопки. Потому что название кнопки может быть любым. Как я мог узнать, какая кнопка была нажата? Заранее спасибо!


person Jungleman    schedule 18.04.2017    source источник
comment
В вашем коде есть только одна кнопка отправки, так почему вы ожидаете большего?   -  person MaxZoom    schedule 18.04.2017
comment
Спасибо за ваш комментарий, но он находится внутри цикла for (Room r : rl). Будет один или несколько   -  person Jungleman    schedule 18.04.2017
comment
Понятно, пожалуйста, проверьте мой ответ ниже.   -  person MaxZoom    schedule 18.04.2017


Ответы (2)


У вас может быть как минимум два решения:

<сильный>1. Решение в коде Java на стороне сервера
в JSP каждая кнопка отправки будет называться с префиксом submit_

<input type="submit" value="Add a Booking" name=<%="submit_"+name%> />

Когда запрос отправляется на сервер, вы будете зацикливать параметры и искать их с этим префиксом, сохраняя его значение в атрибуте submit:

private void setSubmitValue(HttpServletRequest request) {
  String SUBMIT_PREFIX = "submit_";
  for (Enumeration e = request.getParameterNames(); e.hasMoreElements();) {
    String key = (String) e.nextElement();
    if (key.startsWith(SUBMIT_PREFIX)) {
      String value = key.substring(SUBMIT_PREFIX.length());
      request.setAttribute("submit", value);
      break;
    }
  }
}

<сильный>2. Решение с использованием JavaScript на стороне клиента (браузера)
Добавить в форму новый скрытый виджет, который будет хранить количество нажатой комнаты. Когда кнопка нажата, ее значение сохраняется в этом виджете.
Когда запрос отправляется, на стороне сервера вы просто читаете значение этого параметра (имя виджета).
Ниже приведен пример: room-nr будет иметь значение нажатой кнопки

var form = document.forms['add-room'];
$(form).on('click', 'button', function(e) {
  e.preventDefault();
  var name = $(this).attr('name')
  form['room-nr'].value = name.replace(/\D+/, '');
  console.log(form['room-nr'].value);
  //form['add-booking'].click();
});
.hide {
  display: none;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<form name="add-room" action='.'">
  <input type="hidden" name="room-nr" value="" />
  <table cellpadding="4">
    <tr>
      <td>room1</td>
      <td>
        <button type="button" name="room-1">Add</button>
      </td>
    </tr>
    <tr>
      <td>room2</td>
      <td>
        <button type="button" name="room-2">Add</button>
      </td>
    </tr>
    <tr>
      <td>room3</td>
      <td>
        <button type="button" name="room3">Add</button>
      </td>
    </tr>
  </table>
  <input type="submit" value="Add a Booking" name="add-booking" class="hide" />
</form>

person MaxZoom    schedule 18.04.2017
comment
Работает отлично, еще один вопрос. Иногда, например, атрибут имени получает значение с пробелом; Комната 1. С этим значением; Атрибут name отображается как name=submit_Room 1. Как мне с этим справиться? - person Jungleman; 18.04.2017
comment
Я бы посоветовал кодировать данные формы при отправке и расшифровывать на стороне сервера. Вы можете найти больше об этом в Интернете, например здесь - person MaxZoom; 19.04.2017

Вам необходимо сделать следующее:

‹input type="submit" value="‹%name%›" name="Добавить бронирование" /›

person VivekRatanSinha    schedule 18.04.2017
comment
Но я хотел бы знать, какой из них нажат. В этой ситуации; Я получу 5 кнопок с одинаковым названием. - person Jungleman; 18.04.2017
comment
Уникальное значение ‹%name%› расскажет вам об этом. - person VivekRatanSinha; 18.04.2017
comment
Спасибо! Однако он отлично работает, теперь весь текст кнопки - чепуха. - person Jungleman; 18.04.2017