Bootstrap

SpringMVC-Day1

SpringMVC

1.SpringMVC介绍

springMVC是一种基于Java实现MVC模型的轻量级Web框架

优点:

  • 使用简单,开发便捷(相较于Servelt)

  • 灵活性强

使用SpringMVC技术开发web程序流程

  1. 创建web工程(Maven结构)

  2. 设置tomcat服务器,加载web工程(tomcat插件)

  3. 导入坐标(SpringMVC+Servlet)

  4. 定义处理请求的功能类(UserController)

  5. 设置请求映射(配置映射关系)

  6. 将SpringMVC设定加载到Tomcat容器中

SpringMVC入门案例

  1. 导入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>
  2. 初始化SpringMVC环境

    @Configuration
    public class SpringMvcConfig {
    }
  3. 创建SpringMVC控制器类(等同于Servlet功能)

    @Controller
    public class UserController {
        @RequestMapping("/save")
        @ResponseBody
        public String save(){
            System.out.println("user save ...");
            return "{'info':'springmvc'}";
        }
    }
  4. 设定SpringMVC加载对应的bean

    @Configuration
    @ComponentScan("com.zkw.controller")
    public class SpringMvcConfig {
    }
  5. 初始化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;
        }
    }

部分代码介绍:

  1. @RequestMapping:设置当前控制器方法请求访问路径

  2. @ResponseBody:设置当前控制器方法响应内容为当前返回值,无需解析

  3. createServletApplicationContext

    protected WebApplicationContext createServletApplicationContext()//加载容器 {
            AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();//初始化容器对象
            ctx.register(SpringMvcConfig.class);//将配置注册到容器中
            return ctx;
        }
  4. 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数据

  1. 导入JSON坐标

    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.9.0</version>
    </dependency>
  2. @EnableWebMvc:开启自动转换json对象的支持

  3. 集合参数: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),表现形式状态转换

可以隐藏资源的访问行为,无法通过地址得知对资源是何种操作

  1. 设置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'}";
        }
    }
  2. 设定请求参数("/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两个注解组合功能

;