今天是刘小爱自学Java的第128天。
感谢你的观看,谢谢你。
学习内容安排如下:
- Jstl标签的使用,既然又提到了,还是学一学好了,反正也不要太多时间。
- 写了一个文件上传的案例。
- 最后关于转发和重定向在springMVC中的使用,以及这两者之间的区别。
- 拦截器的使用。
自此SSM框架也就告一段落了。
一、Jstl标签的使用
这个Jstl是当初学jsp时的知识点,因为动不动就有人说Jsp技术被淘汰了,所以就没学。
但既然在框架中再次用到了Jstl,那还是学下吧,知道怎么用它肯定是没坏处的。
1Controller方法
对应的访问路径为show15。
其中利用for循环创建了10个User对象,再放入集合中作为返回值。
本来这里正确的流程是要去数据库查询数据的,不过比较麻烦,我们只是学Jstl标签这个知识点,用for循环做做假数据就好了。
2user.jsp中标签的使用
①引入核心标签库
②c:foreach标签
该标签和Java中的增强for循环非常类似,就好比:for(User user : userList){};
items中利${userList}取的值就是我们前面创建的那个User对象集合。
${user.id}就是去除user对象中的id属性,其它的属性取值都是类似。
③代码测试
输入访问路径,可以发现数据完成了渲染。
JSON数据格式
Json是最为常见的一种数据格式,所以springMVC提供了一种更为简便的方式传递数据。
当@ResponseBody放在处理请求的方法上时,表示方法返回值会自动转换成JSON。
此外还有两个注解,一起做一个小结:
- @ResponseBody是把Controller方法返回值转化为JSON,称为序列化。
- @RequestBody是把接收到的JSON数据转化为实体类对象,称为反序列化。
- @RestController将当前处理器中所有方法的返回值都转换成json数据。
三、文件上传
SpringMVC的文件上传,底层也是使用的Apache的Commons-fileupload。
我们写一个文件上传的例子:
①引入依赖
在pom文件中引入依赖,很多时候这个步骤我都没有说明,但依赖一般来说都是首要步骤。
②定义文件上传解析器
- defaultEncoding:设定编码表为utf-8。
- maxUploadSize:设定文件上传的最大值,例子中也就是5M。
③Controller中的方法
请求中上传的文件可以作为一个参数被获取,参数类型为MultipartFile,通过注解@RequestParam即可完成。
-
通过transferTo()方法可以将上传的文件存到对应的文件路径中。
-
通过getOriginalFilename()方法可以获取上传的文件名称。
例子中是放在D盘,用系统时间戳+文件名称的格式给上传的文件命名。
其中@ResponseStatus可以自行设定响应状态,这里为了测试直接设成响应成功。
代码写完,做一个测试:
这里使用的一个插件,完成上传文件的请求,关于这个插件,后续会做一个插件合集说明。
①请求路径
也就相当于以前在浏览器地址栏上输入路径,与@RequestMapping中的参数保持一致。
②上传文件
在Files选项栏中可以选择文件上传,其中名称要与@RequestParam中的参数名称一致。
③代码测试
点击发送请求,处理器将上传的文件获取,再利用transferTo方法保存到对应的路径中。
例子中就是D盘,所以D盘中出现了一个以系统时间戳+文件名称命名的新文件。
三、转发及重定向
返回值为字符串时,默认为视图名称,比如“hello”即对应hello.jsp这个文件。
当返回值字符串是以”forward:”或者”redirect:”开头,则表示是转发或者重定向。
①转发
forward:show21.do?type=forword
使用“forward:”开头说明是转发,后面跟转发跳转的请求路径。
②重定向
redirect:show21.do?type=redirect
使用“redirect:”开头说明是重定向,后面跟重定向的路径。
测试,同时回顾下转发与重定向的区别
①转发:forword
show19.do即为转发,跳转到show21.do对应页面,同时浏览器路径没有变化。
②重定向:redirect
show20.do即为重定向,也跳转到show21.do对应页面,但是注意浏览器路径变化了。
转发和重定向的区别在于:
- 转发是服务器内部完成跳转,是同一个请求,正因为如此,所以数据能共享。
- 重定向是浏览器完成跳转,是产生了一个新的请求了,数据不能共享了
四、拦截器
前天我们学习过springMVC的流程:
当请求到达控制器时,控制器根据请求路径到映射器中查询具体用什么处理器。
映射器会将查询结果返回给控制器,返回结果就包含了一个拦截器集合。
1自定义一个拦截器
实现HandlerInterceptor接口,Interceptor,本身也就是拦截器的意思。
①preHandle方法
preHandle调用Handler之前执行,称为前置方法,关于其返回值:
-
true表示放行,后续业务逻辑继续执行。
-
false表示被拦截,后续业务逻辑不再执行,但之前返回true的拦截器的完成方法会倒叙执行。
②postHandle方法
postHandle调用Handler之后执行,称为后置方法。
③afterCompletion方法
afterCompletion在视图渲染完成之后执行,也称之为完成方法。
2拦截器配置
interceptors标签里面放interceptor标签,说明拦截器是可以配置多个的。
例子中只配置了一个。
mapping path:表示拦截的请求,两个*号代表0个或者多个路径,这个昨天也详讲过。
再将拦截器类配置成一个springBean。
3测试
我们设置的是所有路径都拦截,那么随便找一个我们以前写的例子就好了。
浏览器中输入的是show1,在其对应的处理器中我们输入一条语句作为测试。
根据结果我们能发现,如果请求被拦截了:
- 先执行拦截器前置方法。
- 然后才执行该路径本身对应的处理器。
- 再执行拦截器后置方法。
- 最后执行拦截器完成方法。
其中如果有多个拦截器,时间有限,就不测试了,直接说结论:
- 拦截器的前置方法依次执行。
- 后置方法和完成方法倒序执行。
- 当前置方法返回false时,请求被拦截,后续的拦截器以及处理器方法不再执行,但它前面请求没被拦截的拦截器的完成方法会倒续执行。
- 完成方法在视图渲染之后才去执行。
最后
谢谢你的观看。
如果可以的话,麻烦帮忙点个赞,谢谢你。