如何避免Spring控制器方法返回逻辑视图名称并返回用于处理和AJAX请求的String值?

时间:2016-01-07 15:54:42

标签: jquery spring spring-mvc

我是Spring MVC和AJAX的新手,我有以下疑问。

使用jQuery我正在执行这个AJAX请求:

$.ajax({
    type : "GET",
    url : "salvaAppuntiMinisteriale",

    data: { 
        'codiceProgetto': codiceProgetto,
        'appuntiMinisteriale': appuntiMinisteriale
          }

    }).done(function(response) {
        showSuccessMessage('Nota inserita');
        document.open();
        document.write(response);
        document.close();

    }).error(function(xhr) {
        manageError(xhr);
}); 

正如您所看到的,对 salvaAppuntiMinisteriale 资源执行请求,向其传递两个值(从我的页面检索,它可以正常工作)。

然后,在Spring MVC控制器类中,我有这个处理先前AJAX请求的控制器方法:

@RequestMapping(value = "salvaAppuntiMinisteriale", method=RequestMethod.GET)
public String salvaAppuntiMinisteriale(@RequestParam String codiceProgetto, @RequestParam String appuntiMinisteriale, Model model) throws Exception {

    System.out.println("CODICE PROGETTO: " + codiceProgetto + " NOTA MINISTERIALE: " + appuntiMinisteriale);

    Twp1007Progetto progetto = progettoService.getProgetto(Integer.parseInt(codiceProgetto));

    progetto.setDesNotApp(appuntiMinisteriale);

    progetto.setCodPgmUltMov("Inserimento nota minitseriale");              // Codice azione ultima modifica
    progetto.setCodUteUltMov(this.getUtenteConnesso().getUsername());       // Utente ministeriale che ha variato l'anticipo
    progetto.setDatOraUltMov(new Date());                                   // Data ed ora della variazione dell'anticipo

    progettoService.salvaNotaAppunto(progetto);

    model.addAttribute("progetto", progetto);

    return "visualizzaProspetto/prospettoRendicontazione";
}

这很好用。它正确处理上一个请求并返回整个视图的逻辑名称,这些视图将在当前选项卡中通过这些行完全重新加载到我之前的jQuery代码中:

document.open();
document.write(response);
document.close();

这样可以正常但不是我想要改变这种行为,我想避免返回并重新加载整个页面。

所以我需要做的是以下操作:

  1. 我不希望之前的 salvaAppuntiMinisteriale()控制器方法返回一个逻辑视图名称(因为我没有重新加载页面)。

  2. salvaAppuntiMinisteriale()方法必须从我的 progetto 对象返回** appuntiMinisteriale 的值(我必须检索它以确保值正确保存在数据库中,但现在这并不重要)。也许我要将它放入 ResponseBody

  3. 在我的jQuery完成的 done()调用的回调函数中,我必须检索以前的值,以便我可以将HTML字段的内容更新到我的页面中。

  4. 那么,我该如何实现这种行为呢?如何避免返回逻辑视图名称并返回String值,然后将其检索到 .done()函数中?

2 个答案:

答案 0 :(得分:1)

只需返回要传递给前端的对象,并使用@RestController注释或带@ResponseBody的控制器方法注释控制器。

答案 1 :(得分:0)

您似乎想要解析json,因此最好使用@RestController而不是@Controller,这告诉Spring您正在进行RESTful服务调用。

您的控制器,我会像这样重写:

@RequestMapping(value = "salvaAppuntiMinisteriale", method=RequestMethod.GET,  produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity< Twp1007Progetto > salvaAppuntiMinisteriale(@RequestBody Twp1007Progetto progetto ) throws Exception {
 //your logic here
 return new ResponseEntity<>(progetto, HttpStatus.OK));
}