1.控制方法返回字符串
则根据mvc基础相关里的逻辑原理图里讲的,根据视图解析器,找到对应的字符串.jsp页面。
2.若控制方法未写返回值(void)。
@RequestMapping("/testVoid")
public void testVoid{
System.out.println("testvoid方法执行了...");
}
如上,控制台会打印"testvoid方法执行了...",会默认去找方法同名的jsp文件
若想void,不报404。
1.通过请求转发,(转发一次请求,就不用编写项目名称,依然默认在当前项目下)这样就不会经过视图解析器,所以路径及jsp格式都要提供。如上方法将转到success.jsp页面
@RequestMapping("/testVoid")
public void testVoid(HttpServletRequest request, HttpServletResponse response) throws Exception {
System.out.println("testVoid方法执行了...");
//编写请求转发的程序
request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request,response);
return;
}
2.通过请求重定向(重新发送请求,算是总共进行两次请求,所以通过response响应调方法),request.getContextPath()为获取项目名称根目录路径,即webapp,进行拼接,进入该路径下的index.jsp。(此时不能进入/WEB-INF)
@RequestMapping("/testVoid")
public void testVoid(HttpServletRequest request, HttpServletResponse response) throws Exception {
System.out.println("testVoid方法执行了...");
//重定向
response.sendRedirect(request.getContextPath()+"/index.jsp");
return;
}
3.通过直接相应,相当于直接赋予相应结果,此时页面是在testVoid.jsp页面。
@RequestMapping("/testVoid")
public void testVoid(HttpServletRequest request, HttpServletResponse response) throws Exception {
System.out.println("testVoid方法执行了...");
// 设置中文乱码
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
// 直接会进行响应
response.getWriter().print("你好");
return;
}
3.若控制方法返回值是ModelAndView对象
@RequestMapping("/testModelAndView")
public ModelAndView testModelAndView(){
// 创建ModelAndView对象
ModelAndView mv = new ModelAndView();
System.out.println("testModelAndView方法执行了...");
// 模拟从数据库中查询出User对象
User user = new User();
user.setUsername("小凤");
user.setPassword("456");
user.setAge(30);
// 把user对象存储到mv对象中,也会把user对象存入到request对象
mv.addObject("user",user);
// 跳转到哪个页面
mv.setViewName("success");
return mv;
}
其实,返回字符串,底层也是调用ModelAndView对象。
ModelAndView为model实现类,所以addObject方法可以封装“键值对”,也会把user对象存入到request对象,前端就可以通过${}取到。
setViewName方法设定视图名字,也会经过视图解析器,所以找到success.jsp页面。
4.SpringMVC框架提供的转发和重定向
forward关键字进行转发,redirect关键字进行重定向
@RequestMapping("/delete")
public String delete() throws Exception {
System.out.println("delete方法执行了...");
// 请求的转发
// return "forward:/WEB-INF/pages/success.jsp";
return "forward:/user/findAll";
// 重定向
// return "redirect:/index.jsp";
}
使用forward关键字进行请求转发,forward:转发的JSP路径",不走视图解析器了,所以需要编写完整的路径转发请求到对应jsp页面,路径要写完整。转发到对应页面或者转发到其他请求。
使用redirect关键字进行重定向,底层自动编写项目根路径,所以可以不写。