结果跳转方式
跳转方式
ModelAndView
设置ModelAndView对象 , 根据view的名称 , 和视图解析器跳到指定的页面 .
页面 : {视图解析器前缀} + viewName +{视图解析器后缀}
<!-- 视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
id="internalResourceViewResolver">
<!-- 前缀 -->
<property name="prefix" value="/WEB-INF/jsp/" />
<!-- 后缀 -->
<property name="suffix" value=".jsp" />
</bean>
对应的controller类👇
public class ControllerTest1 implements Controller {
public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
//返回一个模型视图对象
ModelAndView mv = new ModelAndView();
mv.addObject("msg","ControllerTest1");
mv.setViewName("test");
return mv;
}
}
通过SpringMVC来实现转发和重定向 - 无需视图解析器;
测试前,需要将视图解析器注释掉
@Controller
public class ModelTest1 {
@RequestMapping("mt1")
public String test1 (Model model) {
//转发
model.addAttribute("msg","!!!!!!");
return "/WEB-INF/jsp/test.jsp";
}
@RequestMapping("mt2")
public String test2 (Model model) {
//转发
model.addAttribute("msg","!!!!!!");
return "forward:/jsp/test.jsp";
}
@RequestMapping("mt3")
public String test3 (Model model) {
//重定向
model.addAttribute("msg","!!!!!!");
return "redirect:/index.jsp";
}
}
报错:Ambiguous mapping,Ambiguous=模棱两可的,@RequestMapping注解重复
数据处理
处理提交数据
提交的域名称和处理方法的参数名一致
提交数据 : http://localhost:8080/user/t1?name=xxxx
处理方法 :
@Controller
@RequestMapping("/user")
public class UserController {
//localhost:8080/user/t1 ? name=xxx;
@GetMapping("/t1")
public String test1 (String name, Model model) {
//1.接收前端参数,地址输入
System.out.println("接收到前端的参数:" + name);
//2.将返回参数的结果传递到前端,model
model.addAttribute("msg",name);
//3.视图跳转
return "test";
}
}
后台输出 : xxxx
提交的域名称和处理方法的参数名不一致
提交数据 : http://localhost:8080/user/t1?username=xxxx
处理方法 :
@Controller
@RequestMapping("/user")
public class UserController {
//localhost:8080/user/t1 ? name=xxx;
@GetMapping("/t1")
public String test1 (@RequestParam("username")String name, Model model) {
//1.接收前端参数,地址输入
System.out.println("接收到前端的参数:" + name);
//2.将返回参数的结果传递到前端,model
model.addAttribute("msg",name);
//3.视图跳转
return "test";
}
}
后台输出 : xxxx
提交的是一个对象
要求提交的表单域和对象的属性名一致 , 参数使用对象即可
1、实体类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private int id ;
private String name;
private int age;
}
2、提交数据 : http://localhost:8080//user/t2?name=xxxxx&id=1&age=1
3、处理方法 :
//前端接收一个对象
@GetMapping("/t2")
public String test2 (User user) {
System.out.println(user);
return "test";
}
后台输出 : User { id=1, name=‘xxxxx’, age=1 }
说明:如果使用对象的话,前端传递的参数名和对象名必须一致,否则就是null。
数据显示到前端
第一种 : 通过ModelAndView
我们前面一直都是如此 . 就不过多解释
public class ControllerTest1 implements Controller {
public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
//返回一个模型视图对象
ModelAndView mv = new ModelAndView();
mv.addObject("msg","ControllerTest1");
mv.setViewName("test");
return mv;
}
}
第二种 : 通过ModelMap
ModelMap
@RequestMapping("/hello")
public String hello(@RequestParam("username") String name, ModelMap model){
//封装要显示到视图中的数据
//相当于req.setAttribute("name",name);
model.addAttribute("name",name);
System.out.println(name);
return "hello";
}
第三种 : 通过Model
Model
@RequestMapping("/ct2/hello")
public String hello(@RequestParam("username") String name, Model model){
//封装要显示到视图中的数据
//相当于req.setAttribute("name",name);
model.addAttribute("msg",name);
System.out.println(name);
return "test";
}
对比
就对于新手而言简单来说使用区别就是:
Model 只有寥寥几个方法只适合用于储存数据,简化了新手对于Model对象的操作和理解;
ModelMap 继承了 LinkedMap ,除了实现了自身的一些方法,同样的继承 LinkedMap 的方法和特性;
ModelAndView 可以在储存数据的同时,可以进行设置返回的逻辑视图,进行控制展示层的跳转。
当然更多的以后开发考虑的更多的是性能和优化,就不能单单仅限于此的了解。