Вызов Ajax для действия Struts не возвращает ответ

#ajax #jquery #struts

#ajax #jquery #struts

Вопрос:

Я пытаюсь вызвать сервлет действия createLabel.сделать, но похоже, что класс action не вызывается. Я использовал firebug для отладки, и похоже, что этот URL вызывается, но ответа не получено.
Вот функция javascript:

 <script  type="text/javascript" charset="utf-8">
    $(function() {
          $("#createLabel").click(function() {
            $.ajax( {
              type: "POST",      
              url: "/createLabel.do",
              dataType: "json",
              contentType: "application/json; charset=utf-8",
              data: { lab_no: $("#labNum").val(),accNum: $("#accNum").val(), label: $("#label").val() },
              success: function() {
                  alert("success");  
              }
            });
          });
    });

</script>
  

Вот мой класс действий:

    public class CreateLabelAction extends Action{

public ActionForward execute (ActionMapping mapping, HttpServletRequest request, HttpServletResponse response){


    String label = request.getParameter("label");

    String lab_no = request.getParameter("lab_no");
    String accNum = request.getParameter("accNum");

    response.setContentType("application/json");
    try {
        DB db = new DB(DB.DATA);
        Connection conn = db.GetConnection();
        String insertstmt = "update Info set label='" label "' where lab_no=" lab_no " and accNum='" accNum "'";
        logger.info(insertstmt);

        PreparedStatement pstmt = conn.prepareStatement(insertstmt);
        pstmt.executeUpdate();
        pstmt.close();
        db.closeConn();

        logger.info("Label created successfully.");


    } catch (Exception e){
        logger.error("Error inserting label into Info"   e);
        request.setAttribute("error", "There was an error creating a label.");

    }

    logger.info("Label =" label);
    label = StringEscapeUtils.escapeJavaScript(label);
            return mapping.findForward("complete");
}

}
  

Вот конфигурация в struts-config.xml:

  <action input="/labDi.jsp" name="LabelForm" path="/createLabel" scope="request" type="all.pageUtil.CreateLabelAction">
        <forward name="complete" path="/labDi.jsp" />
    </action>
  

Может кто-нибудь, пожалуйста, сказать мне, почему класс action не вызывается? Заранее спасибо.

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

1. Какой тип элемента DOM #createLabel ? Кнопка отправки, ссылка, стандартная кнопка, div, …?

2. стандартная кнопка: <тип ввода=»кнопка» идентификатор =»createLabel» значение =»Создать»>

3. Эта кнопка находится внутри формы? Что вы видите в FireBug при нажатии на кнопку? Отправляется ли запрос AJAX?

4. Попробуйте изменить dataType на текст, чтобы вы могли выяснить, заключается ли проблема в получении ответа или в получении действительного ответа.

5. да, это внутри формы. Я вижу это «СООБЩЕНИЕ https://…/createLabelTDIS.do 200OK 19 мс» с пустой вкладкой ответа

Ответ №1:

Вы определяете поведение внутри вызываемого метода processRequest , о котором Struts ничего не знает (если только это не a DispatchAction и вы не включаете параметр токена, которым он не является, и вы этого не делаете).

Вызывается метод обработки запросов Struts 1 по умолчанию execute .

1.x: http://struts.apache.org/1.x/apidocs/org/apache/struts/action/Action.html

1.2: http://struts.apache.org/1.2.9/api/org/apache/struts/action/Action.html

1.1: http://struts.apache.org/1.1/api/org/apache/struts/action/Action.html

Я не знаю, почему вы ожидаете, что это сработает. Если вы создаете «сервлет действия» для обработки обычных запросов Struts 1, вы делаете это неправильно. Запросы Struts обрабатываются Action s (которые вы правильно подклассируете) во всех ситуациях, кроме самых необычных.

Сервлет action фиксирует запросы, предназначенные для Struts, и использует соответствующий процессор запросов Struts для поиска и вызова действия запроса. (Наряду с другими связанными с этим домашними делами.)

Я бы рекомендовал ознакомиться с некоторыми руководствами или документацией по Struts 1, если вам действительно нужно с этим работать.

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

1. хорошо, теперь я изменил метод ProcessRequest. Пожалуйста, посмотрите на измененный код. это все еще не работает.

2. @Sapphire по-прежнему неверная подпись. Вам также необходимо включить конфигурацию сопоставления действий.

3. как в? Я включил прямое имя «complete» в struts-config.xml как показано выше … если вы это имеете в виду.

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

5. @EmanueleGiarlini Документов S1 больше нет в Сети, но их можно загрузить.

Ответ №2:

//Вот рабочий ajax-код, который отправляет запрос в класс struts action .

 function userExists(userid){
            var exists = false;
                $.ajax({
                    type: "POST",
                    url: "./searchUser.do",
                    data: "userid="   userid,
                    success: function(response){
                        exists = true;
                    },
                    error: function(e){
                        alert('Error: '   e);
                    }
                });
            return exists;
            }
  

// Удачи..

Хари