SpringMVC
1.SpringMVC介绍
springMVC是一种基于Java实现MVC模型的轻量级Web框架
优点:
- 
使用简单,开发便捷(相较于Servelt) 
- 
灵活性强 
使用SpringMVC技术开发web程序流程
- 
创建web工程(Maven结构) 
- 
设置tomcat服务器,加载web工程(tomcat插件) 
- 
导入坐标(SpringMVC+Servlet) 
- 
定义处理请求的功能类(UserController) 
- 
设置请求映射(配置映射关系) 
- 
将SpringMVC设定加载到Tomcat容器中 
SpringMVC入门案例
- 
导入SpringMVC坐标与Servlet坐标 <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.1.5.RELEASE</version> </dependency>
- 
初始化SpringMVC环境 @Configuration public class SpringMvcConfig { }
- 
创建SpringMVC控制器类(等同于Servlet功能) @Controller public class UserController { @RequestMapping("/save") @ResponseBody public String save(){ System.out.println("user save ..."); return "{'info':'springmvc'}"; } }
- 
设定SpringMVC加载对应的bean @Configuration @ComponentScan("com.zkw.controller") public class SpringMvcConfig { }
- 
初始化Servlet容器,加载SpringMVC环境,并设置SpringMVC请求拦截的路径 public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer { @Override protected WebApplicationContext createServletApplicationContext() { AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext(); ctx.register(SpringMvcConfig.class); return ctx; }  @Override protected String[] getServletMappings() { return new String[]{"/"}; //所有的请求都归springmvc处理 }  @Override protected WebApplicationContext createRootApplicationContext() { return null; } }
部分代码介绍:
- 
@RequestMapping:设置当前控制器方法请求访问路径 
- 
@ResponseBody:设置当前控制器方法响应内容为当前返回值,无需解析 
- 
createServletApplicationContext protected WebApplicationContext createServletApplicationContext()//加载容器 { AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();//初始化容器对象 ctx.register(SpringMvcConfig.class);//将配置注册到容器中 return ctx; }
- 
getServletMappings:设定那些请求归springmvc处理 
2.bean的加载控制
因为功能不同,如何避免Spring错误的加载到S平日那个MVC的bean?
A:加载Spring控制的bean的时候,排除掉SpringMVC控制的bean
方式一:设定扫描范围为com.zkw,排除掉controller包内的bean
@Configuration
@ComponentScan({"com.zkw.service","com.zkw.dao"})
public class SpringConfig{
}方式二:设定扫描范围为精准范围,如service包、dao包等
@Configuration
@ComponentScan(value="com.zkw",
               excludeFilters = @ComponentScan.Filter
               type = FilterType.ANNOTATION,//排除方法
               classes = Controller.class
              )
public class SpringConfig{
}简化开发
public class ServletContainersInitConfig extend AbstractAnnotationConfigDispatcherServeletInitializer{
    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{SpringMvcConfig.class};
    }
    protected String[] getServletMappings(){
        return new String[]{"/"};
    }
    protected Class<?>[] getRootConfigClasses(){
        return new Class[0];
    }
}3.请求与响应
1.请求映射路
@Controller
@RequestMapping("/user")
public class UserController {
    @RequestMapping("/save")
    @ResponseBody
    public String save(){
        System.out.println("user save ...");
        return "{'module':'user save'}";
    }
    @RequestMapping("/delete")
    @ResponseBody
    public String delete(){
        System.out.println("user delete ...");
        return "{'module':'user delete'}";
    }
}2.参数传递
Get请求传参
普通参数:url地址传参
public class UserController {
    @RequestMapping("/commonParam")
    @ResponseBody
    public String commonParam(String name){
        System.out.println("普通参数传递 name==>" + name);
        return "{'module':'common param'}";
    }
}Post请求传参
传参汉字会出现乱码问题,添加字符过滤器
//乱码处理
@Override
protected Filter[] getServletFilters() {
    CharacterEncodingFilter filter = new CharacterEncodingFilter();
    filter.setEncoding("UTF-8");
    return new Filter[]{filter};
}普通参数:请求参数名与形参名不同
public class UserController {
    @RequestMapping("/commonParam")
    @ResponseBody
    public String commonParam(@RequestParam("name") String userName){
        System.out.println("普通参数传递 name ==>" + userName);
        return "{'module':'common param'}";
    }
}集合参数
public class UserController {
    @RequestMapping("/listParam")
    @ResponseBody
    public String commonParam(@RequestParam List<String> likes){
        System.out.println("集合参数传递 likes ==>" + likes);
        return "{'module':'list param'}";
    }
}传递json数据
- 
导入JSON坐标 <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.9.0</version> </dependency>
- 
@EnableWebMvc:开启自动转换json对象的支持 
- 
集合参数:json格式 在方法体里不在RequestParam中 public String listParamForJson(@RequestBody List<String> likes) { System.out.println("list common(json)参数传递 list ==>" + likes); return "{'module':'list common for json param'}"; }
POJO参数:JSON格式
{
  "name":"itcast",
  "age";"15"
}@RequestBody和@RequestParam区别
- 
区别: - 
@RequestParam用于接收url地址传参,表单传参 
- 
@RequestBody用于接收json数据 
 
- 
- 
应用 - 
后期开发中,发送json格式数据为主,@RequestBody应用较广 
- 
如果发送非json格式数据,选用@RequestParam接收请求参数 
 
- 
日期类型参数传递
接收形参时,根据不同的日期格式设置不同的接收方式
@RequestMapping("/dataParam")
@ResponseBody
public String dataParam(Date date,
                        @DateTimeFormat(pattern="yyyy-MM-dd")Date date1,
                        @DateTimeFormat(pattern="yyyy/MM/dd HH:mm:ss")Date date2){
    System.out.println(...);
    System.out.println(...);
    System.out.println(...);
    return "{'module':'data param'}";
                        }3.响应
- 
响应页面 @RequestMapping("/toPage") public String toPage(){ return "page.jsp"; }
- 
响应文本数据 @RequestMapping("/toPage") @ResponseBody public String toPage(){ return "page.jsp"; }
- 
响应json数据 @RequestMapping("/toJsonPOJO") @ResponseBody public String toJsonPOJO(){ User user = new User(); user.setName("赵云"); user.setAge(41); return user; }
- 
响应json数据,集合 @RequestMapping("/toJsonPOJO") @ResponseBody public String toJsonPOJO(){ User user = new User(); user.setName("赵云"); user.setAge(41); return user; User user2 = new User(); user2.setName("神赵云"); user2.setAge(40); List<User> userList = new ArrayList<User>(); userList.add(user1); userList.add(user2); return userList; }
4.REST风格
REST(Representational State Transfer),表现形式状态转换
可以隐藏资源的访问行为,无法通过地址得知对资源是何种操作
- 
设置http请求动作(RequestMethod) public class UserController { @RequestMapping(value = "/users",method = RequestMethod.POST) @ResponseBody public String save(){ System.out.println("user save ..."); return "{'module':'user save'}"; } @RequestMapping(value = "/users",method = RequestMethod.PUT) @ResponseBody public String update(){ System.out.println("user update ..."); return "{'module':'user update'}"; } @RequestMapping(value = "/users",method = RequestMethod.GET) @ResponseBody public String getAll(){ System.out.println("user getAll ..."); return "{'module':'user getAll'}"; } }
- 
设定请求参数("/users/{id}" 和 @PathVariable) @RequestMapping(value = "/users/{id}",method = RequestMethod.DELETE) @ResponseBody public String delete(@PathVariable Integer id){ System.out.println("user delete ..." + id); return "{'module':'user delete'}"; } @RequestMapping(value = "/users/{id}",method = RequestMethod.GET) @ResponseBody public String getById(@PathVariable Integer id){ System.out.println("user getById ..."); return "{'module':'user getById'}";
@PathVariable
用于接收路径参数,使用{参数名称}描述路劲参数
RESTful快速开发
@RestController
@RequestMapping("/books")
public class UserController {
    @PostMapping
    public String save(){
        System.out.println("user save ...");
        return "{'module':'user save'}";
    }
    @PutMapping
    public String update(){
        System.out.println("user update ...");
        return "{'module':'user update'}";
    }
    @DeleteMapping
    public String delete(@PathVariable Integer id){
        System.out.println("user delete ..." + id);
        return "{'module':'user delete'}";
    }
    @GetMapping
    public String getById(@PathVariable Integer id){
        System.out.println("user getById ...");
        return "{'module':'user getById'}";
    }
    @GetMapping
    public String getAll(){
        System.out.println("user getAll ...");
        return "{'module':'user getAll'}";
    }
}@RestController:@Controller和@ResponseBody两个注解组合功能