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成员变量)接收的数据类型
    在这里插入图片描述

  2. 配置(稍微要繁琐一些)
    converters是Set类型。
    在这里插入图片描述

  3. 测试
    在这里插入图片描述

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


看一下SpringMVC给我们提供的converters
从容器中取出conversionService组件,用debug看:
在这里插入图片描述


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

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

a. 导包
commons-io、commons-fileupload

导入commons-fileupload包的同时也导入了commons-io了。
在这里插入图片描述

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


cookie和session

  1. 通过request来获得
    cookie
    在浏览器页面可以这样做来手动增加cookie。
    在这里插入图片描述
    代码及运行结果:
    在这里插入图片描述
    session
    在这里插入图片描述
  2. HttpSession直接写到形参中
    在这里插入图片描述

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

  1. 导包
    jackson-databind

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

在这里插入图片描述
利用postman来发送json请求:
在这里插入图片描述

也可以通过map获得对象:
在这里插入图片描述
同一个url映射到不同的handler方法上
通过限制请求方法
Post请求,接收json
注意图中的请求方法,一个是get一个是post。
在这里插入图片描述


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”)。
    在这里插入图片描述
    测试
    在这里插入图片描述
    在这里插入图片描述

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 <T>
 * 这是前后端分离,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;
    }
}

对既有代码做改造:
在这里插入图片描述


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

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


  1. @RequestHeader
    拿到请求头中的值作为请求参数
    Request header中的值我们都可以拿得到。
    在这里插入图片描述

@CookieValue
联系上文的cookie和session一起看
@CookieValue(“songge”) String value拿到key=songge对应cookie的值
在这里插入图片描述
@SessionAttribute
联系上面cookie和session一起看
@SessionAttribute(“username”)String username拿到key=username对应session的值
在这里插入图片描述


静态资源处理
在这里插入图片描述

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

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

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

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

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


异常处理

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

首先注册组件:
在这里插入图片描述
在这里插入图片描述
通过异常类型的判断也可以处理不同的异常
在这里插入图片描述


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

通过handler来处理指定异常 → ModelAndView和json都能处理 → 更精细的异常处理
handler仍然是以方法的形式存在 → ControllerAdvice组件中
在这里插入图片描述


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

代码见Homework08

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

-玫瑰少年-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值