Как решить проблему «неопределенных данных» в успехе AJAX? - PullRequest
1 голос
/ 13 июня 2019

У меня есть страница JSP, на которой у меня есть кнопка, по нажатию которой я вызываю метод Ajax под названием «sendmail ()». И API отправки почты написан на контроллере. Я пытаюсь показать предупреждение в Ajax успех с data.message и говорит, что данные не определены.

Я попытался установить объект ответа в контроллере со строкой сообщения как успешный и вернуть его как строку. Примечание: чтобы сделать это, я должен изменить метод sendmail моего контроллера на тип возвращаемого значения String. Так что я заметил, что вызовы Ajax не входят в метод успеха в этом случае. Он работает нормально, когда метод имеет тип void. И когда я проверено с помощью chrome developer tolld, сетевой вызов возвращает 404 (не найдено). Почта успешно отправляется, но успех ajax не работает.

Это моя кнопка и метод Ajax,

<div class="uk-width-large-2-5">

  <div class="uk-form-row">
  <label>Message</label>
  <textarea id="message" cols="30" rows="4" class="md-input"></textarea>
  </div>
  <div class="uk-form-row">
  <button type="submit" class="md-btn md-btn-success md-btn-large" onclick="sendMail()">Send Message</button>
 </div>
 </div>

Метод Ajax:

<script>
function sendMail() {
 var reqJson = {};
 reqJson.msg = $("#message").val();


$.ajax({
type : "POST",
url : "sendMail",
data : JSON.stringify(reqJson),
dataType: 'json',
contentType: "application/json",
  success : function(data) {    
  console.log("data :"+data.message);
               }
 error: function()
 {
}
    });                                 
}
</script>

Maincontroller.java

 @RequestMapping(value = "/sendMail", method = RequestMethod.POST, produces = "application/json")
   public void sendContact(HttpServletRequest request, HttpServletResponse response, @RequestBody String payload) {
        JSONObject jRespObj = new JSONObject();

      try {
        System.out.println("Welcome");
        JSONObject jPayload = new JSONObject(payload);
         System.out.println("jobj : "+jPayload);
         String message = jPayload.getString("msg");
         InputStream inputStream = UserController.class.getResourceAsStream("/Contactusrequest.htm");
      StringWriter writer = new StringWriter();
      try {
          IOUtils.copy(inputStream, writer);
         } catch (IOException e) {
          e.printStackTrace();
         }
      HttpSession session = request.getSession(true);

        String from = (String) session.getAttribute("email");
        String to ="xyz@abc.com";
        String emailContent = writer.toString();
        emailContent = emailContent.replace("replaceMeFromEmail",from);
        emailContent = emailContent.replace("replaceMeToEmail", to);
        emailContent = emailContent.replace("replaceMeReason", message);

         emailClient.sendMail("", to, null, "Contact Us Request", emailContent);
        jRespObj.put("message", "Mail sent successfully");
        response.setStatus(HttpServletResponse.SC_OK);

     } catch (Exception ex) {
          ex.printStackTrace();
        response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
     }
    return jRespObj.toString();
   }

Я хочу получить объект ответа от контроллера для успешного выполнения Ajax, чтобы получить доступ к data.message.

Ответы [ 2 ]

0 голосов
/ 14 июня 2019

Я нашел решение: я добавил @Responsebody и проанализировал данные, полученные в Ajax success. И вот мой код:

@RequestMapping(value = "/sendMessage" ,method = RequestMethod.POST)
  @ResponseBody
  public String sendMessage(HttpServletRequest request, HttpServletResponse response, @RequestBody String payload) throws JSONException, IOException {
    JSONObject jRespObj = new JSONObject();
      try {
        System.out.println("Welcome");
     JSONObject jPayload = new JSONObject(payload);
     System.out.println("jobj : "+jPayload);
     String message = jPayload.getString("message");
     InputStream inputStream = UserController.class.getResourceAsStream("/Contactusrequest.htm");
     StringWriter writer = new StringWriter();
     try {
      IOUtils.copy(inputStream, writer);
     } catch (IOException e) {
      e.printStackTrace();
     }
     HttpSession session = request.getSession(true);

       String from = (String) session.getAttribute("email");
       String to ="xyz@electronosolutions.com";
       String emailContent = writer.toString();
       emailContent = emailContent.replace("replaceMeFromEmail",from);
       emailContent = emailContent.replace("replaceMeToEmail", to);
       emailContent = emailContent.replace("replaceMeReason", message);
       emailClient.sendMail("", to, null, "Contact Us Request", emailContent);
       jRespObj.put("message", "Mail sent succesfully");

    } catch (Exception ex) {
          ex.printStackTrace();
    }
      return jRespObj.toString();
  }

Метод Ajax:

<script>
    function sendMessage() {
        console.log("page load");
        //$("#sendMessage").submit(function(e){

       // e.preventDefault();

        var reqJson = {};
        reqJson.message = $("#message").val();
        console.log(reqJson.message+"    jhgczjdhgbdzjvh");
         $.ajax(
         {
             url : "sendMessage/",
             type: "POST",
             data : JSON.stringify(reqJson),
             contentType: "application/json",
             success:function(data)
             {
                var msg = JSON.parse(data);
                console.log(msg);


                UIkit.notify('<a href="#" class="notify-action">Clear</a> ' + msg.message, {
                 pos : 'top-center',
                 status:'success',
                 timeout : 2000
               });

              setTimeout(function(){ location.reload(); }, 2000);
             }, 
             error: function(data)
             {

               UIkit.notify('<a href="#" class="notify-action">Clear</a> ' + "Mail not sent", {
                 pos : 'top-center',
                 status:'warning',
                 timeout : 6000
               }); 
             }
           });

        }
 </script>   
0 голосов
/ 14 июня 2019

Решение 1. Вы возвращаете ответ, поэтому в Ajax получение данных является неопределенной ошибкой. Вместо возврата Запишите ответ json в теле, используя Gson или JSONObject.

Например.

//Write the json response in body
  //return jRespObj.toString();
  response.getWriter().write(jRespObj.toString());

Решение 2 - удалите все остальные операторы System.out.println и отобразите одиночный ответ в формате json.

System.out.print(jRespObj.toString());

В ajax вы можете получить ответ вроде

$ajax({
----
success : function(data) {    
  console.log("data :"+data['message']);
},
 error: function()
 {
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...