SpringMVC入门(上传、拦截器)
发布日期:2022-02-28 11:05:50 浏览次数:4 分类:技术文章

本文共 6220 字,大约阅读时间需要 20 分钟。

SpringMVC概述

​ SpringMVC是一个基于MVC(Model View Controller)的WEB框架,也是Spring框架的一个模块,所以SpringMVC与Spring框架可以无缝对接

Spring入门

1.前端控制器(DispatcherServlet)

​ 用来集中处理请求,负责接收所有的请求,在将对应的请求转发到其他程序处理.然后再接收处理后的结果在浏览器上渲染展示

SpringMVC执行流程(重点/难度)

1.前端控制器

​ 主要用于组件之间的调度,相当于CPU(中央处理器) ===>解耦

​ spring作用???

​ IOC(控制反转) ===>解耦,降低模块与模块之间的耦合度

2.处理器(Handler) ===>Controller

​ 主要用于完成具体的业务逻辑的

3.处理器映射器(HandlerMapping)

​ 前端控制器通过他将请求映射到不同的Handler

4.处理器拦截器

​ 一些拦截处理的操作

5.处理器执行链(处理器+拦截器组合)

6.处理器适配器(HandlerAdapter)

​ 完成一些预处理的操作 Eg:数据类型转换,封装

7.ModelAndView(模型视图)

​ 模型数据,视图信息

8.视图解析器(ViewResolver)

​ 将逻辑视图转换为物理视图(浏览器上能看到的东西)

处理静态资源的处理方式

在springMVC配置设置静态资源的处理方式,有两种处理方式

方式一:

方式二:

SpringMVC的数据交互

SpringMVC框架Controller里的重定向 “redirect:/list”;

SpringMVC框架Controller里的转发 “forward:/list”;

Controller类中方法的返回类型

  1. String类型

  2. ModelAndView对象类型(视图对象)

    ModelAndView的常用方法

    方法名 作用
    addObject 向视图传递内容
    setViewName 指定返回的视图名称
  3. void类型(无返回值)

    因为没有返回值,在方法里进行重定向或转发操作(HttpServletRequest,HttpServletResponse)

    注意:使用原始的转发方式做页面跳转,必须给定jsp页面完整的路径

    ​ 重定向写法:response.sendRedirect("/login"); 重定向到返回视图页面的login方法

Controller类中的参数绑定

返回值为String类型,向页面传递内容可以使用Model对象

Model与ModelMap一样其本质都是使用HttpServletRequest对象向页面传递内容

Model参数对象:

​ 方法: addAttribute ---- 传递内容参数

1.基本数据类型(自动绑定)

Controller类的方法中的形参名称请求携带的参数名称一致时,参数值会自动绑定不需再用request.getParameter获取参数值

Controller类的方法中的形参名称请求携带的参数名称一致时 使用**@RequestParam注解或@RathVariable**注解创建别名

//http://127.0.0.1:8080/book/deleteById?ids=910&booName="SpringMVC"; @RequestMapping(value = "/login")    public String login(@RequestRaram(value = "ids" , required = true , defaultValue = "3") Integer id) {
//@RequestRaram(value = "ids") ids是请求携带的参数名 //required = true 必须存在 //defaultValue = "3" 默认值 System.out.println(id); }//http:/127.0.0.1:8080/book/deleteById/{ids}/{booName}; =======RESTFul风格@RequestMapping(value = "/login/{id}") //{id}和方法参数里的id直接绑定 public String login(@RathVariable Integer id) {
System.out.println(id); }

@RequestParam与@RathVariable的区别?

1.@RequestParam用于处理简单数据类型的绑定操作(int,String,double,boolean…)

2.@RequestParam参数可传可不传,@RathVarble必须传参数

3.@RequestParam用来获取静态URL中传入的参数;@RathVariable用来获取动态URL中的参数

4.@RequestParam参数可传可不传,@RathVariable表示参数必须要传

2.POJO对象类型绑定

注意:对象绑定时form表单中的input里的name属性里的值一定要和pojo中的属性名称一致

​ 在SpringMVC中就能进行对象的映射

@RequestMapping(value = "/saveBook")public String addBook(Book book){
System.out.println(book); return ""}

3.数组类型的绑定操作

​ 当页面传递数组时如**"checkbox"属性,需要在controller**方法的参数里定义数组类型,名称必须相同

在SpringMVC里是不能直接操作集合的,必须把一个集合写在一个Bean里面

SpringMVC3.2以后推出泛型集合,使用的是JSON格式数据交互

SpringMVC中JSON格式数据交互

不管是前端进行请求还是后端进行数据的响应,其都是进行JSON格式的传输

@RequestBody ====>前端数据解析----将JSON格式的字符串,转换成java对象

@ResponseBody ====>后端数据响应----将java对象转换为JSON字符串输出

在SpringMVC中使用JSON格式,必须配置JSON转换器

在SpringMVC中使用jackson进行数据交互是,必须要配置转换器,在SpringMVC中有2种方式配置

1.传统配置文件配置(不可取)

2.基于注解的方式:<mvc:annotation-driven />

JSON格式语法:

​ Eg:

​ {“name”,“value”}

操作:

h5页面里的代码:

controller层的代码

//JSON格式的数据请求与响应操作//method = RequestMethod.POST与前端页面的method使用的get&post对应@RequestMapping(value = "/requestJson" ,method = RequestMethod.POST)@ResponseBodypublic User requestJson(@RequestBody User user){
System.out.println(user); return user; //将user对象转换为JSON格式}

Eg:记得导jackson的依赖包

SpringMVC上传

​ 需要注意的几点:

  1. input标签的type设置为file
  2. form表单的method设置为post
  3. form表单的enctype设置为"Multipart/form-data"

代码实现

上传操作

//上传操作时处理表单的数据,需要借助MultipartFile,一般用于接收前台传递过来的文件,上传文件的信息保存在这个类中    @RequestMapping(value = "/uploadFile")    public String uploadFile(MultipartFile imgs,HttpServletRequest request) throws IOException {
if (imgs.getSize() > 0){
//获取文件上传的目录 String path = request.getSession().getServletContext().getRealPath("/upload"); //获取上传文件的原始名称 String fileName = imgs.getOriginalFilename(); //重命名操作 String newFileName = UUID.randomUUID()+fileName.substring(fileName.lastIndexOf(("."))); File file = new File(path,newFileName); if (!file.exists()){
//创建存储图片的目录 file.getParentFile().mkdirs(); } //上传 imgs.transferTo(file); } return "redirect:/book/booklist"; }

多个图片上传把MultipartFile imgs 改成MultipartFile[] imgs,然后判断MultipartFile[]数组是否为空,在单个遍历即可

SpringMVC拦截器

SpringMVC中的拦截器与servlet中过滤器功能差不多,用于对处理器进行预处理和后处理操作

拦截器是基于java反射不依赖于容器,过滤器依赖于容器

拦截器需要实现HandlerInterceptor

HandlerIntercepor里有三个方法

方法 使用场景 说明返回值说明
preHandle 登录拦截、权限拦截 该方法执行时机是在Controller类方法执行之前,也就是说在执行Handler之前执行 true:表示放行,不拦截,正常执行Controller类中的方法 false:表示拦截,Handler不能正常执行
postHandle 设置页面的一些共享信息 该方法执行的时机是在Handler执行之后,在返回ModerAndView之前
afterCompletion Handler出现的异常,日志的记录、类似AOP里的后置通知 该方法执行的时机是在Handler执行之后,在返回ModerAndView之后,注意:只要拦截器放行该方法一定会执行

配置拦截器,在SpringMVC配置里配置

代码演示:

package com.gtl.config;import cn.hutool.core.util.StrUtil;import org.springframework.lang.Nullable;import org.springframework.web.servlet.HandlerInterceptor;import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class MyHandlerInterceptor implements HandlerInterceptor {
//该方法执行时机是在Controller类方法执行之前,也就是说在执行Handler之前执行 @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//登录拦截业务逻辑处理 String username =(String) request.getSession().getAttribute("username"); System.out.println("=================>"+username); if (StrUtil.isNotEmpty(username)){
return true; }else {
response.sendRedirect("/user/login"); return false; } } //该方法执行的时机是在Handler执行之后,在返回ModerAndView之前 @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
} //该方法执行的时机是在Handler执行之后,在返回ModerAndView之后,注意:只要拦截器放行该方法一定会执行 @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
}}

转载地址:https://blog.csdn.net/weixin_47427198/article/details/108763111 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:ResNet小结
下一篇:使用js对表格进行添加数据、刪除数据 批量删除数据

发表评论

最新留言

不错!
[***.144.177.141]2024年04月17日 01时21分08秒