Spring 启动 - ModelAndView 不调用另一个页面

Spring boot - ModelAndView doesn't call another page

我有一个 Spring Boot @Controller,它在 ajax 调用后重定向页面。代码没有显示错误,但新页面没有出现。下面我分享了控制器代码和js函数的图片。有谁知道发生了什么事吗?

控制器:

@RequestMapping(value = "/openNewPage", method = RequestMethod.GET)
public ModelAndView openNewPage(@RequestParam String id, Model model) {
    ModelAndView mav = new ModelAndView();
    mav.setViewName("/newPage");
    return mav;
}

JS:

function open() {
    var table = $('#dataList').DataTable();
    $('#dataList tbody').on('click', 'tr', function() {
        ligneSel = table.row(this).data();
        var id =  ligneSel[0];
    
        $.ajax({
            url : './openNewPage',
            type: 'get',
            dataType : 'html',
            data : {
                id: id
            },
            success : function(data) {
                if (data != null) {
                    $("body").html(data);
                }
            }
        });
    });
}

简单地命名视图不会重定向。尝试在创建 ModelAndView 时添加 redirect: 前缀:

@RequestMapping(value = "/openNewPage", method = RequestMethod.GET)
public ModelAndView openNewPage(@RequestParam String id, Model model) {
    ModelAndView mav = new ModelAndView("redirect:/newPage");
    return mav;
}

此外,在您的 JS 中,您正在发出获取请求并获取 ModelAndView 对象。

这不会将页面重定向到 ModelAndView。

AJAX 通常像这样用于与 RESTful 服务交互,您可以执行 GET 请求并以异步方式在页面上显示数据 - 无需离开页面。

Spring 在遵循 MVC 模式的 MVC(模型-视图-控制器)框架中有 ModelAndView class。 模型和视图在服务器端解析 (Java),然后提供给客户端,而不是在客户端(Web 浏览器、JS)获取数据。

如果你想重定向客户端(从浏览器,JS)然后将它添加到你的 javascript:

window.location.href = '/newPage';

您需要在控制器中定义 /newPage 端点才能正常工作。

试试这个:

@Controller
@RequestMapping("/")
public class RedirectController {
    
    @GetMapping("/redirectWithRedirectPrefix")
    public ModelAndView redirectWithUsingRedirectPrefix(ModelMap model) 
    {
        model.addAttribute("attribute", "redirectWithRedirectPrefix");
        return new ModelAndView("redirect:/redirectedUrl", model);
    }
}

我有一个使用 Thymeleaf templates 的 Spring BOOT 应用程序。例如:

我有一个定义菜单的布局视图,它通过向 Spring 控制器发出请求来加载另一个页面。例如:

<a href="#" style="color: white" th:href="@{/photo}">Upload Photos</a>

当我点击 上传照片 时,它会调用 /photo 控制器:

 @GetMapping("/photo")
    public String photo() {
      return "upload";
    }

returns Spring BOOT 应用中的上传视图。使用 Thymeleaf 模板,您可以简单地引用控制器中模板下的 HTML 文件的名称,如本例所示。您的问题看起来像是在使用 AJAX,而不是使用菜单项来引用控制器。

有关完整教程,请参阅此示例:

https://spring.io/guides/gs/serving-web-content/

我的问题是 ajax 对 spring 引导控制器的调用没有重定向新视图。答案是我们需要调用控制器两次.

这个 post 将更好地解释解决方案:Ajax call to spring boot controller to redirecting a view .

感谢所有帮助我解决这个问题的人。

下面的例子显示了解决方案:

1) 第一个控制器:

@RequestMapping(value = "/openNewPage", method = RequestMethod.GET)
public ModelAndView openNewPageController1(@RequestParam String id, Model model) {
    ModelAndView mav = new ModelAndView("/newPage");
    return mav;
}

2)第二个控制器:

@RequestMapping(value = "/openNewPage", method = RequestMethod.GET)
public ModelAndView openNewPageController2(@RequestParam String id, Model model) {
    ModelAndView mav = new ModelAndView("/newPage");
    return mav;
}

3) javaScript:

function open() {
    var table = $('#dataList').DataTable();
    $('#dataList tbody').on('click', 'tr', function() {
        ligneSel = table.row(this).data();
        var id =  ligneSel[0];
    
        $.ajax({
            url : './openNewPage',
            type: 'get',
            dataType : 'html',
            data : {
                id: id
            },
            success : function(data) {
                window.location.href = "/openNewPage?id="+id;
            }
        });
    });
}