【问题标题】:spring mvc 3 + jquery + AJAX + $.get - value not returned from controller to callback methodspring mvc 3 + jquery + AJAX + $.get - 值未从控制器返回到回调方法
【发布时间】:2012-10-20 05:01:13
【问题描述】:

我是 AJAX 新手,目前正在学习将它与 Spring MVC 一起使用。我也面临同样的问题。

在着手处理我正在处理的实际实时需求之前,我正在测试整个 AJAX+Spring MVC+jquery 组合,并使用一些非常基本的东西来正确理解。

我在页面上有一个搜索框+“提交”按钮。我在使用 $.get 提交时向 Spring 控制器发送硬编码文本。然后我将该控制器的另一个文本发送回回调函数,并尝试使用“警报”框在回调函数中显示返回的文本。这似乎不起作用。

我看到正在调用回调函数(因为正在触发回调函数中的“警报”)所以我有点假设控制权正在转移到控制器并返回到回调方法,但我是无法弄清楚为什么从控制器返回的文本没有显示在回调方法的警报框中。不确定我在这里缺少什么来捕获回调方法中的返回值。

非常感谢您对此的回应和帮助。

谢谢。

文本框和提交按钮的 HTML:

    <div class = "searchcontactform">
      <form id = "searchcontactform" name="searchcontactform" method="GET">
        <input type = 'text' size='25' name = "searchlastname" id = "searchlastname" value='Enter Last Name to Search'/>
        <input type = "submit" value="Find">
      </form>
   </div>

在提交上述表单时触发的 JavaScript:

    <script type="text/javascript" src="${pageContext.request.contextPath}/resources/scripts/jquery.min.js"></script>
    <script type="text/javascript">

    $(document).ready(function( ) {
    $('#searchcontactform').submit(function(){

         $.get("ContactList-JPA/search", {textsent : 'Hello Controller'},callback);

         function callback(textreceived){
               alert('In Callback. Text Received is: '+textreceived);
         };
    });
    });

控制器:

        @RequestMapping(value = "/search", method = RequestMethod.GET)
        public @ResponseBody String searchcontact(@RequestParam(value="textsent") String textsent){
        return textsent;
        }

POM.xml 中的杰克逊依赖:

           <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-mapper-asl</artifactId>
        <version>1.7.1</version>
    </dependency>

servlet-context.xml 和 root-context.xml 中驱动的注解:

    <!-- Enables the Spring MVC @Controller programming model -->
    <annotation-driven />

【问题讨论】:

    标签: javascript ajax spring jquery spring-mvc


    【解决方案1】:

    我认为问题在于您返回类型 String 并且出于某种原因 Spring/Jackson 在转换为响应时不喜欢。要解决此问题,您应该执行以下操作:

    @RequestMapping(value = "/search", method = RequestMethod.GET)
    public @ResponseBody List<String> searchcontact(@RequestParam(value="textsent") String textsent){
        return Arrays.asList( new String[] { textsent } );
    }
    

    这并不理想,而且很烦人。我还没有真正研究过为什么会发生这种情况,因为当时的解决方法对我来说很好。

    更新:抱歉,我在这里错了,您根本没有假设返回将是 JSON,因此更改控制器不会产生任何影响。

    【讨论】:

      【解决方案2】:

      首先,将return false放在提交事件处理程序的末尾

      $('#searchcontactform').submit(function(){
      
               $.get("ContactList-JPA/search", 
               {
                   textsent : 'Hello Controller'
               },
               function(textreceived){
                     alert('In Callback. Text Received is: '+textreceived);
               });
               return false;
          });
      

      如果这不起作用尝试使用谷歌浏览器,你可以调试你的 javascript 应用程序,在回调中和 $.get 行放置一个断点

      【讨论】:

      • return false 将阻止默认提交行为
      • 这行得通!。添加'return false;'提交事件处理程序末尾的语句解决了我的问题!非常感谢您的回复。非常感谢。
      【解决方案3】:

      尝试将返回的数据作为参数传递给回调:

      $(document).ready(function( ) {
          $('#searchcontactform').submit(function(){
      
              $.get("ContactList-JPA/search", {textsent : 'Hello Controller'},
                 function(data){
                    callback(data);
              });
      
              function callback(textreceived){
                 alert('In Callback. Text Received is: '+textreceived);
              };
          });
      });
      

      您还可以将回调函数设置为匿名函数以进行整理。

      $(document).ready(function( ) {
          $('#searchcontactform').submit(function(){
      
              $.get("ContactList-JPA/search", {textsent : 'Hello Controller'},
                 function(data){
                    alert('In Callback. Text Received is: '+data);
              });
          });
      });
      

      【讨论】:

      • 那么你的回调方法在哪里接收 textreceived 的值
      • 是的,它有一个参数,但是当您调用该函数时,您不传递参数,因此当您警告该参数时,它不包含值。
      • 查看 jquery 文档,您会看到一堆 $.get() 示例:api.jquery.com/jQuery.get
      • jsfiddle.net/86y7d这是javascript,学习一下,你可以给一个函数作为参数,并在调用时期望一个参数
      • 是的,这是给你的。 $.get 期望作为参数的 URL 字符串,作为 HTTP REQUEST PARAM 的数据对象,最后一个是回调函数,该函数可以像您展示的那样动态声明为匿名函数或像我展示的命名函数
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-09
      • 1970-01-01
      • 2012-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多