[SpringMVC 02] 注解开发 RestFul风格 转发重定向
SpringMVC 02
1. 注解开发
新建项目
-
web.xml中配置DispatcherServlet:
springmvc org.springframework.web.servlet.DispatcherServlet contextConfigLocation classpath:springmvc-servlet.xml 1 springmvc / -
写springmvc-servlet.xml的spring配置文件
(添加扫描包,过滤器,之前配置的Mapping和Adapter被取代,resolve依然需要)
注意前缀prefix的路径!!!, 最后面有一个
/
<?xml version="1.0" encoding="UTF-8"?>
以后
-
写Controller(用注解写)
被这个注解所注解的类中的所有方法,如果返回值是String,并且有具体的页面可以跳转,就会被解析器解析
注意传输的是Model!!! 不是ModelAndView
@RequestMapping注解用于映射url到一个控制器上(类),或者一个控制器的方法上(可以嵌套使用,即
/类上的路径/方法上的路径
@Controller //实现Controller注解,成为控制器,可以返回mv对象 public class HelloController { @RequestMapping("/hello")//这里指,访问的url需要添加的地址 public String hello(Model model){ model.addAttribute("msg", "Hello"); return "hello"; //会被视图解析器处理 } }
-
前端取参数
2. RestFul风格
是一个资源定位、资源操作的风格,不是标准也不是协议, 更简洁比较容易实现缓存等机制。(都是/, 不需要?传参,&拼接这些)
1. 实现方式:
重点:
之前使用URL: localhost:8080?a=1&b=2
现在使用URL: localhost:8080/1/2
在函数参数中加注解@PathVariable, 在@RequestMapping中添加路径后面的参数
@Controller
public class HelloController {
@RequestMapping("/add/{a}/{b}")
public String test(@PathVariable int a, @PathVariable int b, Model model){
int res = a+ b;
model.addAttribute("msg", res);
return "test";
}
}
前端页面:test.jsp
${msg}
2. 在Restful风格下相同的URL走不同的方法
注解@RequestMapping中有参数method, 可以设置提交请求的方法(查看源码), 是一个枚举类,默认为get方法
@RequestMapping(value="/add/{a}/{b}", method=RequestMethod.GET)
或者直接写
@GetMapping//去源码里找
或
@PostMapping
或
@PutMapping//等
如果写两个函数有相同的路径,但提交方式不同,默认使用get,如果前端指定使用post则用post提交,但url是相同的
3. 转发与重定向
WEB-INF中的资源不能被直接访问(全路径)或者重定向(Controller中重定向)访问,只能在Controller的转发中访问
当配置了视图解析器:
默认走转发,通过视图解析器匹配视图来访问
@RequestMapping("/t1")
public String test2(Model model){
model.addAttribute("msg", "HelloDispatcher");
return "test2";
}
当使用forward关键字: 不通过视图解析器,直接使用全路径转发
return "forward:/WEB-INF/jsp/test2.jsp";
当使用redirect关键字:不通过视图解析器,进行重定向
return "redirect:/index.jsp";
4. 接受请求参数及数据回显
1. 前端提交的数据名与参数名名称一致:
前端提交:
http://localhost:8080/t1?name=Roy
后端处理:
@RequestMapping("/t1")
public String test2( String name, Model model){
model.addAttribute("msg", name);
return "test2";
}
2. 前端提交的变量名与参数名不一致:
前端提交:
http://localhost:8080/t1/username=Roy
后端处理:添加注解@RequestParam("username")
@RequestMapping("/t1")
public String test2(@RequestParam("username") String name, Model model){
model.addAttribute("msg", name);
return "test2";
}
3. 提交的是一个对象
实体类User
public class User{
private int id;
private int age;
private String name;
get/set/constructor/toString
}
提交:
http://localhost:8080/t1/user?id=1&age=15&name=Roy
后端处理:
1.如果传入User,匹配User对象中的字段名,如果一致则传入数据;如果有一个字段名username和name不一致,则此值为空
返回值分别为:
User{id=1, age=3, name='Roy'} 一致
User{id=1, age=3, name=null} 不一致
@RequestMapping("/t1")
public String test2(User user, Model model){
model.addAttribute("msg", user.toString());
return "test2";
}
4. 数据回传前端
- ModelAndView
- Model
- ModelMap
Model 只有寥寥几个方法只适合用于储存数据,简化了新手对于Model对象的操作和理解;
ModelMap 继承了 LinkedMap,除了实现了自身的一些方法,同样的继承 LinkedMap 的方法和特性;
ModelAndView 可以在储存数据的同时,可以进行设置返回的逻辑视图,进行控制展示层的跳转。
5. 乱码问题
-
可以自己写filter过滤器(参考JavaWeb)
-
使用springMVC的过滤器
在web.xml中配置完DispatcherServlet之后,再配置一个过滤器:
encoding org.springframework.web.filter.CharacterEncodingFilter encoding utf-8 encoding /* 注意:url-pattern一定要是
/*
-
再tomcat中可配置:(不用这个)