紧跟上一篇博文,我们聊一下SpringMVC强大的功能。
RestFul风格
1.什么是RestFul风格
Restful就是一个资源定位及资源操作的风格。不是标准也不是协议,只是一种风格。
基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。
2.传统操作资源的方式与使用RestFul操作资源的方式有什么区别
3.代码测试
@Controller
public class HelloController {
//映射访问路径
@RequestMapping("/item/{p1}/{p2}")
public String index(@PathVariable int p1, @PathVariable int p2, Model model){
int result = p1+p2;
//Spring MVC会自动实例化一个Model对象用于向视图中传值
model.addAttribute("msg", "结果:"+result);
//返回视图位置
return "Hello";
}
}
结果展示:
当输入的参数不是int类型的结果:
总结:
1.通过路径变量的类型可以约束访问参数,如果类型不一样,则访问不到对应的请求方法
2.原本的?传参的方式不能使用了
3.获得参数更加方便,框架会自动进行类型转换。
4.使用method属性指定请求类型:约束请求的类型
代码测试:将映射请求路径改为POST请求
//映射访问路径,必须是POST请求
@RequestMapping(value = "/hello",method = {RequestMethod.POST})
public String index(Model model){
model.addAttribute("msg", "hello!");
return "Hello";
}
运行结果:
所有的地址栏请求默认都会是 HTTP GET 类型的。
只需将POST请求改为GET请求就可以运行成功。
5.组合注解
相当于@RequestMapping(method =RequestMethod.GET) 的一个快捷方式。
- @GetMapping
- @PostMapping
- @PutMapping
- @DeleteMapping
- @PatchMapping
数据跳转方式:3种方式
1.ModelAndView
设置ModelAndView对象 , 根据view的名称 , 和视图解析器跳到指定的页面 .
public class ControllerTest1 implements Controller {
public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
//返回一个模型视图对象
ModelAndView mv = new ModelAndView();
mv.addObject("msg","ControllerTest1");
mv.setViewName("Hello");
return mv;
}
}
2.ServletAPI
通过设置ServletAPI , 不需要视图解析器
@Controller
public class ResultGo {
@RequestMapping("/result/t1")
public void test1(HttpServletRequest req, HttpServletResponse rsp) throws IOException {
rsp.getWriter().println("Hello,Spring BY servlet API");
}
@RequestMapping("/result/t2")
public void test2(HttpServletRequest req, HttpServletResponse rsp) throws IOException {
rsp.sendRedirect("/index.jsp"); //重定向
}
@RequestMapping("/result/t3")
public void test3(HttpServletRequest req, HttpServletResponse rsp) throws Exception {
//转发
req.setAttribute("msg","Hello,Spring BY servlet API");
req.getRequestDispatcher("/WEB-INF/jsp/test.jsp").forward(req,rsp);
}
}
3.SpringMVC
通过SpringMVC来实现转发和重定向
@Controller
public class ResultSpringMVC {
@RequestMapping("/item1")
public String test1(){
//转发一
return "/index.jsp";
}
@RequestMapping("/item2")
public String test2(){
//转发二
return "forward:/index.jsp";
}
@RequestMapping("/item3")
public String test3(){
//重定向
return "redirect:/index.jsp";
}
}
当执行/item1路径时会出现错误:是因为会走视图解析器视图名发生改变
当执行/item2或者3时不会发生错误。
数据处理
1.处理前端传来的数据
(1)提交的域名称和处理方法的参数名一致
提交数据 : http://localhost:8080/hello?name=wendi
@RequestMapping("/hello")
public String hello(String name){
System.out.println(name);
return "hello";
}
后台输出 : wendi
(2)提交的域名称和处理方法的参数名不一致
提交数据 : http://localhost:8080/hello?username=wendi
//@RequestParam("username") : username提交的域的名称 .
@RequestMapping("/hello")
public String hello(@RequestParam("username") String name){
System.out.println(name);
return "hello";
}
后台输出 : wendi
(3)提交的是一个对象:要求提交的表单域和对象的属性名一致
实体类:
public class User {
private int id;
private String name;
private int age;
//构造
//get/set
//tostring()
}
提交数据 : http://localhost:8080/mvc04/user?name=wendi&id=1&age=15
@RequestMapping("/user")
public String user(User user){
System.out.println(user);
return "hello";
}
后台输出 : User { id=1, name=‘wendi’, age=15 }
如果使用对象的话,前端传递的参数名和对象名必须一致,否则就是null
2.数据显示到前端
(1)第一种 : 通过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;
}
}
(2)第二种 : 通过ModelMap
@RequestMapping("/hello1")
public String hello(@RequestParam("username") String name, ModelMap model){
//相当于req.setAttribute("name",name);
model.addAttribute("name",name);
return "hello";
}
(3)第三种 : 通过Model
@RequestMapping("/hello2")
public String hello(@RequestParam("username") String name, Model model){
//相当于req.setAttribute("name",name);
model.addAttribute("msg",name);
return "test";
}
三种的区别:
- ModelAndView 可以在储存数据的同时,可以进行设置返回的逻辑视图,进行控制展示层的跳转。
- ModelMap 继承了 LinkedMap ,除了实现了自身的一些方法,同样的继承 LinkedMap 的方法和特性;
- Model 只有寥寥几个方法只适合用于储存数据,简化了新手对于Model对象的操作和理解