2011-01-27 42 views
24

Tôi đang sử dụng Spring MVC và tôi cần thực hiện cuộc gọi không đồng bộ tới máy chủ và chỉ làm mới một phần của trang.Cách hiển thị Chế độ xem bằng AJAX trong Spring MVC

Điều tôi thực sự có là Bộ điều khiển trả về một Chuỗi. Tôi gọi Controller bằng cách sử dụng hàm JQuery (.post()).

Vấn đề với giải pháp của tôi là tôi không thể kết xuất JSP như tôi làm khi tôi sử dụng ModelAndView làm kiểu trả về.

Có cách nào để trả lại Chế độ xem đã được hiển thị không?

Xin cảm ơn trước.

Neuquino

Trả lời

15

Bạn có thể đặt mảnh này của trang thành một JSP riêng và trả về một ModelAndView trỏ đến nó từ phương pháp của bạn. Không có sự khác biệt giữa AJAX và các cuộc gọi không AJAX từ thời điểm đó.

+0

Tôi có yêu cầu tương tự như OP, và điều này nghe có vẻ hứa hẹn nhưng tôi không hoàn toàn theo sau ... bạn có thể xây dựng, hoặc liên kết đến một hướng dẫn có cách tiếp cận này? – Bane

+0

Tôi câm. Sau khi chơi xung quanh trong một phút nó nhấp vào những gì bạn muốn. :) Tôi sẽ làm việc một ví dụ ngắn ở đây trong một phút sau khi tôi nhận được một cái gì đó làm việc. – Bane

51

Câu trả lời này chỉ để xác nhận rằng câu trả lời của công trình axtavt. Tôi mất một phút để nhận ra những gì anh ta gợi ý, vì vậy tôi nghĩ tôi sẽ đăng một đoạn mã để giúp đỡ bất cứ ai đến sau tôi. Kudos đi với anh ta, mặc dù! :)


MyController.java

@Controller 
public class MyController { 

    @RequestMapping(method=RequestMethod.GET, value="/mainView") 
    public ModelAndView getMainView(...) {   
     /* do all your normal stuff here to build your primary NON-ajax view 
     * in the same way you always do 
     */    
    } 

    /* this is the conroller's part of the magic; I'm just using a simple GET but you 
    * could just as easily do a POST here, obviously 
    */ 
    @RequestMapping(method=RequestMethod.GET, value="/subView") 
    public ModelAndView getSubView(Model model) { 
     model.addAttribute("user", "Joe Dirt"); 
     model.addAttribute("time", new Date()); 
     return new ModelAndView("subView"); 
    } 

} 


mainView.jsp

(...) 

<script src="http://code.jquery.com/jquery-1.7.1.min.js"></script> 
<script type="text/javascript"> 
    function doAjaxPost() { 

     $.ajax({ 
      type: "GET", 
      url: "subView", 
      success: function(response) { 
       $("#subViewDiv").html(response); 
      } 
     }); 
    } 
</script> 
<input type="button" value="GO!" onclick="doAjaxPost();" /> 
<div id="subViewDiv"></div> 

(...) 


subView.jsp

(...) 

<h3> 
    User Access Details 
</h3> 

<p> 
    ${user} accessed the system on ${time} 
</p> 

(...) 


Và đó là nó! Một điều đẹp; cho đến bây giờ, làm AJAX trong mùa xuân đã là một nỗi đau lớn ... phân tích cú pháp lớn @ ResponseBody, xây dựng bộ HTML khổng lồ bằng cách ghép các công cụ trong JS ... ugh ... Tôi không thể tin cách tiếp cận này đơn giản và tuyệt vời như thế nào - và đã không nhận thức được nó cho đến bây giờ! :)

+1

Tuyệt đối tuyệt vời! Với điều này, về cơ bản chúng ta có thể quên js, vì kết quả cuối cùng được hiển thị trong html bất cứ khi nào chúng ta có thể thay thế divs bằng các khối cần thiết từ jsp và cá nhân tôi tin rằng jsp tốt hơn nhiều so với mã jquery/js. Mọi thứ tuyệt vời thường đơn giản. – Aubergine

+1

Tuyệt vời .... Tôi đã trải qua đau đớn trong ba ngày qua bằng cách sử dụng JS để nhổ ra nội dung HTML. Giải pháp này thật tuyệt vời. Cảm ơn lời giải thích. Tôi ước tôi có thể bỏ phiếu này cao hơn. –

+5

Vì vậy, câu hỏi với câu trả lời của nó phải được thực sự thiết lập trạng thái như bảo vệ. ;-) – Aubergine

Các vấn đề liên quan