week16_day02_SpringMVC03

回顾昨天的一个知识点:

为什么servlet-api的scope是provided呢?
servlet-api这些类要给程序编译的时候提供字节码文件,而Tomcat服务器中提供了这些类,如果scope不是provided,就会发生一些冲突。


SpringMVC不包括的converter

基本数据类型和包装类如int、Boolean这些,SpringMVC内置的converter都能转换的了。但有些参数类型converter不能提供类型转换,那么就需要我们自己写转换器。

converter负责请求参数的类型转换
比如Date :2020-07-21,前端输入的是以String形式提交的,但后端想以Date的类型进行接收。

  1. 首先写一个自定义converter
    由String转换成 形参中(或javabean成员变量)接收的数据类型
    week16_day02_SpringMVC03_第1张图片

  2. 配置(稍微要繁琐一些)
    converters是Set类型。
    week16_day02_SpringMVC03_第2张图片

  3. 测试
    week16_day02_SpringMVC03_第3张图片

  4. 补充
    若使用日期,SpringMVC不能够直接转换date,但是可以通过指定date日期的格式来转换
    week16_day02_SpringMVC03_第4张图片
    附录:
    util标签(了解即可)
    需要引入schema
    week16_day02_SpringMVC03_第5张图片
    week16_day02_SpringMVC03_第6张图片


看一下SpringMVC给我们提供的converters
从容器中取出conversionService组件,用debug看:
week16_day02_SpringMVC03_第7张图片


其他格式应当怎么接收呢?

  1. File
    使用springmvc有没有什么方便的形式来接收File文件呢?
    有,File可以直接在形参中接收

a. 导包
commons-io、commons-fileupload

导入commons-fileupload包的同时也导入了commons-io了。
week16_day02_SpringMVC03_第8张图片

b. 注册组件(multipartResolver)
在这里插入图片描述
c. 构建一个文件上传的请求 form
文件上传要求得有这句代码:enc-type=“multipart/form-data” method=post
week16_day02_SpringMVC03_第9张图片
d. 接收文件的数组(批量上传)
week16_day02_SpringMVC03_第10张图片


cookie和session

  1. 通过request来获得
    cookie
    在浏览器页面可以这样做来手动增加cookie。
    week16_day02_SpringMVC03_第11张图片
    代码及运行结果:
    week16_day02_SpringMVC03_第12张图片
    session
    week16_day02_SpringMVC03_第13张图片
  2. HttpSession直接写到形参中
    week16_day02_SpringMVC03_第14张图片

Json数据作为形参(非常重要)
要在handler方法中接收json

  1. 导包
    jackson-databind

  2. @RequestBody
    要想接收json数据,请求方法必须是post请求。

week16_day02_SpringMVC03_第15张图片
利用postman来发送json请求:
week16_day02_SpringMVC03_第16张图片

也可以通过map获得对象:
week16_day02_SpringMVC03_第17张图片
同一个url映射到不同的handler方法上
通过限制请求方法
Post请求,接收json
注意图中的请求方法,一个是get一个是post。
week16_day02_SpringMVC03_第18张图片


RestFul

REST,即Representational State Transfer,表述性状态传递
通过发送http请求 → 获得请求过程中的值作为请求参数
RestFul → 返回值为json → @ResponseBody 或 @RestController

  1. @PathVariable(最常用)
    拿到请求url中的一部分作为请求参数
    比如在CSDN中两篇文章的URL:
    在这里插入图片描述
    让我们写接口 article/detail?user=shenjian58&articleId=10741154
    需要告诉形参它接收的值是请求url中的哪一个占位符,就在形参前面加@PathVariable(“userz”)和@PathVariable(“articleIda”)。
    week16_day02_SpringMVC03_第19张图片
    测试
    week16_day02_SpringMVC03_第20张图片
    week16_day02_SpringMVC03_第21张图片

UserService:

package com.cskaoyan.service;

import com.cskaoyan.bean.User;

public interface UserService {
     

    User queryUserById(Integer id);
}

UserServiceImpl:

package com.cskaoyan.service;

import com.cskaoyan.bean.User;
import org.springframework.stereotype.Service;

@Service
public class UserServiceImpl implements UserService{
     
    @Override
    public User queryUserById(Integer id) {
     
        User user = new User();
        if (id == 1){
     
            user.setUsername("songge");
            user.setPassword("niupi");
        }else {
     
            user.setUsername("ligenli");
            user.setPassword("daqif");
        }
        return user;
    }
}

改进版的BaseRespVo,对原BaseRespVo进行了解耦操作,这是非常常用的json返回值格式:

package com.cskaoyan.bean;

import lombok.Data;

/**
 * Vo viewObject
 * @param 
 * 这是前后端分离,json数据一个常用的格式
 */
@Data
public class BaseRespVo<T> {
     
    T data;
    String msg;//告诉前端请求的消息
    long errno;//自己的前后端应用 : 自定义的状态码 → 通常前端根据该状态码做不同的处理

    public static BaseRespVo ok(){
     
        BaseRespVo<Object> baseRespVo = new BaseRespVo<>();
        baseRespVo.setErrno(0);
        baseRespVo.setMsg("成功");
        return baseRespVo;
    }
    public static BaseRespVo ok(Object data){
     
        BaseRespVo<Object> baseRespVo = new BaseRespVo<>();
        baseRespVo.setData(data);
        baseRespVo.setErrno(0);
        baseRespVo.setMsg("成功");
        return baseRespVo;
    }
    public static BaseRespVo ok(Object data,String msg){
     
        BaseRespVo<Object> baseRespVo = new BaseRespVo<>();
        baseRespVo.setData(data);
        baseRespVo.setErrno(0);
        baseRespVo.setMsg(msg);
        return baseRespVo;
    }
    public static BaseRespVo fail(){
     
        BaseRespVo<Object> baseRespVo = new BaseRespVo<>();
        baseRespVo.setErrno(500);
        baseRespVo.setMsg("失败");
        return baseRespVo;
    }
    public static BaseRespVo fail(String msg){
     
        BaseRespVo<Object> baseRespVo = new BaseRespVo<>();
        baseRespVo.setErrno(500);
        baseRespVo.setMsg(msg);
        return baseRespVo;
    }
}

对既有代码做改造:
week16_day02_SpringMVC03_第22张图片


  1. @RequestParam(很少使用)
    拿到请求参数作为handler方法形参

之前要求请求参数名和handler方法的形参名是一致的。
login?username=songge&password=niu
login(String username,String password)
增加了这个注解后请求参数名和handler方法的形参名可以不一致。
week16_day02_SpringMVC03_第23张图片


  1. @RequestHeader
    拿到请求头中的值作为请求参数
    Request header中的值我们都可以拿得到。
    week16_day02_SpringMVC03_第24张图片

@CookieValue
联系上文的cookie和session一起看
@CookieValue(“songge”) String value拿到key=songge对应cookie的值
week16_day02_SpringMVC03_第25张图片
@SessionAttribute
联系上面cookie和session一起看
@SessionAttribute(“username”)String username拿到key=username对应session的值
week16_day02_SpringMVC03_第26张图片


静态资源处理
week16_day02_SpringMVC03_第27张图片

  1. 默认的servlet
    访问静态资源的请求不经过DispatcherServlet处理,而是由默认的servlet进行处理。
    week16_day02_SpringMVC03_第28张图片
    web.xml中加这这两段代码,就能处理.jpg和.png文件。
    week16_day02_SpringMVC03_第29张图片

  2. 默认的servlet对应的handler
    week16_day02_SpringMVC03_第30张图片
    在application.xml中增加这一行代码:
    在这里插入图片描述

  3. 静态资源映射(SpringMVC建议大家使用)
    请求url和静态资源所处的路径建立映射关系
    通过请求url可以访问到对应路径的静态资源

开发软件 最终是要部署到服务器,打包成war包,新增的图片和一些资源就不能放到war包中了,得放到文件路径。
前面这两种方式都是放到编译路径target/day08_demo5_static-resource-1.0-SNAPSHOT下了。
week16_day02_SpringMVC03_第31张图片

静态资源映射路径:
1、classpath(java和resources → 打包后war里WEB-INF/classes)
week16_day02_SpringMVC03_第32张图片
2、web根路径(webapp → 打包后的根目录)
3、纯文件系统的映射
这些代码全部写在application.xml文件中。
week16_day02_SpringMVC03_第33张图片


异常处理

  1. 统一的异常处理器(只能处理ModelAndView)
    发生了异常都进入到该处理中处理

首先注册组件:
week16_day02_SpringMVC03_第34张图片
week16_day02_SpringMVC03_第35张图片
通过异常类型的判断也可以处理不同的异常
week16_day02_SpringMVC03_第36张图片


  1. 针对异常handler处理(推荐)

通过handler来处理指定异常 → ModelAndView和json都能处理 → 更精细的异常处理
handler仍然是以方法的形式存在 → ControllerAdvice组件中
week16_day02_SpringMVC03_第37张图片


作业: 昨天的注册页面需要做些事儿
1、验证码图片能够回显(img标签的src中的图片路径能够访问 → 静态资源映射),提交按钮中的图片也要能回显
2、注册页面中的所有参数使用springmvc框架获取请求参数(请求参数不用封装json,大家写表单封装)
3、响应值返回一个user,响应为json数据

代码见Homework08

先访问http://localhost:8080/register.jsp,选择上传的图片,然后点击提交,就会跳转到http://localhost:8080/register2,显示上传的图片。

你可能感兴趣的:(Spring)