SpringMVC入门(上传、拦截器)

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配置设置静态资源的处理方式,有两种处理方式

方式一:

	<!--处理静态资源的解决方式1-->
    <mvc:default-servlet-handler/>
    <!--解决静态方式之后404的处理-->
    <mvc:annotation-driven /> <!--使用JSON注解时也使用这条命令-->

方式二:

	<!--处理静态资源的解决方式2(此种方式相对灵活)-->
    <mvc:resources mapping="/js/**" location="/js/" />
    <mvc:resources mapping="/css/**" location="/css/" />
    <mvc:resources mapping="/img/**" location="/img/" />

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中就能进行对象的映射

<form action="/book/saveBook" method="post">
	<input type="text" name="name" />
    <input type="text" name="author" />
    <input type="text" name="price" />
    <input type="submit" value="提交" />
</form>
@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页面里的代码:

<script type="text/javascript" src="js/jquery-1.9.1.min.js"></script>
<script type="text/javascript">
    var dataJson = {
        "username":"管理",
        "password":"123",
        // "phone":"18325861235",
        "gender":"男",
        "age":"20"
    }
    function requestJson(){
        $.ajax({
            type:"post",
            url:"${pageContext.request.contextPath}/user/requestJson",
            contentType:"application/json;charset=UTF-8",
            dataType:"json",
            data:JSON.stringify(dataJson),//将JSON格式的数据转换为JSON字符串格式
            success:function (data) {
                console.log(data.username);
            }
        })
    }
</script>

<button onclick="requestJson()" value="JSON数据格式的请求操作">请求JSON,返回JSON</button>

controller层的代码

//JSON格式的数据请求与响应操作
//method = RequestMethod.POST与前端页面的method使用的get&post对应
@RequestMapping(value = "/requestJson" ,method = RequestMethod.POST)
@ResponseBody
public 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"

代码实现

<h2>上传操作</h2>
<form action="/user/uploadFile" method="post" enctype="multipart/form-data">
    <input type="file" name="imgs">
    <input type="submit" value="上传">
</form>
 //上传操作时处理表单的数据,需要借助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之前
afterCompletionHandler出现的异常,日志的记录、类似AOP里的后置通知该方法执行的时机是在Handler执行之后,在返回ModerAndView之后,注意:只要拦截器放行该方法一定会执行

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

<!--配置springMVC拦截器-->
<mvc:interceptors>
    <mvc:interceptor>
        <!--path:表示路径-->
        <!--拦截所有的URL请求-->
        <mvc:mapping path="/**"/>
        <!--表示不拦截的请求-->
        <mvc:exclude-mapping path="/user/login"/>
        <mvc:exclude-mapping path="/user/myLogin"/>
        <!--指定请求的类-->
        <bean class="com.gtl.config.MyHandlerInterceptor" />
    </mvc:interceptor>
</mvc:interceptors>

代码演示:

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 {
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

java.小小白

生活不易

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值