回顾昨天的一个知识点:
为什么servlet-api的scope是provided呢?
servlet-api这些类要给程序编译的时候提供字节码文件,而Tomcat服务器中提供了这些类,如果scope不是provided,就会发生一些冲突。
SpringMVC不包括的converter
基本数据类型和包装类如int、Boolean这些,SpringMVC内置的converter都能转换的了。但有些参数类型converter不能提供类型转换,那么就需要我们自己写转换器。
converter负责请求参数的类型转换
比如Date :2020-07-21,前端输入的是以String形式提交的,但后端想以Date的类型进行接收。
看一下SpringMVC给我们提供的converters
从容器中取出conversionService组件,用debug看:
其他格式应当怎么接收呢?
a. 导包
commons-io、commons-fileupload
导入commons-fileupload包的同时也导入了commons-io了。
b. 注册组件(multipartResolver)
c. 构建一个文件上传的请求 form
文件上传要求得有这句代码:enc-type=“multipart/form-data” method=post
d. 接收文件的数组(批量上传)
cookie和session
Json数据作为形参(非常重要)
要在handler方法中接收json
导包
jackson-databind
@RequestBody
要想接收json数据,请求方法必须是post请求。
也可以通过map获得对象:
同一个url映射到不同的handler方法上
通过限制请求方法
Post请求,接收json
注意图中的请求方法,一个是get一个是post。
RestFul
REST,即Representational State Transfer,表述性状态传递
通过发送http请求 → 获得请求过程中的值作为请求参数
RestFul → 返回值为json → @ResponseBody 或 @RestController
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;
}
}
之前要求请求参数名和handler方法的形参名是一致的。
login?username=songge&password=niu
login(String username,String password)
增加了这个注解后请求参数名和handler方法的形参名可以不一致。
@CookieValue
联系上文的cookie和session一起看
@CookieValue(“songge”) String value拿到key=songge对应cookie的值
@SessionAttribute
联系上面cookie和session一起看
@SessionAttribute(“username”)String username拿到key=username对应session的值
默认的servlet
访问静态资源的请求不经过DispatcherServlet处理,而是由默认的servlet进行处理。
web.xml中加这这两段代码,就能处理.jpg和.png文件。
静态资源映射(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文件中。
异常处理
通过handler来处理指定异常 → ModelAndView和json都能处理 → 更精细的异常处理
handler仍然是以方法的形式存在 → ControllerAdvice组件中
作业: 昨天的注册页面需要做些事儿
1、验证码图片能够回显(img标签的src中的图片路径能够访问 → 静态资源映射),提交按钮中的图片也要能回显
2、注册页面中的所有参数使用springmvc框架获取请求参数(请求参数不用封装json,大家写表单封装)
3、响应值返回一个user,响应为json数据
代码见Homework08
先访问http://localhost:8080/register.jsp,选择上传的图片,然后点击提交,就会跳转到http://localhost:8080/register2,显示上传的图片。