Вызов функции в json из пользовательской кнопки jqgrid

У меня есть jqgrid с некоторыми данными. Когда выбраны две строки, я хотел бы добавить запись в базу данных (в другой таблице, кроме одной из jqgrid). Я создаю новую кнопку на панели навигации со следующим кодом:

    jQuery("#tabla").navButtonAdd('#navegacion',
        {
            caption: "Crear tramo", buttonicon: "ui-icon-extlink", cursor:"pointer", title: "Crear tramo",
            onClickButton: $(function() {   
                 var selectedrows = $("#tabla").jqGrid('getGridParam','selarrrow');
                 var er1=$("#tabla").jqGrid('getRowData',selectedrows[0]);
                 var er2=$("#tabla").jqGrid('getRowData',selectedrows[1]);

                $.ajax({
                    dataType: 'json',
                    mtype: 'POST',                                  
                    url: 'json/operaciones.jsp',                                                                    
                    postData: { oper:'add', id1:er1, id2:er2},
                    success: function(data) {
                        alert(data);
                    }
                })                                
            })
    });

И что у меня в файле operaciones.jsp есть:

    <%

            String salida="";

            DriverManager.registerDriver (new oracle.jdbc.driver.OracleDriver());

            Connection con = DriverManager.getConnection("my", "Connection", "Parameters");

            try {

                    System.out.println("Parámetros enviados:");
                    Enumeration e=request.getParameterNames();
                    while (e.hasMoreElements()){
                            String par=(String)e.nextElement();
                            System.out.println(par+":"+request.getParameter(par));
                    }



            String operacion=request.getParameter("oper");
            String id1=request.getParameter("id2");
            String id2=request.getParameter("id2");
            String comentarios="prueba";


            if (operacion.equals("add")) {

                    PreparedStatement stmt=con.prepareStatement(
                            "INSERT INTO TRAMOS "+
                            "(COMENTARIOS,ELEMENTOS_REGISTROCODIGO,ELEMENTOS_REGISTROCODIGO2, ENTIDADESCIF) "+
                            "VALUES (?,?,?,?,?)");
                    stmt.setString(1,comentarios);
                    stmt.setString(2,id1);
                    stmt.setString(3,id2);
                    stmt.setString(4,"Q1818002F");

                    stmt.executeUpdate();
                    stmt.close();
                    salida="{\"correcto\":true,\"clave\":\""+id1+"|"+id2+"\",\"mensaje\":\"OK\"}";
            }
            }
            catch (Exception e) {
                    String cadenaError=e.toString().substring(e.toString().indexOf(":")+2);
                    cadenaError=cadenaError.replace('\n',' ');
                    cadenaError=cadenaError.replace("\"","\\\"");
                    salida="{\"correcto\":false,\"clave\":\"\",\"mensaje\":\""+e.toString()+"\"}";
            }
            finally {
                    con.close();
            }
        System.out.println("salida:"+salida);

        response.setContentType("application/json");
    %>     
    <%=salida%>

Но это не работает, я получаю «java.lang.NullPointerException». Где ошибка? Как отправить данные в файл operaciones.jsp? Заранее спасибо, Наталия

2
nl ja de

2 ответы

Одной из явных ошибок в коде, который вы используете, является использование postData </​​code> вместо data </​​code> и mtype вместо type как параметры jQuery.ajax .

I recommend you additionally to write more safe code. For example you use selectedrows[0] and selectedrows[1] inside of the onClickButton before verifying that selectedrows is not null and that selectedrows.length > 1. If the user click for example on the button before at least two lines are selected one get exception in JavaScript code.

1
добавлено
@NataliaGenaro: Я не гарантирую, что мое предложение устраняет все проблемы в коде, который вы опубликовали. Вы не разместили определение столбцов ( colModel ) из используемой сетки. Поэтому я не знаю значения er1 и er2 , которые вы публикуете. Кроме того, я не использую Java самостоятельно, поэтому я не могу помочь вам в исправлении кода Java. Имена id1 и id2 кажутся мне странными. Вы отправляете объекты , возвращенные из getRowData (selectedrows [i]) , а не идентификаторы selectedrows [i] . Кроме того, вы используете String id1 = request.getParameter («id2»); ( "id2" , а не "id1" ). Вы должны отладить ваш код.
добавлено автор Oleg, источник
Спасибо Олегу, я сделал то, что вы упомянули. Теперь происходит то, что operaciones.jsp правильно получает строку «oper», но не id1 или id2. Но он отлично работает, если я пишу идентификатор напрямую (т. Е. Id1: 1254).
добавлено автор Natalia Genaro, источник

Это была глупая ошибка ... Что, наконец, сработало:

       jQuery("#tabla").navButtonAdd('#navegacion',
                {
                    caption: "Crear tramo", buttonicon: "ui-icon-extlink", cursor:"pointer", title: "Crear tramo",
                    onClickButton: function() {                       
                        selectedrows = $("#tabla").jqGrid('getGridParam','selarrrow');
                    if(selectedrows.length==2){
                        er1=$("#tabla").jqGrid('getRowData',selectedrows[0]);
                        er2=$("#tabla").jqGrid('getRowData',selectedrows[1]);                       
                        $.ajax({
                            datatype:'json',
                            type:'GET',
                            url:'json/operacionesTramos.jsp',
                            data:{oper:'add',id1:er1.codigo,id2:er2.codigo},
                            success: function(data) {
                                alert("Tramo creado");
                            }
                        })  
                        }
                        else{
                        alert("Seleccione dos arquetas, por favor");                     
                        }                   


                    }
            });

Спасибо, Олег!

0
добавлено
JavaScript Jobs — чат
JavaScript Jobs — чат
8 336 участник(ов)

JavaScript Jobs — чат для поиска работы и людей Правила оформления: https://teletype.in/@telegram-ru/r1WQe5F1m См. также: @mobile_jobs, @devops_jobs, @nodejs_jobs, @react_js, @angular_ru, @js_ru

JavaScript.ru
JavaScript.ru
7 932 участник(ов)

Сообщество сайта JavaScript.ru в Slack.

pro.js
pro.js
4 675 участник(ов)

Про JavaScript и NodeJS Invite: https://t.me/joinchat/Be4rsT5Rsgq30DHutjxXgA Правила: http://telegra.ph/ru-chat-rules-06-19 Вакансии только с ЗП, не чаще раза в неделю.

JavaScript — русскоговорящее сообщество
JavaScript — русскоговорящее сообщество
3 269 участник(ов)

Рекомендуем сразу отключить уведомления Правила: https://rudevs.network/ByaMH6un7 См. также: @js_noobs_ru, @nodejs_ru, @typescript_ru, @react_js, @electron_ru Вакансии и поиск работы: @javascript_jobs

JavaScript Noobs — сообщество новичков
JavaScript Noobs — сообщество новичков
2 484 участник(ов)

Чат для новичков

javascript_ru
javascript_ru
915 участник(ов)

Сообщество любителей самого популярного языка программирования в мире. Чат основан в 2009 году. Логи: https://goo.gl/9EOeM7 Поддержка бота: @chat_linker (ссылка на репу внутри) Вам будут интересны @frontend_ru и @css_ru

jsChat
jsChat
603 участник(ов)

Чат посвященный программированию на языке javaScript Перед отправкой ссылки на Ваш контент посоветуйтесь с админом Все ссылки удаляются ботом автоматически

JavaScript for Zombies Chat
JavaScript for Zombies Chat
492 участник(ов)

Чат про JavaScript для настоящих zombie! Вход строго по приглашениям! Ссылка для строгих приглашений: https://t.me/joinchat/AAMBHz3Uyr0tuZ7VaB029g

All That JS
All That JS
417 участник(ов)

JS на русском