簡體   English   中英

從Spring MVC中的JSP按鈕調用控制器方法

[英]Call controller method from JSP button in Spring MVC

我想在Spring MVC中使用JSP頁面上的按鈕來調用控制器方法,但我希望它保留在當前頁面上,不要重新加載它或任何東西,只需調用一個方法。 我發現很難。 我的按鈕在cars.jsp頁面上。 為了留在這個頁面,我必須做這樣的事情:

@RequestMapping(value="/start")
public String startCheckingStatus(Model model){
    System.out.println("start");
    model.addAttribute("cars", this.carService.getCars());
    return "car\\cars";
}

按鈕:

 <a href="<spring:url value="/cars/start"/>">Start</a>

但這不是一個好的解決方案,因為我的頁面實際上是重新加載的。 我可以在沒有任何刷新,重定向或任何其他情況下調用controller方法嗎? 當我刪除返回類型時:

@RequestMapping(value="/start")
public void startCheckingStatus(Model model){
    System.out.println("start");
}

我得到了404。

在按鈕上添加onclick事件,並從您的javascript調用以下代碼:

 $("#yourButtonId").click(function(){
    $.ajax({
        url : 'start',
        method : 'GET',
        async : false,
        complete : function(data) {
            console.log(data.responseText);
        }
    });

});

如果要等待調用的結果,請保持async : false否則將其刪除。

如其他地方所述,您可以通過實現基於Ajax的解決方案來實現:

https://en.wikipedia.org/wiki/Ajax_(programming)

使用Ajax,Web應用程序可以異步(在后台)向服務器發送數據和從服務器檢索, 而不會干擾現有頁面的顯示和行為。 通過將數據交換層與表示層分離, Ajax允許Web頁面和擴展Web應用程序動態更改內容,而無需重新加載整個頁面

要實現此目的,您需要更改應用程序的客戶端和服務器端部分。 使用Spring MVC時,只需將@ResponseBody注釋添加到控制器方法中即可:

可以放在一個方法上,並指示返回類型應直接寫入HTTP響應主體(而不是放在模型中,或解釋為視圖名稱)。

http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-ann-responsebody

因此,例如,要在Ajax響應中返回一個簡單的String,我們可以執行以下操作(沒有@ResponseBody,框架會嘗試找到一個名為“some status”的視圖,這顯然不是我們想要的):

@RequestMapping(value="/start")
@ResponseBody 
    public String startCheckingStatus(Model model){
    return "some status"; 
}

對於客戶端部分,您需要添加一些javascript,它將使用XMLHttpRequest對象從控制器中檢索數據。

雖然有各種框架可以簡化這個(例如JQuery),但下面有一些使用vanilla javascript的例子,可能值得先看看其中的一些,看看實際發生了什么:

http://www.w3schools.com/ajax/ajax_examples.asp

如果我們采用這個具體的例子:

http://www.w3schools.com/ajax/tryit.asp?filename=tryajax_callback

並[1]將<button/><script/>元素復制到JSP,[2]將URL更改為指向控制器,[3]創建元素<div id="demo"></div>然后,在您的JSP中,單擊頁面中的按鈕,應更新此<div/>以顯示控制器返回的String。

如上所述,這是一個動作的大量代碼,因此您可以使用一些JS框架來抽象出很多動作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM