SpringMVC

SpringMVC快速入门

1. 开发步骤

  1. 导入SpringMVC相关坐标
  2. 配置SpringMVC核心控制器DispatherServlet
  3. 创建Controller类和视图页面
  4. 使用注解配置Controller类中业务方法的映射地址
  5. 配置SpringMVC核心文件spring-mvc.xml
  6. 客户端发起请求测试

2. 代码实现

项目结构:

image-20210203164021389

web.xml:

image-20210203164124686

spring-mvc.xml(开启组件扫描才可以使用注解):

image-20210203164144655

UserController:

image-20210203164217400

2. springmvc流程图

image-20210203165027697

注:

  1. load-on-startup 元素标记容器是否应该在web应用程序启动的时候就加载这个servlet,(实例化并调用其init()方法)。
  2. 它的值必须是一个整数,表示servlet被加载的先后顺序。
  3. 如果该元素的值为负数或者没有设置,则容器会当Servlet被请求时再加载。
  4. 如果值为正整数或者0时,表示容器在应用启动时就加载并初始化这个servlet,值越小,servlet的优先级越高,就越先被加载。值相同时,容器就会自己选择顺序来加载。

SpringMVC的组件解析

1. SpringMVC的执行流程

image-20210203165807845

image-20210203165950545

2. SpringMVC注解解析

image-20210203171925478

范例:

image-20210203171336588

image-20210203171535508

image-20210203171911102

image-20210203171955779

3. SpringMVC组件扫描

image-20210203172343593

范例:

image-20210203172358945

4. SpringMVC资源解析器

4.1 视图解析器

image-20210203210104276

源码:

image-20210203205833654

image-20210203205900384

配置文件:

image-20210203205922843

控制器:

image-20210203210008407

注:

image-20210203210648517

5. 知识要点

image-20210203210851697

SpringMVC的数据响应

1. SpringMVC的数据响应方法

  1. 页面跳转

    直接返回字符串

    通过ModelAndView对象返回

  2. 回写数据

    直接返回字符串

    返回对象或集合

2. 页面跳转

2.1 返回字符串形式

直接返回字符串,这种方式会将返回的字符串与视图解析器的前后缀拼接后跳转。

image-20210203212459921

2.2 返回ModelAndView对象

1. 方式1

范例:

image-20210203213559121

image-20210203213612336

image-20210203213622703

2.方法2

image-20210203214644145

3.方法3(不常用)

image-20210203215133983

3. 回写数据

3.1 直接返回字符串

image-20210203220645297

image-20210203220831117

范例:

image-20210203221058532

3.2 直接返回JSON字符串

普通版

image-20210203224558730

进阶版(SpringMVC帮你转成json)

配置文件:

image-20210203225725799

代码:

image-20210203225744542

高级版(注解)

image-20210203230032859

实例

主要是配置文件:

image-20210203230313984

image-20210203230337856

SpringMVC获得请求数据

1. 获得请求参数

image-20210208193122534

1.1 获得基本类型参数

Contoller中的业务方法的参数名称要与请求参数的name一致,参数值会自动映射匹配。

image-20210208201925719

image-20210208202005650

1.2 获得POJO类型参数

Contoller中的业务方法的POJO参数的属性名与请求参数的name一致,参数值会自动映射匹配。

image-20210208202705796

image-20210208202716599

image-20210208202735634

1.3 获得数组类型参数

Controller中的业务方法数组名称与请求参数的name一致,参数值会自动映射匹配。

image-20210208204125302

image-20210208204141729

image-20210208204159883

1.4 获得集合类型参数

1.4.1 普通方式

获得集合参数时,要将集合参数包装到一个POJO中才可以

image-20210208214038673

image-20210208214045274

image-20210208214104971

image-20210208214118269

image-20210208214130458

1.4.2 @RequestBody注解的方式

当使用ajax提交时,可以指定contentType为json形式,那么在方法参数位置使用@RequestBody可以直接接受集合数据而无需使用POJO进行包装

image-20210209101047067

image-20210209101227456

image-20210209101635195

2. 静态资源访问的开启

image-20210209103539979

3. 请求数据乱码问题

当post请求时,数据会出现乱码,我们可以设置一个过滤器来进行编码的过滤

image-20210209110745748

4. 参数绑定注解@RequestParam

当请求的参数名称与Controller的业务方法参数名称不一致时,就需要通过@RequestParam注解显示的绑定

image-20210209112317931

例子:

image-20210209112338352

image-20210209112344475

image-20210209112400384

5. 获得Restful风格的参数

image-20210209131045781

image-20210209131308953

范例:

image-20210210100404896image-20210210100416773

image-20210210100425460

6. 自定义类型转换器

image-20210210100814083

image-20210210103707814

image-20210210103602544

image-20210210103617249

7. 获得servlet相关API

7.1 获得请求头(@RequestHeader)

image-20210210104927002

image-20210210104943740

image-20210210105005462

image-20210210105018526

7.2 获得请求头(@CookieValue)

image-20210210105128495

image-20210210105536793

image-20210210105548607

image-20210210105607800

8. 文件上传

image-20210210110659561

image-20210210123121864

1. 单文件上传

  1. 导坐标

image-20210210134600944

  1. 配置配置文件

image-20210210134617603

  1. 具体代码

前端:

image-20210210134531633

后端:

image-20210210134721602

2. 多文件上传

前端:

image-20210210154743613

后端:

image-20210210154803543

SpringMVC拦截器

1. 拦截器的作用

image-20210210155043665

##2. 拦截器和过滤器区别

image-20210210155127866

3. 拦截器快速入门

自定义拦截器很简单,只有如下三步:

  1. 创建拦截器类实现HandlerInterceptor
  2. 配置拦截器
  3. 测试拦截器的拦截效果

image-20210210232754124

具体代码看spring_mvc下的itheima_spring_interceptor

MyInterceptor1:

package com.itheima.interceptor;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class MyInterceptor1 implements HandlerInterceptor {
    //在目标方法执行之前 执行 返回的是false就后面的都不执行,true才会执行后面的
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws ServletException, IOException {
        System.out.println("preHandle.....");
        String param = request.getParameter("param");
        if("yes".equals(param)){
            return true;
        }else{
            request.getRequestDispatcher("/error.jsp").forward(request,response);
            return false;//返回true代表放行  返回false代表不放行
        }
    }

    //在目标方法执行之后 视图对象返回之前执行
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
        modelAndView.addObject("name","itheima");
        System.out.println("postHandle...");
    }

    //在流程都执行完毕后 执行
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        System.out.println("afterCompletion....");
    }
}

配置文件:

image-20210210233154525

SpringMVC异常处理机制

主要看代码itheima_spring_exception

1. 异常处理的思路

image-20210212153750045

2. 异常处理两种方式

###1. 使用SpringMVC提供的简单异常处理器SimpleMappingExceptionResolver

image-20210212154209312

范例:

配置文件:

image-20210212155125282

###2. 实现Spring的异常处理接口HandlerExceptionResolver自定义自己的异常处理器

步骤

  1. 创建异常处理器类实现HandlerExceptionResolver
package com.itheima.resolver;

import com.itheima.exception.MyException;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MyExceptionResolver implements HandlerExceptionResolver {

    /*
        参数Exception:异常对象
        返回值ModelAndView:跳转到错误视图信息
     */
    public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
        ModelAndView modelAndView = new ModelAndView();

        if(e instanceof MyException){
            modelAndView.addObject("info","自定义异常");
        }else if(e instanceof ClassCastException){
            modelAndView.addObject("info","类转换异常");
        }

        modelAndView.setViewName("error");

        return modelAndView;
    }
}

  1. 配置异常处理器

image-20210212155954075

  1. 编写异常页面

image-20210212160007831

  1. 测试异常跳转

    ModelAndView modelAndView = new ModelAndView();

     if(e instanceof MyException){
         modelAndView.addObject("info","自定义异常");
     }else if(e instanceof ClassCastException){
         modelAndView.addObject("info","类转换异常");
     }
    
     modelAndView.setViewName("error");
    
     return modelAndView;
    

    }
    }


2. 配置异常处理器

[外链图片转存中...(img-9v6UBj85-1614757014910)]

3. 编写异常页面

[外链图片转存中...(img-GV2u6c0J-1614757014912)]



4. 测试异常跳转



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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值