SpringMVC学习笔记03

1.Ajax研究

1.1 简介

什么是Ajax

  • AJAX=Asynchronous JavaScript and XML(异步的JavaScript和XML)
  • AJAX是一种无需重新加载整个网页的情况下,能够更新部分网页的技术
  • AJAX不是一种新的编程语言,而是一种用于创建更好更快以及交互性更强的WEB应用程序的技术
  • 在2005年,Google通过其Google Suggest使AJAX变得流行起来,Google Suggest能够自动帮助你完成搜索单词
  • Google Suggest使用AJAX创造出动态性极强的web页面,当你在Google的输入框输入关键字时,JavaScript会把这些字符发送到服务器,然后服务器会返回一个搜索建议的列表
  • 就和国内百度的搜索框一样
  • 传统的网页(即不用ajax技术的网页),想要更新内容或者提交一个表单,都需要重新加载整个网页
  • 使用ajax技术的网页,通过在后台服务器进行少量的数据交换,就可以实现异步局部更新
  • 使用ajax,用户可以创建接近本地桌面应用的直接,高可用,更丰富,更动态的web用户页面

伪造Ajax

我们可以使用前端的一个标签来伪造一个ajax的样子,iframe标签

  1. 新建一个module:springmvc-06,导入web支持
  2. 编写一个ajax-iframe.html 使用iframe测试,感受下效果
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>jcsune</title>
  6. </head>
  7. <body>
  8. <script type="text/javascript">
  9. window.onload=function () {
  10. var myDate=new Date();
  11. document.getElementById('currentTime').innerText=myDate.getTime();
  12. };
  13. function LoadPage(){
  14. var targetUrl=document.getElementById('url').value;
  15. console.log(targetUrl);
  16. document.getElementById("iframePosition").src=targetUrl;
  17. }
  18. </script>
  19. <div>
  20. <p>请输入要加载的地址:<span id="currentTime"></span></p>
  21. <p>
  22. <input id="url" type="text" value="https://www.baidu.com/"/>
  23. <input type="button" value="提交" onclick="LoadPage()"/>
  24. </p>
  25. </div>
  26. <div>
  27. <h3>加载页面位置:</h3>
  28. <iframe id="iframePosition" style="width:100%;height:500px"></iframe>
  29. </div>
  30. </body>
  31. </html>
  1. 使用idea开浏览器测试

SpringMVC学习笔记03 - 图1

  1. 利用Ajax可以做:
  • 注册时,输入用户名自动检测用户是否存在
  • 登录时,提示用户名密码错误
  • 删除数据行时,将行ID发送到后台,后台在数据库中删除,数据库删除成功后,在页面DOM中将数据行也删除
  • ……

1.2 JQuery.ajax

纯js原生实现Ajax这里不做介绍,有关知识可以了解下JS原生XMLHttpRequest

Ajax的核心是XMLHttpRequest对象(XHR) XHR为向服务器发送请求和解析服务器响应提供了接口,能够以异步方式从服务器获取新数据

JQuery提供多个与AJAX有关的方法

通过JQueryAJAX方法,你能够使用HTTP Get 和HTTP Post从远程服务器上请求文本、HTML、XML、或JSON,同时你能够把这些外部数据直接载入网页的被选元素中

JQuery不是生产者,而是大自然的搬运工

JQuery Ajax本质就是XMLHttpRequest,对他进行了封装,方便调用

来一个简单的测试,使用最原始的HttpServletResponse处理,最简单,最通用

  1. 配置web.xml和springmvc的配置文件

web.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
  5. version="4.0">
  6. <servlet>
  7. <servlet-name>springmvc</servlet-name>
  8. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  9. <init-param>
  10. <param-name>contextConfigLocation</param-name>
  11. <param-value>classpath:applicationContext.xml</param-value>
  12. </init-param>
  13. <load-on-startup>1</load-on-startup>
  14. </servlet>
  15. <servlet-mapping>
  16. <servlet-name>springmvc</servlet-name>
  17. <url-pattern>/</url-pattern>
  18. </servlet-mapping>
  19. <filter>
  20. <filter-name>encoding</filter-name>
  21. <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  22. <init-param>
  23. <param-name>encoding</param-name>
  24. <param-value>utf-8</param-value>
  25. </init-param>
  26. </filter>
  27. <filter-mapping>
  28. <filter-name>encoding</filter-name>
  29. <url-pattern>/*</url-pattern>
  30. </filter-mapping>
  31. </web-app>

applicationContext.xml 引入jQuery时必须配置静态资源过滤

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xmlns:mvc="http://www.springframework.org/schema/mvc"
  6. xsi:schemaLocation="http://www.springframework.org/schema/beans
  7. http://www.springframework.org/schema/beans/spring-beans.xsd
  8. http://www.springframework.org/schema/context
  9. https://www.springframework.org/schema/context/spring-context.xsd
  10. http://www.springframework.org/schema/mvc
  11. https://www.springframework.org/schema/mvc/spring-mvc.xsd">
  12. <!-- 自动扫描指定的包,下面所有注解类交给IOC容器管理 -->
  13. <context:component-scan base-package="com.jcsune.controller"/>
  14. <!--静态资源过滤-->
  15. <mvc:default-servlet-handler />
  16. <mvc:annotation-driven>
  17. <mvc:message-converters register-defaults="true">
  18. <bean class="org.springframework.http.converter.StringHttpMessageConverter">
  19. <constructor-arg value="UTF-8"/>
  20. </bean>
  21. <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
  22. <property name="objectMapper">
  23. <bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean">
  24. <property name="failOnEmptyBeans" value="false"/>
  25. </bean>
  26. </property>
  27. </bean>
  28. </mvc:message-converters>
  29. </mvc:annotation-driven>
  30. <!-- 视图解析器 -->
  31. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
  32. id="internalResourceViewResolver">
  33. <!-- 前缀 -->
  34. <property name="prefix" value="/WEB-INF/jsp/" />
  35. <!-- 后缀 -->
  36. <property name="suffix" value=".jsp" />
  37. </bean>
  38. </beans>
  1. 编写一个AjaxController
  1. package com.jcsune.controller;
  2. import org.springframework.stereotype.Controller;
  3. import org.springframework.web.bind.annotation.RequestMapping;
  4. import org.springframework.web.bind.annotation.RestController;
  5. import javax.servlet.http.HttpServletResponse;
  6. import java.io.IOException;
  7. @Controller
  8. public class AjaxController {
  9. @RequestMapping("/t1")
  10. public void ajax1(String name, HttpServletResponse response) throws IOException {
  11. if("admin".equals(name)){
  12. response.getWriter().print("true");
  13. }else{
  14. response.getWriter().print("false");
  15. }
  16. }
  17. }
  1. 导入jQuery,可以使用在线的CDN,也可以下载导入
  1. <script src="https://code.jquery.com/jquery-3.5.1.min.js"></script>
  2. <script src="${pageContext.request.contextPath}/statics/js/jquery-3.5.1.min.js"></script>
  1. 编写index.jsp测试
  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  2. <html>
  3. <head>
  4. <title>$Title$</title>
  5. <script src="${pageContext.request.contextPath}/statics/js/jquery-3.5.1.js"></script>
  6. <script>
  7. function a() {
  8. $.post({
  9. url:"${pageContext.request.contextPath}/t1",
  10. data:{"name":$("#username").val()},
  11. success:function (data,status) {
  12. alert(data);
  13. alert(status);
  14. }
  15. });
  16. }
  17. </script>
  18. </head>
  19. <body>
  20. <%--失去焦点的时候,发起一个请求(携带信息)到后台--%>
  21. 用户名:<input type="text" id="username" onblur="a()">
  22. </body>
  23. </html>
  1. 启动Tomcat测试,打开浏览器的控制台,当鼠标离开输入框时,可以看出发出了一个ajax的请求,是后台返回给我们的结果!测试成功

SpringMVC学习笔记03 - 图2

1.3 springmvc实现

实体类User

  1. package com.jcsune.pojo;
  2. import lombok.AllArgsConstructor;
  3. import lombok.Data;
  4. import lombok.NoArgsConstructor;
  5. //需要导入lombok
  6. @Data
  7. @AllArgsConstructor
  8. @NoArgsConstructor
  9. public class User {
  10. private String name;
  11. private int age;
  12. private String sex;
  13. }

获取一个集合对象,展示到前端页面

  1. @RequestMapping("/t2")
  2. public List<User> ajax2(){
  3. List<User> list = new ArrayList<User>();
  4. list.add(new User("刘也一号",23,"男"));
  5. list.add(new User("刘也二号",23,"男"));
  6. list.add(new User("刘也三号",23,"男"));
  7. return list;//由于@RestController注解,将list转成json格式返回
  8. }

前端页面:test.jsp

  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  2. <html>
  3. <head>
  4. <title>Title</title>
  5. </head>
  6. <body>
  7. <input type="button" id="btn" value="获取数据"/>
  8. <table width="80%" align="center">
  9. <tr>
  10. <td>姓名</td>
  11. <td>年龄</td>
  12. <td>性别</td>
  13. </tr>
  14. <tbody id="content"></tbody>
  15. </table>
  16. <script src="${pageContext.request.contextPath}/statics/js/jquery-3.5.1.js"></script>
  17. <script>
  18. $(function () {
  19. $("#btn").click(function () {
  20. $.post("${pageContext.request.contextPath}/t2",function (data) {
  21. console.log(data)
  22. var html="";
  23. for (var i = 0; i <data.length ; i++) {
  24. html+= "<tr>" +
  25. "<td>" + data[i].name + "</td>" +
  26. "<td>" + data[i].age + "</td>" +
  27. "<td>" + data[i].sex + "</td>" +
  28. "</tr>"
  29. }
  30. $("#content").html(html);
  31. });
  32. })
  33. })
  34. </script>
  35. </body>
  36. </html>

SpringMVC学习笔记03 - 图3

成功实现了数据回显,可以体会下Ajax的好处

1.4 注册提示效果

在这里测试一个小demo,思考一下我们平时注册的时候,输入框后面的实时提示怎么做到的,如何优化

Controller

  1. @RequestMapping("/t3")
  2. public String ajax3(String name,String pwd){
  3. String msg="";
  4. if(name!=null){
  5. //admin 这些数据应该在数据库中查
  6. if("admin".equals(name)){
  7. msg="ok";
  8. }else{
  9. msg="用户名有误";
  10. }
  11. }
  12. if(pwd!=null){
  13. //admin 这些数据应该在数据库中查
  14. if("123456".equals(pwd)){
  15. msg="ok";
  16. }else{
  17. msg="密码有误";
  18. }
  19. }
  20. return msg;
  21. }

前端页面:login.jsp

  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  2. <html>
  3. <head>
  4. <title>ajax</title>
  5. <script src="${pageContext.request.contextPath}/statics/js/jquery-3.5.1.js"></script>
  6. <script>
  7. function a1(){
  8. $.post({
  9. url:"${pageContext.request.contextPath}/t3",
  10. data:{'name':$("#name").val()},
  11. success:function (data) {
  12. if (data.toString()=='ok'){
  13. $("#userInfo").css("color","green");
  14. }else {
  15. $("#userInfo").css("color","red");
  16. }
  17. $("#userInfo").html(data);
  18. }
  19. });
  20. }
  21. function a2(){
  22. $.post({
  23. url:"${pageContext.request.contextPath}/t3",
  24. data:{'pwd':$("#pwd").val()},
  25. success:function (data) {
  26. if (data.toString()=='ok'){
  27. $("#pwdInfo").css("color","green");
  28. }else {
  29. $("#pwdInfo").css("color","red");
  30. }
  31. $("#pwdInfo").html(data);
  32. }
  33. });
  34. }
  35. </script>
  36. </head>
  37. <body>
  38. <p>
  39. 用户名:<input type="text" id="name" onblur="a1()"/>
  40. <span id="userInfo"></span>
  41. </p>
  42. <p>
  43. 密码:<input type="text" id="pwd" onblur="a2()">
  44. <span id="pwdInfo"></span>
  45. </p>
  46. </body>
  47. </html>

测试效果:动态请求响应,局部刷新

SpringMVC学习笔记03 - 图4

2.拦截器+文件上传下载

2.1 拦截器

概述

SpringMVC中的处理器拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理,开发者可以自己定义一些拦截器来实现特定的功能

过滤器与拦截器的区别:拦截器是AOP思想的具体应用

过滤器

  • servlet规范中的一部分,任何java web工程都可以使用
  • 在url-pattern中配置了/*之后,可以对所有要访问的资源进行拦截

拦截器

  • 拦截器是SpringMVC框架自己的,只有使用了SpringMVC框架的工程才可以使用
  • 拦截器只会拦截访问的控制器方法,如果访问的是jsp/html/css/image/js是不会进行拦截的

自定义拦截器

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

  1. 新建一个module,springmvc-07,添加web支持
  2. 配置web.xml和applicationContext.xml文件
  3. 编写一个拦截器
  1. package com.jcsune.interceptor;
  2. import org.springframework.web.servlet.HandlerInterceptor;
  3. import org.springframework.web.servlet.ModelAndView;
  4. import javax.servlet.http.HttpServletRequest;
  5. import javax.servlet.http.HttpServletResponse;
  6. public class MyInterceptor implements HandlerInterceptor {
  7. //在请求处理的方法之前执行
  8. //如果返回true执行下一个拦截器
  9. //如果返回false就不执行下一个拦截器
  10. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
  11. System.out.println("----------处理前-----------");
  12. return true;
  13. }
  14. //在请求处理方法执行之后进行
  15. public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
  16. System.out.println("----------处理后-----------");
  17. }
  18. //在dispatcherServlet处理后执行,做清理工作
  19. public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
  20. System.out.println("----------清理------------");
  21. }
  22. }
  1. 在applicationContext.xml配置文件中配置拦截器
  1. <!--关于拦截器的配置-->
  2. <mvc:interceptors>
  3. <mvc:interceptor>
  4. <!--/** 包括路径及其子路径-->
  5. <!--/admin/* 拦截的是/admin/add等等这种 , /admin/add/user不会被拦截-->
  6. <!--/admin/** 拦截的是/admin/下的所有-->
  7. <mvc:mapping path="/**"/>
  8. <!--bean配置的就是拦截器-->
  9. <bean class="com.jcsune.interceptor.MyInterceptor"/>
  10. </mvc:interceptor>
  11. </mvc:interceptors>
  1. 编写一个Controller,接收请求
  1. package com.jcsune.controller;
  2. import org.springframework.stereotype.Controller;
  3. import org.springframework.web.bind.annotation.RequestMapping;
  4. import org.springframework.web.bind.annotation.RestController;
  5. //测试拦截器的控制器
  6. @RestController
  7. public class InterceptorController {
  8. @RequestMapping("/t2")
  9. public String testFunction(){
  10. System.out.println("控制器中的方法执行了");
  11. return "hello";
  12. }
  13. }
  1. 前端 index.jsp
  1. <a href="${pageContext.request.contextPath}/t2">拦截器测试</a>
  1. 启动Tomcat测试一下

SpringMVC学习笔记03 - 图5

2.2 登录判断验证

验证用户是否登录(认证用户)

实现思路

  1. 有一个登录页面,需要写一个controller访问页面
  2. 登录页面有一提交表单的动作,需要在Controller中处理,判断用户名和密码是否正确,如果正确,向session中写入用户信息,返回登录成功
  3. 拦截用户请求,判断用户是否登录,如果用户已经登录,放行,如果用户未登录,跳转到登录页面

测试:

  1. 编写一个登录页面 login.jsp
  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  2. <html>
  3. <head>
  4. <title>Title</title>
  5. </head>
  6. <h1>登录页面</h1>
  7. <hr>
  8. <body>
  9. <form action="${pageContext.request.contextPath}/user/login">
  10. 用户名:<input type="text" name="username"><br>
  11. 密码:<input type="password" value="pwd"><br>
  12. <input type="submit" value="提交">
  13. </form>
  14. </body>
  15. </html>
  1. 编写一个Controller处理请求
  1. package com.jcsune.controller;
  2. import org.springframework.stereotype.Controller;
  3. import org.springframework.web.bind.annotation.RequestMapping;
  4. import javax.servlet.http.HttpSession;
  5. @Controller
  6. @RequestMapping("/user")
  7. public class UserController {
  8. //跳转到登录页面
  9. @RequestMapping("/jumplogin")
  10. public String jumpLogin() throws Exception{
  11. return "login";
  12. }
  13. //跳转到成功页面
  14. @RequestMapping("/jumpsuccess")
  15. public String jumpSuccess() throws Exception{
  16. return "success";
  17. }
  18. //登录提交
  19. @RequestMapping("/login")
  20. public String Login(HttpSession session,String username,String pwd)throws Exception{
  21. //向session纪录用户身份信息
  22. System.out.println("接收前端==="+username);
  23. session.setAttribute("user",username);
  24. return "success";
  25. }
  26. //退出登录
  27. @RequestMapping("logout")
  28. public String logout(HttpSession session)throws Exception{
  29. //session 过期
  30. session.invalidate();
  31. return "login";
  32. }
  33. }
  1. 编写一个登录成功的页面 success.jsp
  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  2. <html>
  3. <head>
  4. <title>Title</title>
  5. </head>
  6. <body>
  7. <h1>登录成功页面</h1>
  8. <hr>
  9. ${user}
  10. <a href="${pageContext.request.contextPath}/user/logout">注销</a>
  11. </body>
  12. </html>
  1. 在index页面上测试跳转,启动Tomcat测试,未登录也可以跳转到主页
  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  2. <html>
  3. <head>
  4. <title>Title</title>
  5. </head>
  6. <h1>登录页面</h1>
  7. <hr>
  8. <body>
  9. <form action="${pageContext.request.contextPath}/user/login">
  10. 用户名:<input type="text" name="username"><br>
  11. 密码:<input type="password" value="pwd"><br>
  12. <input type="submit" value="提交">
  13. </form>
  14. </body>
  15. </html>
  1. 编写用户登录拦截器
  1. package com.jcsune.interceptor;
  2. import org.springframework.web.servlet.HandlerInterceptor;
  3. import org.springframework.web.servlet.ModelAndView;
  4. import javax.servlet.http.HttpServletRequest;
  5. import javax.servlet.http.HttpServletResponse;
  6. import javax.servlet.http.HttpSession;
  7. public class LoginInterceptor implements HandlerInterceptor {
  8. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
  9. //如果是登录页面则放行
  10. System.out.println("uri:"+request.getRequestURI());
  11. if(request.getRequestURI().contains("login")){
  12. return true;
  13. }
  14. HttpSession session=request.getSession();
  15. //如果用户已登录也放行
  16. if(session.getAttribute("user")!=null){
  17. return true;
  18. }
  19. //用户没有登录跳转到登录页面
  20. request.getRequestDispatcher("/WEB-INF/jsp/logon.jsp").forward(request,response);
  21. return false;
  22. }
  23. public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
  24. }
  25. public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
  26. }
  27. }
  1. 在springmvc的配置文件中注册拦截器
  1. <!--关于拦截器的配置-->
  2. <mvc:interceptors>
  3. <mvc:interceptor>
  4. <!--/** 包括路径及其子路径-->
  5. <!--/admin/* 拦截的是/admin/add等等这种 , /admin/add/user不会被拦截-->
  6. <!--/admin/** 拦截的是/admin/下的所有-->
  7. <mvc:mapping path="/**"/>
  8. <!--bean配置的就是拦截器-->
  9. <!-- <bean class="com.jcsune.interceptor.MyInterceptor"/>-->
  10. <bean id="loginInterceptor" class="com.jcsune.interceptor.LoginInterceptor"/>
  11. </mvc:interceptor>
  12. </mvc:interceptors>
  1. 再次重启Tomcat测试

2.3 文件上传和下载

准备工作

文件上传是项目开发中最常见的功能之一,springmvc可以很好的支持文件上传,但是springmvc上下文中默认没有装配multipartResolver,因此默认情况下其不能处理文件上传工作,如果想使用spring的文件上传功能,则需要在上下文中配置multipartResolver

前端表单要求:为了能上传文件,必须将表单的method设置为POST,并将enctype设置为multipart/form-data,只有在这样的情况下,浏览器才会把用户选择的文件以二进制数据发送给服务器

对表中的enctype属性做个详细的说明

  • application/x-www=form-urlencoded:默认方式,只处理表单域中的value属性值,采用这种编码方式的表单会将表单域中的值处理成URL编码方式
  • multipart/form-data:这种编码方式会以二进制流的方式来处理表单数据,这种编码方式会把文件域指定文件的内容也封装到请求参数中,不会对字符编码。
  • text/plain:除了把空格转换为 “+” 号外,其他字符都不做编码处理,这种方式适用直接通过表单发送邮件。
  1. <form action="" enctype="multipart/form-data" method="post">
  2. <input type="file" name="file"/>
  3. <input type="submit">
  4. </form>

一旦设置了enctype为multipart/form-data,浏览器即会采用二进制流的方式来处理表单数据,而对于文件上传的处理则涉及在服务器端解析原始的HTTP响应,在2003年,Apache Software Foundation发布了开源的Commons FileUpload组件其很快成为Servlet/jsp程序员上传文件的最佳选择

  • Servlet3.0规范已经提供方法来处理文件上传,但这种上传需要在Servlet中完成
  • 而SpringMVC则提供了更简单的封装
  • SpringMVC为文件的上传提供了直接的支持,这种支持是用即插即用的MultipartResolver实现的
  • SpringMVC使用Apache Commons FileUpload技术实现了一个MultipartResolver实现类
  • CommonMultipartResolver,因此SpringMVC的文件上传还需要依赖Apache Commons FileUpload的组件

2.3.1 文件上传

  1. 导入文件上传的jar包 commons-fileupload
  1. <!--文件上传-->
  2. <dependency>
  3. <groupId>commons-fileupload</groupId>
  4. <artifactId>commons-fileupload</artifactId>
  5. <version>1.3.3</version>
  6. </dependency>
  7. <!--servlet-api导入高版本的-->
  8. <dependency>
  9. <groupId>javax.servlet</groupId>
  10. <artifactId>javax.servlet-api</artifactId>
  11. <version>4.0.1</version>
  12. </dependency>
  1. 配置bean: multipartResolver

注意这个bean的id必须为multipartResolver,否则上传文件会报400的错误

  1. <!--文件上传配置-->
  2. <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
  3. <!-- 请求的编码格式,必须和jSP的pageEncoding属性一致,以便正确读取表单的内容,默认为ISO-8859-1 -->
  4. <property name="defaultEncoding" value="utf-8"/>
  5. <!-- 上传文件大小上限,单位为字节(10485760=10M) -->
  6. <property name="maxUploadSize" value="10485760"/>
  7. <property name="maxInMemorySize" value="40960"/>
  8. </bean>

CommonsMultipartFile的常用方法:

  • String getOriginalFilename():获取上传文件的原名
  • InputStream getInputStream():获取文件流
  • void transfer To(File dest):将上传文件保存到一个目录文件中

接着去实际测试一波

  1. 编写前端页面 index.jsp
  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  2. <html>
  3. <head>
  4. <title>$Title$</title>
  5. </head>
  6. <body>
  7. <form action="/upload" enctype="multipart/form-data" method="post">
  8. <input type="file" name="file"/>
  9. <input type="submit" value="upload">
  10. </form>
  11. </body>
  12. </html>
  1. Controller
  1. package com.jcsune.controller;
  2. import org.springframework.stereotype.Controller;
  3. import org.springframework.web.bind.annotation.RequestMapping;
  4. import org.springframework.web.bind.annotation.RequestParam;
  5. import org.springframework.web.multipart.commons.CommonsMultipartFile;
  6. import javax.servlet.http.HttpServletRequest;
  7. import java.io.*;
  8. @Controller
  9. public class FileController {
  10. //@RequestParam("file") 将name=file控件得到的文件封装成CommonsMultipartFile 对象
  11. //批量上传CommonsMultipartFile则为数组即可
  12. @RequestMapping("/upload")
  13. public String fileUpload(@RequestParam("file") CommonsMultipartFile file , HttpServletRequest request) throws IOException {
  14. //获取文件名 : file.getOriginalFilename();
  15. String uploadFileName = file.getOriginalFilename();
  16. //如果文件名为空,直接回到首页!
  17. if ("".equals(uploadFileName)){
  18. return "redirect:/index.jsp";
  19. }
  20. System.out.println("上传文件名 : "+uploadFileName);
  21. //上传路径保存设置
  22. String path = request.getServletContext().getRealPath("/upload");
  23. //如果路径不存在,创建一个
  24. File realPath = new File(path);
  25. if (!realPath.exists()){
  26. realPath.mkdir();
  27. }
  28. System.out.println("上传文件保存地址:"+realPath);
  29. InputStream is = file.getInputStream(); //文件输入流
  30. OutputStream os = new FileOutputStream(new File(realPath,uploadFileName)); //文件输出流
  31. //读取写出
  32. int len=0;
  33. byte[] buffer = new byte[1024];
  34. while ((len=is.read(buffer))!=-1){
  35. os.write(buffer,0,len);
  36. os.flush();
  37. }
  38. os.close();
  39. is.close();
  40. return "redirect:/index.jsp";
  41. }
  42. /*
  43. * 采用file.Transto 来保存上传的文件
  44. */
  45. @RequestMapping("/upload2")
  46. public String fileUpload2(@RequestParam("file") CommonsMultipartFile file, HttpServletRequest request) throws IOException {
  47. //上传路径保存设置
  48. String path = request.getServletContext().getRealPath("/upload");
  49. File realPath = new File(path);
  50. if (!realPath.exists()){
  51. realPath.mkdir();
  52. }
  53. //上传文件地址
  54. System.out.println("上传文件保存地址:"+realPath);
  55. //通过CommonsMultipartFile的方法直接写文件(注意这个时候)
  56. file.transferTo(new File(realPath +"/"+ file.getOriginalFilename()));
  57. return "redirect:/index.jsp";
  58. }
  59. }
  1. 测试上传文件,OK

SpringMVC学习笔记03 - 图6

SpringMVC学习笔记03 - 图7

SpringMVC学习笔记03 - 图8

2.3.2 文件下载

文件下载步骤:

  • 设置response响应头
  • 读取文件—InputStream
  • 写出文件—OutputStream
  • 执行操作
  • 关闭流(先开后关)

代码实现

  1. @RequestMapping(value="/download")
  2. public String downloads(HttpServletResponse response ,HttpServletRequest request) throws Exception{
  3. //要下载的图片地址
  4. String path = request.getServletContext().getRealPath("/upload");
  5. String fileName = "spring.jpg";
  6. //1、设置response 响应头
  7. response.reset(); //设置页面不缓存,清空buffer
  8. response.setCharacterEncoding("UTF-8"); //字符编码
  9. response.setContentType("multipart/form-data"); //二进制传输数据
  10. //设置响应头
  11. response.setHeader("Content-Disposition",
  12. "attachment;fileName="+URLEncoder.encode(fileName, "UTF-8"));
  13. File file = new File(path,fileName);
  14. //2、 读取文件--输入流
  15. InputStream input=new FileInputStream(file);
  16. //3、 写出文件--输出流
  17. OutputStream out = response.getOutputStream();
  18. byte[] buff =new byte[1024];
  19. int index=0;
  20. //4、执行 写出操作
  21. while((index= input.read(buff))!= -1){
  22. out.write(buff, 0, index);
  23. out.flush();
  24. }
  25. out.close();
  26. input.close();
  27. return null;
  28. }

前端:

  1. <a href="/download">点击下载</a>

测试:

SpringMVC学习笔记03 - 图9