1、1第8章 SpringMVC框架03文件上传下载及异步数据传输框架程序设计(Java)28.3.0学习目标前台上传文件到后台前台上传文件到后台1文件下载文件下载2异步数据传输异步数据传输3软件工程系本科课件框架程序设计java38.3.1文件上传文件上传o 例子1 上传一个文件到工程中的upload目录,上传后显示上传成功n 上传文件abc.txtn 操作成功提示n 同时,在服务器的upload目录中可以看到该文件已经存在软件工程系本科课件框架程序设计java48.3.1文件上传文件上传-环境配置环境配置o 步骤1:环境配置o(1)引入文件上传所需的jar包n commons-fileuplo
2、ad-1.3.3.jarn 下载地址:http:/commons.apache.org/proper/commons-fileupload/download_fileupload.cgin commons-io-2.0.jarn 下载地址:http:/commons.apache.org/proper/commons-io/download_io.cgi软件工程系本科课件框架程序设计java58.3.1文件上传文件上传-环境配置环境配置o(2)在springMVC的基本配置文件中配置MultipartResolver来解析文件上传请求n n n n n 说明,上述配置仅仅只需要一次软件工程系本
3、科课件框架程序设计java68.3.1文件上传文件上传o 步骤2:在WebContent/jsp目录下编写上传文件操作页面upload.jspn n 文件:n n o 说明:n 表单提交方式一定是postn 表单要指定enctype属性为multipart/form-data,在使用包含文件上传控件的表单时,必须使用该值n 文件选择控件软件工程系本科课件框架程序设计java78.3.1文件上传文件上传o 步骤2:在WebContent/jsp目录下编写文件上传成功页面download.jspn 文件上传成功!软件工程系本科课件框架程序设计java88.3.1文件上传文件上传o 步骤3:新建上传
4、控制器类springmvc_demo.controller.UploadControllern Controllern public class UploadController n RequestMapping(/upload)n public String updoad()nreturn upload;n n 软件工程系本科课件框架程序设计java98.3.1文件上传文件上传o步骤3:在控制器中加入处理表单提交请求的actionnRequestMapping(/upload_submit)npublic ModelAndView fileUpload(RequestParam(file)M
5、ultipartFile file,HttpServletRequest request)nthrows IOException n/获取文件名nString filename=file.getOriginalFilename();n/获取文件保存到服务器上的地址nString path=request.getServletContext().getRealPath()+”/upload/”+filename;nFile f=new File(path);n/判断upload文件夹是否存在,如果不存在则创建nif(!f.getParentFile().exists()nf.getParentF
6、ile().mkdirs();nn/将上传的文件传输到指定路径nfile.transferTo(f);n/返回视图nModelAndView mv=new ModelAndView(download);nmv.addObject(filename,filename);/将文件名传递到下一个页面nreturn mv;n软件工程系本科课件框架程序设计java108.3.1文件上传文件上传o 步骤4:因为题目要求在download.jsp页面中显示文件名,一次download.jsp页面修改如下:n 文件$filename上传成功!软件工程系本科课件框架程序设计java118.3.2文件下载文件下载
7、o 例子2 上传一个文件到工程中upload目录,上传后显示上传成功n 上传文件abc.txtn 操作成功提示n 同时,单击下载超链接可以下载文件到本地软件工程系本科课件框架程序设计java128.3.2文件下载文件下载o 步骤1:修改文件上传成功页面download.jspn 文件$filename上传成功!n 需要时可以下载该文件。n 大家思考一下,下载的超链接应该是什么?n/springmvc_demo/upload/上传的文件名n 说明:n 绿色部分代表项目部署在tomcat中的路径(项目路径)n 蓝色部分代表路径下的upload文件夹n 红色部分代表用户上传的文件名称软件工程系本科课
8、件框架程序设计java138.3.2文件下载文件下载o步骤2:修改UploadControllernRequestMapping(/upload_submit)npublic ModelAndView fileUpload(RequestParam(file)MultipartFile file,HttpServletRequest request)nthrows IOException n/获取文件名nString filename=file.getOriginalFilename();n/获取上传文件路径nString path=request.getServletContext().ge
9、tRealPath(/upload/)+filename;nFile f=new File(path);n/判断upload文件夹是否存在,如果不存在则创建nif(!f.getParentFile().exists()nf.getParentFile().mkdirs();nn/将上传的文件传输到指定路径nfile.transferTo(f);n/返回视图nModelAndView mv=new ModelAndView(download);nmv.addObject(filename,filename);n/将下载该文件的url传递到前台nString uripath=/springmvc_
10、demo/upload/+filename;nmv.addObject(uripath,uripath);n/获取服务器上nreturn mv;n软件工程系本科课件框架程序设计java148.3.2文件下载文件下载o 步骤3:修改文件上传成功页面download.jspn 文件$requestScope.filename上传成功!n 需要时可以下载该文件。软件工程系本科课件框架程序设计java158.3.2文件下载文件下载o 单击下载发现:o 页面报404(找不到文件)的错误o 原因何在?软件工程系本科课件框架程序设计java168.3.2文件下载文件下载o 分析404原因:o web.xml
11、文件中配置的DispatcherServlet的映射地址n nspringmvcn/nn DispatcherServlet可以拦截所有用户请求,因此,当我们访问静态资源时,它也会拦截并且寻找相应的action去处理,当然我们没有定义action处理,因此就会报404错误n 现在,我们想直接访问项目中的js/css/jpg/gif等静态资源,怎么办呢?软件工程系本科课件框架程序设计java178.3.2文件下载文件下载o 有三种办法,这里用最简单的一种n 在spring的配置文件中添加如下行:问题得到解决n n 软件工程系本科课件框架程序设计java188.3.2文件下载文件下载o 上述下载功
12、能遇到的问题:o 左键点击下载是打开文件,右键选择链接另存为时才打开下载对话框,感觉怪怪的,有没有更好的方式呢?软件工程系本科课件框架程序设计java198.3.2文件下载文件下载o 例子3 在例2基础上使用springMVC框架实现下载n 上传文件abc.txtn 操作成功提示n 点击下载弹出提示n(注:不同浏览器效果不同)软件工程系本科课件框架程序设计java208.3.2文件下载文件下载o步骤1:修改UploadController,增加接收下载请求的actionnRequestMapping(/download)npublic ResponseEntity downloadFlie(S
13、tring filename,HttpServletRequest request)throws IOException n/获取要下载文件字节流nServletContext servletContext=request.getServletContext();nInputStream in=servletContext.getResourceAsStream(/upload/+filename);n/设置下载页面的内容:将字节流文件转换为字节数组bodynbyte body=new bytein.available();nin.read(body);n/设置下载页面头nHttpHeader
14、s headers=new HttpHeaders();nheaders.add(Content-Disposition,attachment;filename=+filename);n/设置下载页面的状态nHttpStatus statusCode=HttpStatus.OK;n/根据页面内容、页面头、页面状态创建并跳转到该页面(实际返回的是下载文件数据)nResponseEntity response=new ResponseEntity(body,headers,statusCode);nreturn response;n软件工程系本科课件框架程序设计java218.3.2文件下载文件下
15、载o 步骤2:修改文件上传成功页面download.jspn 文件$filename上传成功!n 需要时可以下载该文件。o 说明:下载链接其实是提交到后台的action进行处理的 第十二次作业第十二次作业o 根据本节课例子,实现图片的上传和下载。上传文件要求放在工程文件夹下的files文件夹中框架程序设计java22软件工程系本科课件框架程序设计java238.3.3异步数据传输异步数据传输o 同步:必须等待用户当前操作完成之后才能继续下一个操作o 异步:无需等待用户操作完成,即可进行下一个操作o 同步:比如跳转页面的请求o 异步:比如ajax请求o ajax异步请求是在企业项目开发中应用的最
16、多的请求方式,可以提高用户体验软件工程系本科课件框架程序设计java248.3.3异步数据传输异步数据传输o 例子4 用户登录:输入用户名、密码,登录成功到成功页面,登录失败到失败页面,这里不访问数据库,假定用户名:张三、密码:111为登录成功,使用springmvc实现。运行如下o 什么都不输入,提交,登录失败o 输入用户名张三、密码111,登陆成功显示用户名软件工程系本科课件框架程序设计java258.3.3异步数据传输异步数据传输o 步骤1:修改登录页面login.jspn将jquery-3.3.1.min.js文件放到工程WebContent/scripts文件夹中n 在页面中引入jq
17、uery文件n修改提交按钮,加入onclick事件软件工程系本科课件框架程序设计java268.3.3异步数据传输异步数据传输o 修改登录页面login.jspo编写js函数login_submitnnfunction login_submit()n/异步请求的urlnvar url=/springmvc_demo/ajax_submit;n/异步请求的参数nvar param=username:$(inputname=username).val(),password:$(inputname=password).val();n/使用$.post方法进行异步提交n/data为后台返回的数据n$.
18、post(url,param,function(data)nalert(data);n);nn软件工程系本科课件框架程序设计java278.3.3异步数据传输异步数据传输o 步骤2:在LoginController中新增处理异步请求的actionnRequestMapping(/ajax_submit)nResponseBodynpublic String login_submit(String username,String password)n/业务逻辑代码nLogin log=new Login();nboolean result=log.execute(username,passwor
19、d);nif(result)nreturn 登陆成功+username;nelsenreturn 登陆失败;nnoResponseBody表示提交返回数据,不是跳转的地址软件工程系本科课件框架程序设计java288.3.3异步数据传输异步数据传输o运行程序,单击提交发现中文乱码,如何解决?o需要设置RequestMapping注解的produces属性,如下:n RequestMapping(value=/ajax_submit,produces=text/html;charset=UTF-8)n说明:produces=text/html;charset=UTF-8处理发送到前台的中文乱码问题第十三次作业第十三次作业o 改造第11次作业,使用springMVC和ajax进行员工(员工id,员工密码)登录,要求登录输入id为001,密码为system的值时弹出xxx用户登录成功提示,否则弹出登录失败提示(参考本节课ajax请求案例)框架程序设计java29