文章内容输出来源:拉勾教育Java高薪训练营
本篇文章会对记录对SpringMVC基本的研究,将会分为下面几个部分进行阐述
补全目录建立完整
url-pattern 标签说明
contextConfigLocation 配置说明:指定程序启动时,加载哪个配置文件
注解说明:
ModelAndView说明:
package
标签说明:
<%
整体目录为:
访问 http://localhost:8080/demo/handle01
刚刚的配置文件中,我们在Web.Xml里面,配置了url请求的拦截匹配规则
在项目中添加一个test.html
然后在浏览器中访问这个HTML,http://localhost:8080/test.html 会发现直接404
然后发现后台报错了:
那么这里是怎么回事呢?
其实我们在使用tomcat时,默认就有一个web.xml文件,我们自己写的web.xml就是继承于它的。
我们可以看到这里有,两个默认的映射配置
其中这个default映射器配置,配置成了
而Jsp映射器配置,拦截的是*.jsp
所以:我们这里配置成了 / 其实就是使用父级的配置,默认拦截所有静态资源,而jsp页面因为有别的映射器进行配置了,就直接交给tomcat了
解决方案一:
在springmvc.xml中,配置一个即可
原理:添加该标签配置之后,会在SpringMVC上下文中定义一个DefaultServletHttpRequestHandler对象,这个对象如同一个检查人员,对进入DispatcherServlet的url请求进行过滤筛查,如果发现是一个静态资源请求,那么会把请求转由web应用服务器(tomcat)默认的DefaultServlet来处理,如果不是静态资源请求,那么继续由,SpringMVC框架处理。
缺陷:不能放在Web-Info,Resource目录下
解决方案二:
如果当前test.html文件放在了resources目录下面,如果想要访问,则需要在springmvc.xml进行配置SpringMVC框架自己处理静态资源 http://localhost:8080/resources/test.html
ModelMap,Model,Map的接收用法以及内部细节
/**
简单类,实体类,包装类的接收用法
/**
传入日期格式用法
http://localhost:8080/demo/handle06?birthday=2020-02-02
我们新建一个方法,直接传入日期数据类型
@RequestMapping
结果就返回400,客户端传入参数错误
后台显示的错误是:参数转换错误
解决方案:注册自定义类型转换器
1)新建一个类型转换器,出入字符串,转换成时间格式
public
2)springmvc.xml中 注册自定义类型转换器
3)配置使用自定义类型转换器
2)配置这个过滤器作用于所有的资源当中
3)再次测试,发现后端正确传入中文字符
下面来测试一下Put请求,我们在Html页面中,并没有Put参数类型,只有Post
<
后台控制器的这个接口,标记方法类型为Put类型
/*
点击提交rest_put请求,发现直接报错了
后端的控制台输出为:
说明如果使用Post去请求Put类型的方式,是不行的
解决方案:配置过滤器,转换当前的请求类型
1)在web.xml中,配置一个过滤器,类型为:HiddenHttpMethodFilter
为什么要配置这个类呢?HiddenHttpMethodFilter
因为浏览器当前仅支持GET和Post,如果想要转变成其他的类型,则需要在Post的时候,在请求体中,增加一个_method字段,标明当前想要请求的类型是什么
使用这个过滤器,目前仅仅支持PUT,DELETE,PATCH三种转换
同理,在提交删除方法的时候,增加一个_method的隐藏域
<
后端方法标记为Delete即可
/*
1)准备前端页面
<
2)在WEB-INF下面添加一个Js,根据之前的经验可以得知,这里是访问不到的,必须进行一定的配置才行
3)在SpringMVC中进行配置,指定Url中,获取JS相关的资源,应该去哪里找
4)准备好后端接收的方法
// 添加@ResponseBody之后,不再走视图解析器那个流程,而是等同于response直接输出数据
前端运行一下Ajax,发现报错了了
5)原来还差一步:配置Pom文件
再来测试一下
前端Ajax交互请求 【后端-> 前端】
<
后端加一个注解@ResponseBody
@RequestMapping("/handle07")
// 添加@ResponseBody之后,不再走视图解析器那个流程,而是等同于response直接输出数据
public @ResponseBody User handle07(@RequestBody User user) {
// 业务逻辑处理,修改name为张三丰
user.setName("张三丰");
return user;
}
1)如修改pom文件,增加javax.servlet-api,添加拦截器时需要此包
2)先建立一个拦截器实现接口 org.springframework.web.servlet.HandlerInterceptor
public
3)配置拦截器
4)测试
总结:
在多个拦截器存在时,他们的执行顺序又是怎样的呢?
他们的preHandle()方法会按照配置文件中拦截器的配置顺序执行,而他们的PostHandler()方法和afterCompletion()方法则会按照配置顺序的反序执行
这里的执行顺序,和配置的前后顺序有关
1)配置Pom文件,文件上传jar包
2)前端页面HTML
<
3)后端控制器
/**
尝试运行,直接报错
后端报错原因:MultipartFile uploadFile对象为空4)缺少重要一步:配置多元素解析器