视图解析器解析后的跳转的方式:前缀+controller返回值+后缀
试图解析器的bean注册,以及前后缀定义方法如下:
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
第一种跳转方式 :使用注解,使用了@Controller,方法返回的字符串会直接被前端控制前转发给视图解析器解析
当返回值包含特殊字符串:redirect:和 forward:,会进行特殊处理,如下:直接跳转这两个后面的地址index.jsp,而不通过解析器里的拼接
当没有解析到特殊字符串时,默认走的是转发形式,因为转发可以携带参数
@Controller
public class hellocontroller {
@RequestMapping("/h1")
public String hello(Model model){
model.addAttribute("msg","go!");
return "hello";
}
@RequestMapping("/h5")
public String hello5(Model model){
model.addAttribute("msg","go!go5");
return "redirect:index.jsp";
}
@RequestMapping("/h6")
public String hello6(Model model){
model.addAttribute("msg","go!go6");
return "forward:index.jsp";
}
第二种方式:实现Controller接口:这时候通过setViewName方法,给modelAndView对象set一个值,并返回modelAndView本身,也会进行视图拼接。如下
public class hellocontroller implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("msg","springmvcCool!");
modelAndView.setViewName("hello");
return modelAndView;
}
}
第三种方式:不通过视图解析器方式,而是使用前面学过的request,response方法,这些参数时前端控制器传过来,可以在方法里使用,如下:
不过这种方法用得少
@RequestMapping("/h7")
public void hello7( HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setAttribute("msg", "go!go7");
req.getRequestDispatcher("WEB-INF/jsp/hello.jsp").forward(req,resp);
}
数据处理:
首先前端数据的获取:
通过方法的参数可以直接获取,如下:
当前端传过来的参数和方式参数不一样时,无法匹配,这时候可以使用 @RequestParam 注解进行指定参数的名字
当使用了这个参数。表明必须要有这个参数,不然会请求会报错,也给出了限制!
@PostMapping("/h9")
public String hello9(String name,Model model) {
model.addAttribute("msg",name);
return "hello";
}
@GetMapping("/h9")
public String hello9(@RequestParam("username") String name,Model model) {
model.addAttribute("msg",name);
return "hello";
}
测试结果如下:
当接受程序的参数是一个对象时,这是spring会自动将前端的参数,和这个对象的属性值进行一一匹对,没有对应的值会为null或者0
@GetMapping("/h8")
public String hello8(User user,Model model) {
System.out.println(user);
model.addAttribute("msg",user);
return "hello";
}
测试结果:
后端数据转发前端:
第一种 : 通过ModelAndView 如下:通过 modelAndView.addObject
public class hellocontroller implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("msg","springmvcCool!");
modelAndView.setViewName("hello");
return modelAndView;
}
}
第二种 : 通过ModelMap 相当于req.setAttribute("name",name);
@GetMapping("/h8")
public String hello8(User user,ModelMap model) {
System.out.println(user);
model.addAttribute("msg",user);
return "hello";
}
第三种 : 通过Model 相当于req.setAttribute("name",name);
@GetMapping("/h8")
public String hello8(User user,Model model) {
System.out.println(user);
model.addAttribute("msg",user);
return "hello";
}
对比
就对于新手而言简单来说使用区别就是:
Model 只有寥寥几个方法只适合用于储存数据,简化了新手对于Model对象的操作和理解;
ModelMap 继承了 LinkedMap ,除了实现了自身的一些方法,同样的继承 LinkedMap 的方法和特性;
ModelAndView 可以在储存数据的同时,可以进行设置返回的逻辑视图,进行控制展示层的跳转。