【问题标题】:Couldnt call controller method , ajax call with spring mvc无法调用控制器方法,使用 spring mvc 进行 ajax 调用
【发布时间】:2017-05-15 12:01:21
【问题描述】:

我有问题,

使用spring mvc,我想使用ajax调用,试图调用控制器方法但我不能,有一个jsp页面和控制器类

我的 Jsp 页面,

            <form role="form" >

                <div class="form-group">
                    <label for="Ders">Ders</label>
                    <form:select path="derslist" class="form-control" id="ddlders">
                        <form:options items="${derslerlistesi}" itemValue="dersid"
                            itemLabel="ders" />
                    </form:select>
                </div>
                <div class="form-group">

                    <label for="KonuAd">Konu Ad</label> <input type="text"
                        class="form-control" id="KonuAd" placeholder="Konu İsmi Giriniz!">


                </div>
                <div class="form-group">
                    <button type="submit" id="btnekle" class="btn btn-default">Ekle</button>
                </div>

和我的控制器类

package publisher.controller;


import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

import publisher.dao.Dao;
import publisher.entity.Dersler;
import publisher.entity.Konular;



@Controller
public class IslemlerController  {

    @Autowired
    private Dao dao;

    @Autowired
    private Konular _konu;

    @RequestMapping(value = "/islemler", method = RequestMethod.GET)
    public String Home(Model model,Dersler dersler)  { 

     model.addAttribute("derslist",dersler);
     return "islemler"; 

    } 


    @ModelAttribute("derslerlistesi")
    public List<Dersler> getdersler ()
    {
        return dao.getAll(Dersler.class);
    }

    @ModelAttribute("konulistesi")
    public List<Konular> getKonular ()
    {
        return dao.getAll(Konular.class);
    }

    @ResponseBody
    @RequestMapping(value="/konukaydet",method=RequestMethod.POST)
    private  Konular KonuKaydet (@RequestParam String konu,@RequestParam int dersid)
    {
        _konu.setKonu(konu);
        _konu.setDersid(dersid);
        _konu.setSinavid(1);
        _konu =  dao.save(_konu);
            System.out.println("kaydet e girdi !");
        return _konu;
    }

}

还有我的脚本代码

$(document).ready(function() {
  $("#btnekle").click(function() {
    var input = {
      "konu": $("#KonuAd").val(),
      "dersid": $("#ddlders").val()
    };
    var inputStr = JSON.stringify(input);
    alert(inputStr);
    $.ajax({
      url: "/islemler/konukaydet",
      type: "POST",
      data: inputStr,
      dataType: "json",
      success: function(output) { // callback method for further manipulations
        var str = JSON.stringify(output);
        alert("success ");
        $("#output").text(data);
      },
      error: function(data) { // if error occured
          alert("err");
        $("#error").text(data);
      }
    });

  });
});

感谢您的帮助!

【问题讨论】:

  • 你能检查你在浏览器上调用的响应并检查它返回的响应代码吗?
  • 好,然后通过接受或投票 cmets 来结束此问题
  • 实际上我遇到了一个新问题 ajax 调用成功没有在我下面的代码上触发,它可以调用方法并做一些工作但不触发成功 ajax 调用你知道吗?

标签: java ajax spring spring-mvc


【解决方案1】:

我认为您的脚本有问题,您需要将数据作为查询参数传递,因为您在控制器类中使用了@RequestParam。所以在你的 ajax 调用中,你的 url 应该如下所示。

url: "/islemler/konukaydet?konu="+input.konu+"&dersid="+input.dersid;

注意 - 您没有在控制器中使用islemler URL@RequestMapping(value="/islemler/konukaydet",method=RequestMethod.POST)

可能对你有帮助,如果没有请回复我。

如果您想按原样使用脚本,则需要更改控制器并使用@RequestBody 并使用模型

【讨论】:

    【解决方案2】:

    要补充@Sam的观点,根据你在js上的url,你需要在controller级别添加@RequestMapping。所以你的控制器应该是这样的:

    @RequestMapping(value = "/islemler")
        @Controller public class IslemlerController {
    

    因此,通过在 controller 级别和 KonuKaydet 方法级别结合请求映射,您现在将拥有完整的所需请求映射。

    【讨论】:

      【解决方案3】:

      我假设你已经在 dispatcher-servlet.xml

      中配置了控制器

      如果不是see this

      如果你在本地机器上运行它,那么你需要调用调用

      $.ajax({ //other options. . url: http://localhost:<port>/<your-url> //other options. . });.

      此外,@RequestMapping 应该在控制器级别给出。

      【讨论】:

      • 我解决了这个问题,是的,我没有看到这个教程,我在这个 url 上使用了脚本代码。当我在我的控制器方法上使用“@RequestMapping(value="islemler/konukaydet",method=RequestMethod.POST)”注释时,我的控制器上的问题它可以工作,不需要localhost:<port>,非常感谢ASquare先生
      • 我认为 dispatherservlet 找不到我的控制器方法 url
      【解决方案4】:

      在您的 @RequestMapping 中,您应该在控制器方法中映射完整的 URL 或在控制器级别添加 @RequestMapping 像:

      @Controller
      @RequestMapping("/islemler/") 
      public class IslemlerController  {
      
          @Autowired
          private Dao dao;
      
          @Autowired
          private Konular _konu;
      
          @RequestMapping(value = "home", method = RequestMethod.GET)
          public String Home(Model model,Dersler dersler)  { 
      
           model.addAttribute("derslist",dersler);
           return "islemler"; 
      
          } 
      
      
          @ModelAttribute("derslerlistesi")
          public List<Dersler> getdersler ()
          {
              return dao.getAll(Dersler.class);
          }
      
          @ModelAttribute("konulistesi")
          public List<Konular> getKonular ()
          {
              return dao.getAll(Konular.class);
          }
      
          @ResponseBody
          @RequestMapping(value="konukaydet",method=RequestMethod.POST)
          private  Konular KonuKaydet (@RequestParam String konu,@RequestParam int dersid)
          {
              _konu.setKonu(konu);
              _konu.setDersid(dersid);
              _konu.setSinavid(1);
              _konu =  dao.save(_konu);
                  System.out.println("kaydet e girdi !");
              return _konu;
          }
      
      }
      

      你的 ajax 调用应该是这样的:

      $(document).ready(function() {
        $("#btnekle").click(function() {
          var input = {
            "konu": $("#KonuAd").val(),
            "dersid": $("#ddlders").val()
          };
          var inputStr = JSON.stringify(input);
          alert(inputStr);
          $.ajax({
            url: "../islemler/konukaydet",
            type: "POST",
            data: inputStr,
            dataType: "json",
            success: function(output) { // callback method for further manipulations
              var str = JSON.stringify(output);
              alert("success ");
              $("#output").text(data);
            },
            error: function(data) { // if error occured
                alert("err");
              $("#error").text(data);
            }
          });
      
        });
      });
      

      对于您的 Home 方法,您的 URL 类似于“../islemler/home”

      希望对你有帮助。

      【讨论】:

        【解决方案5】:

        解决问题,

        脚本代码

            function madeAjaxCall(){
            var data =  {}
            data["konu"] = $("#konuad").val()
            data["dersid"] = $("#ddlders").val()
        
         $.ajax({
          type: "post",
        //  http://localhost:8080
          url: "/islemler/konukaydet",
          cache: false,    
        //  data:'konu=' + $("#konuad").val() + "&dersid;=" + $("#ddlders").val(),
          data:data,
          success: function(response){
           $('#result').html("");
           var obj = JSON.parse(response);
           $('#result').html("First Name:- " + obj.konu +"</br>Last Name:- " + obj.dersid  );
          },
          error: function(){      
           alert('Error while request..');
          }
         });
        }
        

        和控制器代码

        @RequestMapping(value="islemler/konukaydet",method=RequestMethod.POST)
        private   @ResponseBody  Konular KonuKaydet (HttpServletRequest request, HttpServletResponse response) 
        {
            _konu.setKonu(request.getParameter("konu"));
            _konu.setDersid(Integer.parseInt(request.getParameter("dersid")));
            _konu.setSinavid(1);
            _konu =  dao.save(_konu);
                System.out.println("kaydet e girdi !");
        
            return _konu;
        }
        

        非常感谢... :)

        【讨论】:

          猜你喜欢
          • 2015-09-12
          • 1970-01-01
          • 2014-05-16
          • 1970-01-01
          • 1970-01-01
          • 2014-06-17
          • 2017-10-24
          • 2021-05-22
          • 1970-01-01
          相关资源
          最近更新 更多