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两个注解组合功能

相关推荐
Cloud-Future21 小时前
Spring MVC 处理请求的流程
java·spring·mvc
optimistic_chen3 天前
【Java EE进阶 --- SpringBoot】Spring IoC
spring boot·后端·spring·java-ee·mvc·loc
wuk9983 天前
在Spring MVC中使用查询字符串与参数
java·spring·mvc
原来是好奇心4 天前
深入剖析Spring Boot中Spring MVC的请求处理流程
spring boot·spring·mvc
xkroy4 天前
创建Spring MVC和注解
学习·spring·mvc
期待のcode4 天前
SpringMVC的请求接收与结果响应
java·后端·spring·mvc
Pure03194 天前
Spring MVC BOOT 中体现的设计模式
spring·设计模式·mvc
The Sheep 20235 天前
.NetCore MVC
mvc·.netcore
YDS8295 天前
SpringMVC —— Spring集成web环境和SpringMVC快速入门
java·spring·mvc·springmvc
xkroy5 天前
Sping Web MVC入门
mvc