SpringMVC

SpringMVC

SpringMVC简介

  • SpringMVC技术与Servlet技术功能相同 , 均属于web层开发技术 ( 更为简单 )

SpringMVC 配置方法

  1. 导入坐标 , SpringMVC 和 servlet

      <dependencies>
        <!--1.导入坐标 , SpringMVC 和 servlet-->
        <dependency>
          <groupId>javax.servlet</groupId>
          <artifactId>javax.servlet-api</artifactId>
          <version>3.1.0</version>
          <scope>provided</scope>
        </dependency>
    
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-webmvc</artifactId>
          <version>5.2.10.RELEASE</version>
        </dependency>
      </dependencies>
    
    
      <build>
        <plugins>
          <!-- tomcat插件控制 -->
          <plugin>
            <groupId>org.apache.tomcat.maven</groupId>
            <artifactId>tomcat7-maven-plugin</artifactId>
            <version>2.1</version>
            <configuration>
              <!--端口控制-->
              <port>8080</port>
              <!--项目路径控制意味着http://localhost:8080/-->
              <path>/</path>
              <!--编码-->
              <uriEncoding>UTF-8</uriEncoding>
            </configuration>
          </plugin>
        </plugins>
      </build>
    
  2. 定义Controller

    //2.定义Controller
    //2.1 使用 @Controller 定义bean
    @Controller
    public class UserController {
    
        //2.2 设置当前方法的访问路径
        @RequestMapping("/save")
        //2.3 设置当前操作的返回值的类型
        @ResponseBody
        public String save() {
            System.out.println("user save ...");
            return "{'module','SpringMVC'}";
        }
    }
    
  3. 创建 springmvc 的配置文件 , 加载controller对应的bean

    //3. 创建 springmvc 的配置文件 , 加载controller对应的bean
    @Configuration                          //设置为配置类
    @ComponentScan("com.lyx.controller")    //扫描包中配置的bean
    public class SpringMvcConfig {
    }
    
  4. 定义一个servlet容器启动的配置类, 在里面加载spring的配置

    //4. 定义一个servlet容器启动的配置类, 在里面加载spring的配置
    public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {
        //加载springmvc容器配置
        @Override
        protected WebApplicationContext createServletApplicationContext() {
            AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
            ctx.register(SpringMvcConfig.class);
            return ctx;  //改成返回ctx
        }
    
        //设置哪些请求归属springMVC处理
        @Override
        protected String[] getServletMappings() {
            return new String[]{"/"}; //所有请求都归springmvc处理
        }
    
        //加载spring容器配置
        @Override
        protected WebApplicationContext createRootApplicationContext() {
            return null;
        }
    }
    

在这里插入图片描述

SpringMVC - bean加载控制

因为功能不同, 避免Spring错误加载到SpringMVC的bean ( 加载Spring控制的bean的时候排除掉SpringMVC控制的bean )

Controller加载控制与业务bean加载控制

  • SpringMVC相关bean ( 表现层bean )

  • Spring控制bean

    • 业务bean ( Service )

    • 功能bean ( DataSource等 )

  • SpringMVC相关bean加载控制

    • SpringMVC加载的bean对应的包均在com.lyx.controller包内
  • Spring相关bean加载控制

    • 方式一: Spring加载的bean设定扫描范围为精准范围, 例如service包, dao包等

    • 方式二: Spring加载的bean设定扫描范围为com.lyx, 排除controller包内的bean

    • 方式三: 不区分Spring与SpringMVC的环境, 加载到同一环境中

方式一
@Configuration
@ComponentScan({"com.lyx.dao","com.lyx.service"})
public class SpringConfig {
}
方式二
@Configuration
@ComponentScan(value = "com.lyx",
        excludeFilters = @ComponentScan.Filter(     //排除
                type = FilterType.ANNOTATION,       //按注解排除
                classes = Controller.class          //排除掉使用COntroller注解的bean
        )
)
public class SpringConfig {
}

请求与响应

设置请求映射路径

在Controller包中的文件创建根目录, 避免因重名阐述报错

@Controller
@RequestMapping("/user")         //根目录
public class UserController {
    @RequestMapping("/save")
    @ResponseBody
    public String save(){
        System.out.println("user save ...");
        return "{'moudle':'user save'}";
    }

    @RequestMapping("/delete")
    @ResponseBody
    public String delete(){
        System.out.println("user delete ...");
        return "{'moudle':'user delete'}";
    }
}

请求方式

Get请求
    @RequestMapping("/save")
    @ResponseBody
    public String save(String name,int age){
        System.out.println("book save ...");
        System.out.println("name -->"+ name);
        System.out.println("age -->"+ age);
        return "{'moudle':'book save'}";
    }

添加参数 name age
在这里插入图片描述

Post请求

代码修改与get请求一致, Spring整合了get请求和post请求
在这里插入图片描述

SpringMVC解决Post请求中文乱码问题 ( 添加过滤器 )

但是请求中不能处理中文,所以添加过滤器 ( Filter )

重写servlet容器启动的配置类中的 getServletFilters() 方法

public class SercletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[0];
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{SpringMvcConfig.class};
    }

    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }

    //中文乱码处理
    @Override
    protected Filter[] getServletFilters() {
        CharacterEncodingFilter filter = new CharacterEncodingFilter();     //字符过滤器
        filter.setEncoding("UTF-8");
        return new Filter[]{filter};
    }
}

5种参数类型的传递

    //普通数据类型
    @RequestMapping("/commonparam")
    @ResponseBody
    public String commonParam(@RequestParam("user") String username,int age){ 
        //@RequestParam给数据取别名
        System.out.println("name ==>"+ username);
        System.out.println("age ==>"+ age);
        return "{'modle':'common param'}";
    }

    //POJO参数
    @RequestMapping("/pojoParam")
    @ResponseBody
    public String pojoParam(User user){
        System.out.println("user ==>"+ user);
        return "{'modle':'pojo param'}";
    }

    //嵌套POJO参数
    @RequestMapping("/pojoContainPojo")
    @ResponseBody
    public String pojoContaainPojo(User user){
        System.out.println("user ==>"+ user);
        return "{'modle':'pojo param'}";
    }

    //数组参数
    @RequestMapping("/arrayParam")
    @ResponseBody
    public String arrayParam(String[] likes){
        System.out.println("数组参数传递likes ==>"+ Arrays.toString(likes));
        return "{'modle':'array param'}";
    }

    //集合参数
    @RequestMapping("/listParam")
    @ResponseBody
    public String listParam(@RequestParam List<String> likes){      //将值作为参数写入集合
        System.out.println("likes ==>"+ likes);
        return "{'modle':'list param'}";
    }

在这里插入图片描述

json数据传递参数

  1. 导入json坐标

        <dependency>
          <groupId>com.fasterxml.jackson.core</groupId>
          <artifactId>jackson-databind</artifactId>
          <version>2.9.0</version>
        </dependency>
    
  2. 在Spring配置文件中添加 @EnableWebMvc (开启json对象转化为数据的功能)

    @Configuration
    @ComponentScan("com.lyx.controller")
    @EnableWebMvc       //开启json对象转化为数据的功能
    public class SpringMvcConfig {
    }
    
  3. 在参数前添加@RequestBody

        //数组参数
        @RequestMapping("/arrayParam")
        @ResponseBody     //@ResponseBody的作用其实是将java对象转为json格式的数据
        public String arrayParam(@RequestBody String[] likes){              //在参数前添加@RequestBody
            System.out.println("数组参数传递likes ==>"+ Arrays.toString(likes));
            return "{'modle':'array param'}";
        }
    

日期类型参数传递

普通时间类型格式不用转换 ( yyyy/MM/dd ) , 如其他格式需要转换, Spring的配置类需加上@EnableWebMvc

@EnableWebMvc : 根据数据类型匹配对应的转换器

@Controller
public class UserController {
    @RequestMapping("/dateParam")
    @ResponseBody
    public String dateParam(Date date,
                            @DateTimeFormat(pattern = "yyyy-MM-dd") Date date1,
                            @DateTimeFormat(pattern = "yyyy/MM/dd HH:mm:ss") Date date2){
        System.out.println("参数传递date ==>" + date);
        System.out.println("参数传递date1 ==>" + date1);
        System.out.println("参数传递date2 ==>" + date2);
        return "{'module':'data param'}";
    }
}

@DateTimeFormat用于Date的格式转换 pattern 属性中写明输入的date格式

响应

@EnableWebMvc : 开启json对象转化为数据的功能 (有转换一定要打开)

  1. 响应页面

        //跳转页面
        @RequestMapping("/toJumpPage")
        public String toJumpPage(){
            System.out.println("页面跳转");
            return "index.jsp";
        }
    
  2. 响应数据

    • 文本数据

          //返回字符串
          @RequestMapping("/toText")
          @ResponseBody
          public String toText(){
              System.out.println("返回文本");
              return "to text";
          }
      
    • Json数据

          //响应POJO对象
          @RequestMapping("/toJsonPOJO")
          @ResponseBody
          public User toJsonPOJO(){
              System.out.println("返回POJO对象数据");
              User user = new User();
              user.setName("lyx");
              user.setAge(22);
              return user;
          }
      
          //响应POJO集合对象
          @RequestMapping("/toJsonList")
          @ResponseBody
          public List<User> toJsonList(){
              System.out.println("返回JSON数据集合");
              User user1 = new User();
              user1.setName("小明");
              user1.setAge(17);
      
              User user2 = new User();
              user2.setName("小刚");
              user2.setAge(18);
      
              List<User> userList = new ArrayList<>();
              userList.add(user1);
              userList.add(user2);
              return userList;
          }
      

响应POJO集合对象时, 对象里一定要写get方法

public class User {
    private String name;
    private int age;

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }
}

REST风格

表现形式状态转换

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

  2. 书写简化

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值