Использование нескольких параметров из массива в сервлете

#java #servlets

#java #сервлеты

Вопрос:

Вот HTML с моей страницы .jsp:

 <tr>
  <td><input type="checkbox" name=<%=editID%>COM /> </td>    
  <td>blah blah</td>
  <td>blah blah</td>
</tr>
  

Итак, здесь пользователь установит флажки и отправит их на удаление. Но я хочу, чтобы они могли устанавливать несколько флажков. Например, если они установили два флажка, скажем, #s 5 и 6, он будет отображаться в сервлете как 5COM и 6COM (это связано с плохим дизайном таблицы). Итак, далее я пытаюсь получить несколько параметров со своей страницы jsp и записать их в свою базу данных в моем сервлете. Вот мои определения:

   String[] comEdit = request.getParameterValues("editIDCom");   
  String comEditDel = "";
  int[] comEditDels = null;
  

Итак, используя приведенный выше пример, массив comEdit должен содержать 5COM и 6COM …. Далее, я пытаюсь получить подстроку каждого элемента в массиве ‘comEdit’, а затем я пытаюсь поместить его в массив int:

   for (int i = 0; i < comEdit.length;   i) {
      String com = comEdit[i];
      comEditDel = com.substring(0, com.length() - 3);    
      comEditDels = new int[comEditDel == null ? 0: comEditDel.length];
      comEditDels[i] = Integer.parseInt(comEditDel[i]);
  }
  

Итак, придерживаясь того же примера, я пытаюсь создать новый массив int, который выдаст мне [5, 6] …. Теперь приведенная выше часть, скорее всего, неверна, но я попробовал, и вы можете видеть мои намерения. Здесь я пытаюсь использовать массив в моем вызываемом операторе:

     CallableStatement stmt = null;
    PreparedStatement pstmt = null;
    Connection conn = null;
    ArrayDescriptor ad = null;
    String dSource = getServletContext().getInitParameter("dataSource");

   stmt = conn.prepareCall("{?= call My_function(?)}");
   stmt.registerOutParameter(1, Types.INTEGER);
   ad = ArrayDescriptor.createDescriptor("NUM_ARRAY", conn);
   stmt.setArray(2,new ARRAY(ad, conn, comeditDels));
  

Итак, опять же, используя пример, функция stmt.setArray должна отправить массив [5,6] в My_function . Опять это моя попытка, и она, вероятно, неверна? Приветствуется любая помощь. Спасибо!

Комментарии:

1. Я не слишком уверен, что ваши намерения ясны :). Каждая итерация по содержимому comEdit повторно инициализирует переменную comEditDels , что я не уверен, почему вы хотели бы сделать. Также comEditDel[i] выдаст ошибку компиляции, поскольку a String не поддерживает [] .

2. @laz, извини за это. Я в этом очень новичок. Я хочу использовать подстроку каждого элемента в массиве ‘comEdit’ и отправить ее в свою функцию, и я пытался сделать это через переменную comEditDels. Помогает ли это вообще?

3. Я тоже не могу толком понять, что вы пытаетесь сделать. Возможно, если бы вы опубликовали пример ожидаемых значений, как они должны обрабатываться и что вы хотели бы видеть записанным в БД, это могло бы помочь прояснить ситуацию — пошаговое руководство обычно полезно.

4. @laz, @no.good.at.coding, я обновил свой пост и попытался включить пошаговое руководство…. дайте мне знать, что вы думаете.

Ответ №1:

Основываясь на вашем ответе на мой комментарий, делает ли это то, что вы хотите?

 String[] comEdit = request.getParameterValues("editIDCom");   
int[] comEditDels = null;

if (comEdit != null) {
    comEditDels = new int[comEdit.length];

    for (int i = 0; i < comEdit.length;   i) {
        String com = comEdit[i];
        if (com != null amp;amp; com.length() - 3 > 0) {
            try {
                comEditDels[i] = Integer.parseInt(com.substring(0, com.length() - 3));
            } catch (NumberFormatException exception) {
                // do something or possibly ignore since the value isn't a valid integer
            }
        }
    }
}

if (comEditDels != null) {
    CallableStatement stmt = null;
    PreparedStatement pstmt = null;
    Connection conn = null;
    ArrayDescriptor ad = null;
    String dSource = getServletContext().getInitParameter("dataSource");

    stmt = conn.prepareCall("{?= call My_function(?,?,?,?)}");
    stmt.registerOutParameter(1, Types.INTEGER);
    ad = ArrayDescriptor.createDescriptor("NUM_ARRAY", conn);
    stmt.setArray(2,new ARRAY(ad, conn, comEditDels));
}
  

Я не знаком с этими объектами Oracle, поэтому я не уверен, чего ожидать от передачи в ‘comEditDels’ таким образом, но я думаю, что это то, что вы хотите?

Комментарии:

1. Я думаю, что это близко …. я получаю нулевой указатель, потому что значение может быть нулевым, поступающим с моей страницы .jsp. Итак, как бы мне обернуть for stmt в if … else? if(comEdit != null) {for (int i = 0; i < comEdit.length; i) { String com = comEdit[i]; comEditDels[i] = Integer.parseInt(com.substring(0, com.length() — 3)); } else { comEditDel = -1;} Сработает ли это?

2. Видите, это компилируется просто отлично, но я все равно получаю указатель NULL в строке ‘int[] comEditDels = new int[comEdit.length];’ до н.э., если comEdit имеет значение null …. что возможно…. Я получаю нулевой указатель на эту строку кода.

3. Я пропустил перенос этого в проверку null. Упс!

4. Потрясающе, спасибо! Я, наконец, запустил его правильно. Я действительно ценю всю вашу помощь!