SpringMVC

SpringMVC简介

SpringMVC技术与Servlet技术功能等同,均属于web层开发技术

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

优点:

使用简单,开发便捷(相比于Servlet)

灵活性强

SpringMVC入门案例

1:使用SpringMVC技术需要先导入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>

2:创建SpringMVC控制器类(等同于Servlet功能)

//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环境(同Spring环境),设定SpringMVC加载对应的bean

//3.创建springmvc的配置文件,加载controller对应的bean
@Configuration
@ComponentScan("com.lh.controller")
public class SpringMvcConfig {
}

4:初始化Servlet容器,加载SpringMVC环境,并设置SpringMVC技术处理的请求

//4.定义一个servlet容器启动的配置类,在里面加载spring的配置
public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {
    //加载springMVC容器配置
    @Override
    protected WebApplicationContext createServletApplicationContext() {
        AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
        ctx.register(SpringMvcConfig.class);
        return ctx;
    }

    //设置哪些请求归属springMVC处理
    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }

    //加载spring容器配置
    @Override
    protected WebApplicationContext createRootApplicationContext() {
        return null;
    }
}

总结:

一次性工作:创建工程,设置服务器,加载工程

                      导入坐标

                      创建web容器启动类,加载SpringNVC配置,并设置SpringMVC请求拦截路径

                      SpringMVC核心配置类(设置配置类,扫描controller包,加载Controller控制器bean)

多次工作:定义处理请求的控制器类

                 定义处理请求的控制器方法,并配置映射路径(@RequestMapping)与返回json数据(@ResponseBody)

入门案例工作流程分析

启动服务器初始化过程:

1:服务器启动,执行ServletContainersInitConfig类,初始化web容器

2:执行createServletApplicationContext方法,创建了webApplicationContext对象

3:加载SpringMvcConfig

4:执行@ComponentScan加载对应的bean

5:加载UserController,每个@RequestMapping的名称对应一个具体的方法

6:执行getServletMappings方法,定义所有的请求都通过SpringMVC

单次请求过程:

1:发送请求localhost/save

2:web容器发现所有请求都经过SpringMVC,将请求交给SpringMVC处理

3:解析请求路径/save

4:由/save匹配执行对应的方法save()

5:执行save()

6:检测到有@ResponseBody直接将save()方法的返回值作为响应求体返回给请求方

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

SpringMVC相关bean(表现层bean)

Spring控制的bean:业务bean(Service)、功能bean(DataSource等)

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

SpringMVC相关bean加载控制:加载的对应的bean均在com.lh.controller包内

Spring相关bean加载控制:

方式一:Spring加载的bean设定扫描范围为com.lh,排除掉controller包内的bean

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

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

PostMan简介

Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件

作用:常用于进行接口测试

请求与响应

请求

请求路径

团队多人开发,每人设置不同的请求路径,冲突问题如何解决——设置模块名作为请求路径前缀

@RequestMapping:设置当前控制器方法请求访问路径,如果设置在类上统一设置当前控制器方法请求访问路径前缀

@Controller
@RequestMapping("user")
public class UserController {

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

请求参数

普通参数:url地址传参,地址参数名与形参变量名相同,定义参数即可接受参数

@Controller
public class UserController {
    //普通参数
    @RequestMapping("/commonParam")
    @ResponseBody
    public String commonParam(String name,int age){
        System.out.println("普通参数传递 name ==> "+ name);
        System.out.println("普通参数传递 age ==> "+ age);
        return "{'module':'common param'}";
    }
} 

 为web容器添加过滤器并指定字符集,Spring-web包中提供了专用的字符过滤器

//配字符编码过滤器
    protected Filter[] getServletFilter(){
        CharacterEncodingFilter filter = new CharacterEncodingFilter();
        filter.setEncoding("UTF-8");
        return new Filter[]{(Filter) filter};
    }

普通参数:请求参数名与形参名不同

//普通参数:请求参数名与形参名不同
    @RequestMapping("/commonParamDifferentName")
    @ResponseBody
    public String commonParamDifferentName(@RequestParam("name") String username, int age){
        System.out.println("普通参数传递 name ==> "+ username);
        System.out.println("普通参数传递 age ==> "+ age);
        return "{'module':'common param different name'}";
    }

Pojo参数

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

嵌套Pojo参数:pojo对象中包含Pojo对象

//嵌套POJO参数
    @RequestMapping("/pojoContainPojoParam")
    @ResponseBody
    public String pojoContainPojoParam(User user){
        System.out.println("pojo嵌套参数传递 user ==> "+ user);
        return "{'module':'pojo contain pojo param'}";
    }

数组参数:请求参数名与形参对象属性名相同且请求参数为多个,定义数组类型形参即可接受参数

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

集合参数

//集合参数
    @RequestMapping("/listParam")
    @ResponseBody
    public String listParam(@RequestParam List<String> likes){
        System.out.println("数组参数传递 likes ==> "+ likes);
        return "{'module':'list  param'}";
    }

日期类型参数传递:

@DateTimeFormat:设定日期时间型数据格式

请求参数(传递json数据)

1:添加json数据转换相关坐标

2:设置发送json数据(请求body中添加json数据)

3:开启自动转换json数据的支持(@EnableWebMvc)(开启SpringMVC配置类定义上方)

4:设置接受json数据(@RequestBody)(将请求中请求体所包含的数据传递给请求参数)

@RequestBody与@RequestParam区别:

@RequestParam用于接受url地址传参,表单传参

@RequestBody用于接受json数据

响应

@ResponseBody:设置当前控制器返回值作为响应体

REST风格

REST风格简介

REST,表现形式状态转换

优点:隐藏资源的访问行为,无法通过地址得到对资源是何种操作

           书写简化

按照REST风格访问资源时使用行为动作区分对资源进行了何种操作

根据REST风格对资源进行访问称为RESTful

RESTful入门案例

1:设定http请求动作(动词)

2:设定请求参数(路径变量)

例如:

@RequestMapping(value = "/users/{id}",method = RequestMethod.DELETE)
    @ResponseBody
    public String delete(@PathVariable Integer id){
        System.out.println("user delete ..." + id);
        return "{'module':'user delete'}";
    }

@PathVariable用于接受路径参数,使用(参数名称)描述路径参数

RESTful快速开发

@RestController等同于@Controller与@ResponseBody两个注解组合功能

@GetMapping  @PostMapping @PutMapping @DeleteMapping

基于RESTful页面数据交互

1:制作SpringMVC控制器,并通过PostMan测试接口功能

2:设置对静态资源的访问放行

3:前端页面通过异步提交访问后台控制器

SSM整合

SSM整合流程

1:创建工程

2:SSM整合

     Spring:SpringConfig

     MyBatis:MyBatisConfig,jdbcConfig,jdbc.properties

     SpringMVC:ServletConfig,SpringMvcConfig

3:功能模块

表与实体类

dao(接口+自动代理)

service(接口+实现类)

     业务层接口测试(整合JUnit)

controller

     表现层接口测试(PostMan)

表现层数据封装

前端接受数据格式

前端接受数据格式——创建结果模型类,封装数据到data属性中

前端接受数据格式——封装操作结果到code属性中(设置统一数据返回结果编码)

前端接受数据格式——封装特殊消息到message(msg)属性中

设置统一数据返回结果类

public class Result{
      private Object data;
      private Integer code;
      private String msg;
}

Result类中的字段并不是固定的,可以根据自行增减

异常处理器

出现异常现象的常见位置与常见诱因如下:
框架内部抛出的异常:因使用不合规导致

数据层抛出的异常:因外部服务器故障导致(例如:服务器访问超时)

业务层抛出的异常:因业务逻辑书写错误导致(例如:遍历业务书写操作,导致索引异常等)

表现层抛出的异常:因数据收集、校验等规则导致(例如:不匹配的数据类型间导致异常)

工具类抛出的异常:因工具类书写不严谨不够剪床导致(例如:必要释放的连接长期未释放等)

各个层级均出现异常,异常处理代码书写在哪一层——所有的异常均抛出到表现层进行处理,AOP思想

项目异常处理

1:自定义项目系统级异常

2:自定义项目业务级异常

3:自定义异常编码(持续补充)

4:触发自定义异常

5:拦截并处理异常

6:异常处理器效果对比

拦截器

拦截器概念

拦截器是一种动态拦截方法调用的机制,再SpringMVC中动态拦截控制器方法的执行

作用:
在指定方法调用前后执行预先设定的代码

阻止原始方法的执行

拦截器与过滤器区别:

归属不同:Filter数据Servlet技术,Interceptor属于SpringMVC技术

拦截内容不同:Filter对所有访问进行增强,Interceptor仅针对SpringNVC的访问进行增强

拦截器入门案例

1:声明拦截器的bean,并实现HandlerInterceptor接口(注意:扫描加载bean)

2:定义配置类,继承WebMvcConfigurationSupport,实现addInterceptor方法(注意:扫描加载配置)

3:添加拦截器并设定拦截的访问路径,路径可以通过可变参数设置多个

4:使用标准接口WebMvcConfigurer简化开发(注意:侵入式较强)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值