首页> 资讯> 详情

全球观天下!框架128:springMVC最后一天

2023-02-15 06:53:52 来源:刘小爱

今天是刘小爱自学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中利$取的值就是我们前面创建的那个User对象集合。

$就是去除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时,请求被拦截,后续的拦截器以及处理器方法不再执行,但它前面请求没被拦截的拦截器的完成方法会倒续执行。

完成方法在视图渲染之后才去执行。

最后

谢谢你的观看。

如果可以的话,麻烦帮忙点个赞,谢谢你。

关键词: springMVC

上一篇:
下一篇: