SpringMvc(三)

简介: 关于SpringMvc相关介绍

⑤. 文件上传

1>. 文件上传客户端三要素

  • ①. 表单项type="file"
  • ②. 表单的提交方式是post
  • ③. 表单的enctype属性是多部分表单形式,及enctype="multipart/form-data"
<form action="${pageContext.request.contextPath}/user/quick22"
 method="post" enctype="multipart/form-data">
        名称<input type="text" name="username" multiple="multiple"><br/>
        文件1<input type="file" name="uploadFile"><br/>
        <input type="submit" value="提交">
    </form>

解释:

(1).上述代码中,除了满足上传表单所需的3个条件外,在input元素中还添加了一个multiple属性。该属性是HTML5中的新属性,如果使用了该属性,则可以同时选择多个文件进行上传,即可实现多文件上传

(2).当客户端form表单的enctype属性为multipart/form-data时,浏览器就会采用二进制流的方式来处理表单的数据,服务器就会对文件上传的请求进行解析处理


2>. 实现原理

20190923202541404.png

3>. 单文件上传步骤

  • ①. 导入fileupload和io坐标
  • ②. 配置文件上传解析器
  • ③. 编写文件上传代码
<dependency>
      <groupId>commons-fileupload</groupId>
      <artifactId>commons-fileupload</artifactId>
      <version>1.3.1</version>
    </dependency>
    <dependency>
      <groupId>commons-io</groupId>
      <artifactId>commons-io</artifactId>
      <version>2.3</version>
    </dependency>
    <!--配置文件上传解析器-->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <!--配置默认编码集-->
        <property name="defaultEncoding" value="UTF-8"/>
        <!--配置最大文件上传大小(以字节为单位)-->
        <property name="maxUploadSize" value="500000"/>
    </bean>

解释:

(1). SpringMvc为文件上传提供了直接的支持,这种支持时通过MutipartResolver(多部件解析器)对象实现的

(2). MultipartResolver是一个接口对象,需要通过它的实现类CommonsMultipartResolver来完成文件上传工作

(3).因为MultipartResolver接口的实现类CommonsMultipartResolver内部引用multipartResolver字符串获取该实现类对象并完成文件解析,所以在配置CommonsMultipartResolver时必须指定改Bean的id为multipartResolver

<form action="${pageContext.request.contextPath}/user/quick22"
 method="post" enctype="multipart/form-data">
        名称<input type="text" name="username"><br/>
        文件1<input type="file" name="uploadFile"><br/>
        <input type="submit" value="提交">
    </form>
    @RequestMapping(value="/quick22")
    @ResponseBody
    public void save22(String username, MultipartFile uploadFile) throws IOException {
        System.out.println(username);
        System.out.println(uploadFile);
    }
    //上传实现升级版
    @RequestMapping(value="/quick22")
    @ResponseBody
    public void save22(String username, MultipartFile uploadFile) throws IOException {
        System.out.println(username);
        //获得上传文件的名称
        String originalFilename = uploadFile.getOriginalFilename();
        uploadFile.transferTo(new File("C:\\upload\\"+originalFilename));
    }

MultipartFile 接口方法说明:

(1).String getName( ):获取多部件form表单的参数名称

(2).String getOriginalFilename:获取文件上传的初始化名

(3).boolean isEmpty():判断上传的文件是否为空

(4).void transferTo(File file):将上传文件保存到目标目录中


4>. 多文件上传

  • ①. 实现方式1
<form action="${pageContext.request.contextPath}/user/quick23" method="post" enctype="multipart/form-data">
        名称<input type="text" name="username"><br/>
        文件1<input type="file" name="uploadFile"><br/>
        文件2<input type="file" name="uploadFile"><br/>
        <input type="submit" value="提交">
    </form>
  • ②. 实现方式2
<form action="${pageContext.request.contextPath}/user/quick23" method="post" enctype="multipart/form-data">
        名称<input type="text" name="username"><br/>
        文件<input type="file" name="uploadFile" multiple="multiple"><br/>
        <input type="submit" value="提交">
    </form>
    @RequestMapping(value="/quick23")
    @ResponseBody
    public void save23(String username, MultipartFile[] uploadFile) throws IOException {
        System.out.println(username);
        for (MultipartFile multipartFile : uploadFile) {
            String originalFilename = multipartFile.getOriginalFilename();
            multipartFile.transferTo(new File("C:\\upload\\"+originalFilename));
        }
    }

⑥. SpringMVC的拦截器

1>.拦截器的作用(理解)

  • ①. Spring MVC 的拦截器类似于 Servlet 开发中的过滤器 Filter,用于对处理器进行预处理和后处理
  • ②. 将拦截器按一定的顺序联结成一条链,这条链称为拦截器链(InterceptorChain)。在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。拦截器也是AOP思想的具体实现

2>. Interceptor和filter区别(理解,记忆)

  • 注意:只会拦截访问的控制器方法,如果访问的是jsp,html,css,image,js是不会进行拦截的

20190925112508581.png

3>. 快速入门(应用)

  • ①. 创建拦截器类实现HandlerInterceptor接口
  • ②. 配置拦截器
  • ③. 测试拦截器的拦截效果
//1.创建拦截器类实现HandlerInterceptor接口
public class MyInterceptor1 implements HandlerInterceptor {
    //在目标方法执行之前 执行
    //用于身份认证、身份授权--
  //比如身份证,如果认证通过标识当前用户没有登录,需要此方法不在向下执行
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws ServletException, IOException {
       System.out.println("preHandle方法执行了......");
       return true;
}
    //在目标方法执行之后 视图对象返回之前执行
    //应用场景从modelAndView出发:将公用的模型数据(菜单的导航)在这里传到视图,也可以在这里指定视图
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
    System.out.println("postHandle方法执行了......");
    }
    //在流程都执行完毕后 执行
    //执行Handler完成执行此方法
  //应用场景:统一的异常处理、统一的日志处理
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
     System.out.println("afterCompletion方法执行了.......");
    }
}
//2.在SpringMVC的配置文件中配置
<!--配置拦截器-->
    <mvc:interceptors>
        <mvc:interceptor>
            <!--对哪些资源执行拦截操作-->
            <mvc:mapping path="/**"/>
            <bean class="com.itheima.interceptor.MyInterceptor1"/>
        </mvc:interceptor>
    </mvc:interceptors>

20190925113853878.png

//编写Controller,发请求到controller,跳转页面
@Controller
public class TargetController {
    @RequestMapping("/target")
    public ModelAndView show(){
        System.out.println("目标资源执行......");
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("name","itcast");
        modelAndView.setViewName("index.jsp");
        return modelAndView;
    }
}
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%
    System.out.println("index.jsp执行了");
%>
  你好!${name}
</body>
</html>

20190925112002721.png

4>. 拦截器详解

  • ①.preHandle( ):在目标方法执行之前 执行
  • ②.postHandle( ):在目标方法执行之后 视图对象返回之前执行
  • ③.afterCompletion( ): 在流程都执行完毕后执行

20190925112342768.png

5>. 配置多个拦截器

    <!--配置拦截器-->
      <mvc:interceptors>
          <mvc:interceptor>
              <!--对哪些资源执行拦截操作-->
              <mvc:mapping path="/**"/>
              <bean class="com.itheima.interceptor.AInterceptor"></bean>
          </mvc:interceptor>
      </mvc:interceptors>
    <mvc:interceptors>
        <mvc:interceptor>
            <!--对哪些资源执行拦截操作-->
            <mvc:mapping path="/**"/>
            <bean class="com.itheima.interceptor.AInterceptor2"></bean>
        </mvc:interceptor>
    </mvc:interceptors>

20190925113035368.png

6>. 用户登录权限控制

//1. 先编写拦截器如下:
public class PrivilegeInterceptor implements HandlerInterceptor {
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws IOException {
        //逻辑:判断用户是否登录  本质:判断session中有没有user
        HttpSession session = request.getSession();
        User user = (User) session.getAttribute("user");
        if(user==null){
            //没有登录
            response.sendRedirect(request.getContextPath()+"/login.jsp");
            return false;
        }
        //放行  访问目标资源
        return true;
    }
}
//2.然后配置该拦截器:找到项目案例的spring-mvc.xml,添加如下配置:
<!--配置权限拦截器-->
    <mvc:interceptors>
        <mvc:interceptor>
            <!--配置对哪些资源执行拦截操作-->
            <mvc:mapping path="/**"/>
            <bean class="com.itheima.interceptor.PrivilegeInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>
//在登陆页面输入用户名密码,点击登陆,通过用户名密码进行查询,
如果登陆成功,则将用户信息实体存入session,然后跳转到首页,
如果登陆失败则继续回到登陆页面
@RequestMapping("/login")
    public String login(String username,String password,HttpSession session){
        User user = userService.login(username,password);
        if(user!=null){
            //登录成功  将user存储到session
            session.setAttribute("user",user);
            return "redirect:/index.jsp";
        }
        return "redirect:/login.jsp";
    }
//service层代码如下:
public User login(String username, String password) {
            User user = userDao.findByUsernameAndPassword(username,password);
            return user;
}
//dao层代码如下:
public User login(String username, String password) {
        try {
            User user = userDao.findByUsernameAndPassword(username,password);
            return user;
        }catch (EmptyResultDataAccessException e){
            return null;
        }
    }
  • 此时仍然登陆不上,因为我们需要将登陆请求url让拦截器放行,添加资源排除的配置
<!--配置权限拦截器-->
    <mvc:interceptors>
        <mvc:interceptor>
            <!--配置对哪些资源执行拦截操作-->
            <mvc:mapping path="/**"/>
            <!--配置哪些资源排除拦截操作-->
            <mvc:exclude-mapping path="/user/login"/>
            <bean class="com.itheima.interceptor.PrivilegeInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>

7>. 拦截器测试[ 测试多个拦截器各个方法的执行时机 ]

  • 环境搭建

20190401203927815.png

1. 两个拦截器都放行

  • ①. preHandle方法按顺序执行
  • ②. postHandle和afterCompletion 按拦截器配置的逆向顺序

20190401204112254.png

2. 拦截器1放行,拦截器2不放行

  • ①. 拦截器1放行,拦截器2preHandler才会执行
  • ②. 拦截器2preHandler不放行,拦截器postHandle和afterCompletion不会执行
  • ③. 只要有一个拦截器不放行,postHandle就不会执行

20190401204437838.png

3. 拦截器1不放行,拦截器2不放行

  • ①. 拦截器1 preHandler不放行,拦截器postHandle和afterCompletion不会执行
  • ②. 拦截器1 preHandler不放行,拦截器2就不会执行

20190401204805284.png

相关文章
|
1天前
|
设计模式 前端开发 Java
步步深入SpringMvc DispatcherServlet源码掌握springmvc全流程原理
通过对 `DispatcherServlet`源码的深入剖析,我们了解了SpringMVC请求处理的全流程。`DispatcherServlet`作为前端控制器,负责请求的接收和分发,处理器映射和适配负责将请求分派到具体的处理器方法,视图解析器负责生成和渲染视图。理解这些核心组件及其交互原理,有助于开发者更好地使用和扩展SpringMVC框架。
17 4
|
19天前
|
前端开发 Java 开发者
Spring MVC中的请求映射:@RequestMapping注解深度解析
在Spring MVC框架中,`@RequestMapping`注解是实现请求映射的关键,它将HTTP请求映射到相应的处理器方法上。本文将深入探讨`@RequestMapping`注解的工作原理、使用方法以及最佳实践,为开发者提供一份详尽的技术干货。
57 2
|
2月前
|
JSON 前端开发 Java
SSM:SpringMVC
本文介绍了SpringMVC的依赖配置、请求参数处理、注解开发、JSON处理、拦截器、文件上传下载以及相关注意事项。首先,需要在`pom.xml`中添加必要的依赖,包括Servlet、JSTL、Spring Web MVC等。接着,在`web.xml`中配置DispatcherServlet,并设置Spring MVC的相关配置,如组件扫描、默认Servlet处理器等。然后,通过`@RequestMapping`等注解处理请求参数,使用`@ResponseBody`返回JSON数据。此外,还介绍了如何创建和配置拦截器、文件上传下载的功能,并强调了JSP文件的放置位置,避免404错误。
|
2月前
|
前端开发 Java 应用服务中间件
【Spring】Spring MVC的项目准备和连接建立
【Spring】Spring MVC的项目准备和连接建立
60 2
|
3月前
|
缓存 前端开发 Java
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
Soring Boot的起步依赖、启动流程、自动装配、常用的注解、Spring MVC的执行流程、对MVC的理解、RestFull风格、为什么service层要写接口、MyBatis的缓存机制、$和#有什么区别、resultType和resultMap区别、cookie和session的区别是什么?session的工作原理
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
|
2月前
|
XML 前端开发 Java
Spring,SpringBoot和SpringMVC的关系以及区别 —— 超准确,可当面试题!!!也可供零基础学习
本文阐述了Spring、Spring Boot和Spring MVC的关系与区别,指出Spring是一个轻量级、一站式、模块化的应用程序开发框架,Spring MVC是Spring的一个子框架,专注于Web应用和网络接口开发,而Spring Boot则是对Spring的封装,用于简化Spring应用的开发。
169 0
Spring,SpringBoot和SpringMVC的关系以及区别 —— 超准确,可当面试题!!!也可供零基础学习
|
3月前
|
XML 缓存 前端开发
springMVC02,restful风格,请求转发和重定向
文章介绍了RESTful风格的基本概念和特点,并展示了如何使用SpringMVC实现RESTful风格的请求处理。同时,文章还讨论了SpringMVC中的请求转发和重定向的实现方式,并通过具体代码示例进行了说明。
springMVC02,restful风格,请求转发和重定向
|
4月前
|
Java 数据库连接 Spring
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
文章是关于Spring、SpringMVC、Mybatis三个后端框架的超详细入门教程,包括基础知识讲解、代码案例及SSM框架整合的实战应用,旨在帮助读者全面理解并掌握这些框架的使用。
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
|
4月前
|
XML JSON 数据库
SpringMVC入门到实战------七、RESTful的详细介绍和使用 具体代码案例分析(一)
这篇文章详细介绍了RESTful的概念、实现方式,以及如何在SpringMVC中使用HiddenHttpMethodFilter来处理PUT和DELETE请求,并通过具体代码案例分析了RESTful的使用。
SpringMVC入门到实战------七、RESTful的详细介绍和使用 具体代码案例分析(一)
|
4月前
|
前端开发 应用服务中间件 数据库
SpringMVC入门到实战------八、RESTful案例。SpringMVC+thymeleaf+BootStrap+RestFul实现员工信息的增删改查
这篇文章通过一个具体的项目案例,详细讲解了如何使用SpringMVC、Thymeleaf、Bootstrap以及RESTful风格接口来实现员工信息的增删改查功能。文章提供了项目结构、配置文件、控制器、数据访问对象、实体类和前端页面的完整源码,并展示了实现效果的截图。项目的目的是锻炼使用RESTful风格的接口开发,虽然数据是假数据并未连接数据库,但提供了一个很好的实践机会。文章最后强调了这一章节主要是为了练习RESTful,其他方面暂不考虑。
SpringMVC入门到实战------八、RESTful案例。SpringMVC+thymeleaf+BootStrap+RestFul实现员工信息的增删改查