ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Spring MVC框架 学习笔记总结(四)

2022-02-23 20:04:37  阅读:136  来源: 互联网

标签:index 拦截器 web Spring 笔记 MVC springframework org import


文章目录

1. SpringMVC的 拦截器

1.1 拦截器和过滤器


SpringMVC的处理器拦截器类似Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理。

过滤器是交给tomcat来操作的,而拦截器是通过spring来实现的。

过滤器和拦截器的区别:拦截器是AOP思想的具体应用。
在这里插入图片描述

1.2 自定义拦截器


想要自定义拦截器,必须实现HandlerInterceptor接口。

直接一点就是实现了HandlerInterceptor接口的类就是一个拦截器。

定义一个拦截器类MyInterceptor:

package com.itholmes.config;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MyInterceptor implements HandlerInterceptor {

    //return true; 就是放行,执行下一个拦截器。
    //return false; 就是不放行,不执行下一个拦截器,就拒绝访问。
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("===========处理前===========");
        return false;//不放行
        //return true;//放行
    }

    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("===========处理后===========");
    }

    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("===========清理===========");
    }
}

有了拦截器,就得在springmvc的配置文件里面注册一下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="
       http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/mvc
       http://www.springframework.org/schema/mvc/spring-mvc.xsd
       ">
    <!--1.注解驱动-->
    <mvc:annotation-driven/>
    <!--2.静态资源过滤,如果不配置我们的js文件加载不进去。-->
    <mvc:default-servlet-handler/>
    <!--3.扫描包-->
    <context:component-scan base-package="com.itholmes.controller"/>
    <!--4.视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

    <!--拦截器配置-->
    <mvc:interceptors>
        <mvc:interceptor>
            <!--
                这里的path就是拦截路径。
                    ?、/、/*和/**的区别配置:
                        "/index?"能够匹配到"/indexA","/indexB",可是不能匹配"/index",也不能匹配"/indexAA";请求

                        "/index*"能够匹配"/indexA","/indexAA",可是不能匹配"/index/A";index

                        "/index/*"能够匹配"/index/","/index/A","/index/AA","/index/ABC",可是不能匹配"/index",也不能匹配"/index/A/B";

                        "/index/**"能够匹配"/index/"下的多个子路径,好比"/index/A/B/C/D";
            -->
            <mvc:mapping path="/**"/>
            <bean class="com.itholmes.config.MyInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>
</beans>

控制器类TestController :

package com.itholmes.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestController {
    @GetMapping("/t1")
    public String test(){
        System.out.println("TestController==test方法执行了");
        return "OK";
    }
}

之后我们随便访问一个控制器,他就会显示这种效果。
在这里插入图片描述


?、/、/*和/**的区别配置:

  • "/index? :能够匹配到/indexA","/indexB",可是不能匹配"/index",也不能匹配"/indexAA";请求
  • "/index* :能够匹配/indexA","/indexAA",可是不能匹配"/index/A";index
  • "/index/* :能够匹配/index/","/index/A","/index/AA","/index/ABC",可是不能匹配 “/index”,也不能匹配"/index/A/B";
  • "/index/**:能够匹配/index/“下的多个子路径,好比”/index/A/B/C/D";

2. SpringMVC的上传文件

2.1 前端上传文件方式


SpringMVC可以很好的支持文件上传,但是SpringMVC上下文中默认没有装配MultipartResolver,因此默认情况下它是不能处理文件上传工作。如果想让SpringMVC的文件上传功能,则需要在上下文中配置MultipartResolver。

multipart/form-data类型:这种编码方式会以二进制流的方式来处理表单数据。
在这里插入图片描述

2.2 后台接受方式


第一步:导入commons-fileupload和javax.servlet-api两个包。

<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
<dependency>
  <groupId>commons-fileupload</groupId>
  <artifactId>commons-fileupload</artifactId>
  <version>1.4</version>
</dependency>
<!--Servlet-->
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
  <groupId>javax.servlet</groupId>
  <artifactId>javax.servlet-api</artifactId>
  <version>4.0.1</version>
</dependency>

第二步:配置springmvc的核心配置文件。

  • SpringMVC为文件上传提供了直接支持,这种支持是即插即用的MultipartResolver实现。
  • SpringMVC使用Apache Commons FileUpload技术实现了一个MultipartResolver实现类:CommonsMultipartResolver。因此,SpringMVC文件上传还是需要依赖Apache COmmons FileUpload的组件!

在这里插入图片描述

在springmvc-config.xml文件中,配置CommonsMultipartResolver类的一个bean对象,注意这里的bean对象名字不能错误!因为在Spring中有类在用它!

<!--文件上传的位置-->
<!--这里的id必须是multipartResolver,因为在Spring中有类在用它!-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <!--请求的编码格式,必须和jsp的pageEncoding属性一直,以便正确读取表单的内容,默认为ISO-8859-1-->
    <property name="defaultEncoding" value="utf-8"/>
    <!--上传文件大小上限,单位为字节(10485760)=10M-->
    <property name="maxUploadSize" value="10485760"/>
    <property name="maxInMemorySize" value="40960"/>
</bean>

在这里插入图片描述


第三步:配置Controller文件。

第一种方式:IO读取。

package com.itholmes.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.commons.CommonsMultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.*;

@RestController
public class FileController {

	//第一种方式:
    @RequestMapping("/upload")
    public String fileUpload(@RequestParam("file")CommonsMultipartFile file, HttpServletRequest request) throws IOException {

        //获取文件名:file.getOriginalFilename();
        String uploadFileName = file.getOriginalFilename();
        //如果文件名为空,直接回到首页。
        if("".equals(uploadFileName)){
            return "redirect:/index.jsp";
        }
        System.out.println("上传文件名:"+uploadFileName);


        //上传路径保存设置
        String path = request.getServletContext().getRealPath("/upload");
        //如果路径不存在,创建一个
        File readPath = new File(path);
        if(!readPath.exists()){
            readPath.mkdir();
        }
        System.out.println("上传文件保存地址:"+readPath);


        //获取文件流
        InputStream is = file.getInputStream();
        OutputStream os = new FileOutputStream(new File(readPath, uploadFileName));
        //读取写出
        int len = 0;
        byte[] buffer = new byte[1024];
        while ((len=is.read(buffer))!=-1){
            os.write(buffer,0,len);
            os.flush();
        }
        os.close();
        is.close();

        return "redirect:/index.jsp";
    }

}

第二种方式:直接写到文件中。

package com.itholmes.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.commons.CommonsMultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.*;

@RestController
public class FileController {

    @RequestMapping("/upload2")
    public String fileUpload2(@RequestParam("file") CommonsMultipartFile file,HttpServletRequest request) throws IOException {
        //上传路径保存设置
        String path = request.getServletContext().getRealPath("/upload");
        File realPath = new File(path);
        if(!realPath.exists()){
            realPath.mkdir();
        }

        //上传文件地址
        System.out.println("上传文件保存地址:"+realPath);

        //通过CommonsMultipartFile的方法直接写文件
        file.transferTo(new File(realPath+"/"+file.getOriginalFilename()));

        return "redirect:/index.jsp";
    }

}

第四步:就直接测试就可以了。

  • 正常开发中,这些代码都是固定的格式,拿来即用!
  • 我们可以在target或out文件中能查看到。
    在这里插入图片描述

3. SpringMVC的下载文件


文件下载步骤:
在这里插入图片描述

对应控制类写法:

package com.itholmes.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.commons.CommonsMultipartFile;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;

@RestController
public class FileController {

    @RequestMapping("/download")
    public String downloads(HttpServletResponse response,HttpServletRequest request) throws IOException {
        String path = request.getServletContext().getRealPath("/upload");
        String fileName = "项目.md";

        //1.设置response响应头
        response.reset();//设置页面不缓存,清空buffer
        response.setCharacterEncoding("utf-8");//设置字符编码
        response.setContentType("multipart/form-data");//二进制传输数据
        //设置响应头
        response.setHeader("Content-Disposition","attachment;fileName="+ URLEncoder.encode(fileName,"UTF-8"));

        File file = new File(path, fileName);
        //2.读取文件--输入流
        InputStream input = new FileInputStream(file);
        //3.写出文件--输出流
        OutputStream out = response.getOutputStream();

        byte[] buff = new byte[1024];
        int index = 0;
        while ((index=input.read(buff))!=-1){
            out.write(buff,0,index);
            out.flush();
        }
        out.close();
        input.close();
        return null;
    }

}

4. 补充


ssm中如果遇到的一些坑,问题都会写到这里。

标签:index,拦截器,web,Spring,笔记,MVC,springframework,org,import
来源: https://blog.csdn.net/IT_Holmes/article/details/123089091

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有