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,而不是使用菜单项来引用控制器。
有关完整教程,请参阅此示例:
我的问题是 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;
}
});
});
}
我有一个 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,而不是使用菜单项来引用控制器。
有关完整教程,请参阅此示例:
我的问题是 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;
}
});
});
}