




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
单元7异常处理与文件的上传与下载《JavaWeb应用开发》了解系统异常的相关概念熟悉异常处理的相关方法了解文件上传和下载的功能熟悉文件上传和下载的相关工具知识目标能够理解声明式异常处理能够熟练使用Servlet容器实现声明式异常处理能够理解编程式异常处理能够熟练使用try_catch实现编程式异常处理能够实现文件的上传功能能够实现文件的下载功能能力目标培养学生软件开发的安全意识培养学生的工匠精神,追求卓越的软件开发品质培养学生的社会责任感素质目标学习目标某商城系统中商品信息的异常处理任务7.1任务描述和技术分析4技术分析任务描述在系统的开发过程中,不可避免会碰到各种各样的异常。如何正确高效的解决异常,给用户更好的使用检验,是我们在项目开发过程中需要持续努力的。本任务我们通过商品信息管理中遇到的异常处理为例,介绍Servlet容器和try_catch编程方法来解决声明式异常和编程式异常。在处理异常的过程中,需要根据异常的发生情况和实际问题进行分类处理,通常分为声明式异常和编程式异常。声明式异常通过Servlet容器(如Tomcat、Jetty等)可以通过配置web.xml文件来解决声明式异常,编程式异常则是通过try-catch块来捕获和处理异常。支撑知识--异常处理简介/01异常处理简介异常就是有异于常态,和正常情况不一样,有错误发生。在java中,阻止当前方法或作用域的情况,称之为异常。主要包括如下几个异常:Throwable类Error类Exception类RuntimeException异常检查异常异常:Throwable类图7-1Throwable类在java异常的体系中,所有不正常类都继承于Throwable类。Throwable主要包括两个大类,一个是Error类,另一个是Exception类,他们之间的继承关系如图7-1所示。Error类中包括虚拟机错误和线程死锁,一旦Error出现了,程序就彻底崩溃,被称为程序终结者。Exception类,也就是通常所说的“异常”。主要指编码、环境、用户操作输入出现问题,Exception主要包括两大类,非检查异常(RuntimeException)和检查异常,一般指除RuntimeException之外的其他异常。异常:RuntimeException异常RuntimeException异常主要包括以下四种异常:空指针异常数组下标越界异常类型转换异常算术异常。RuntimeException异常会由java虚拟机自动抛出并自动捕获,此类异常的出现绝大数情况是代码本身有问题,应该从逻辑上去解决并改进代码。图7-4RuntimeException异常异常:检查异常引起检查异常的原因多种多样,例如文件不存在、类找不到、或者是连接错误等等。与RuntimeException运行异常不同,该异常我们必须手动在代码里添加捕获语句来处理该异常或将异常抛出处理,这也是我们学习异常语句中主要处理的异常对象。图7-5检查异常支撑知识--
声明式异常处理—Servelt容器实现/02Servelt容器实现在程序设计中,声明式异常处理是通过配置文件指定在发生异常时应该执行的操作,将异常处理逻辑与业务逻辑分离的一种方式。在声明式异常处理中,开发者不需要显式地在代码中编写try-catch块,而是通过配置文件将异常与处理逻辑关联起来。当一个Servlet抛出一个异常时,Web容器在使用了exception-type元素的web.xml中搜索与抛出异常类型相匹配的配置。因此,必须在web.xml中使用error元素来指定对特定异常或HTTP状态码作出相应的Servlet调用。Servelt容器实现以下是错误处理的Servlet可以访问的请求属性列表,用来分析错误/异常的性质。如表7-1所示。错误/异常描述javax.servlet.error.status_code该属性给出状态码,状态码可被存储,并在存储为java.lang.Integer数据类型后可被分析javax.servlet.error.exception_type该属性给出异常类型的信息,异常类型可被存储,并在存储为java.lang.Class数据类型后可被分析。javax.servlet.error.message该属性给出确切错误消息的信息,信息可被存储,并在存储为java.lang.String数据类型后可被分析。javax.servlet.error.request_uri该属性给出有关URL调用Servlet的信息,信息可被存储,并在存储为java.lang.String数据类型后可被分析。javax.servlet.error.exception该属性给出异常产生的信息,信息可被存储,并在存储为java.lang.Throwable数据类型后可被分析。javax.servlet.error.servlet_name该属性给出Servlet的名称,名称可被存储,并在存储为java.lang.String数据类型后可被分析。表7-1错误/异常表在web.xml中使用<error>元素配置异常处理。可以配置特定的异常类型<exception-type>或者特定的HTTP错误码,如<error-code>。对应的处理页面通过<location>元素指定。Servelt容器实现:web.xml配置异常处理创建项目Unit7_task1,项目的web.xml中配置异常处理,代码如下。<?xmlversion="1.0"encoding="UTF-8"?><web-appxmlns="/xml/ns/javaee"xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/xml/ns/javaee/xml/ns/javaee/web-app_3_1.xsd"version="3.1"><!--其他配置--><!--配置声明式异常处理--><error><!--配置特定异常类型--><exception-type>java.lang.Exception</exception-type><!--指定异常时的处理页面--><location>/errors/generic-error.jsp</location></error><error><!--配置特定HTTP错误码--><error-code>404</error-code><!--指定404错误时的处理页面--><location>/errors/not-found.jsp</location></error></web-app>在此例子中,当发生java.lang.Exception类型的异常时,将重定向到/errors/generic-error.jsp页面;当发生HTTP错误码为404时,将重定向到/errors/not-found.jsp页面。在项目中的errors目录下要创建generic-error.jsp和not-found.jsp页面,用于展示相应的错误信息。这样配置后,当应用程序发生相应的异常或错误时,Servlet容器将会根据web.xml中的配置自动将请求重定向到指定的错误页面,实现了声明式异常处理。这使得异常处理逻辑与业务逻辑分离,提高了代码的可维护性。支撑知识--
编程式异常处理—try_catch实现/03编程式异常处理编程式异常处理主要通过使用try-catch块来捕获和处理异常。在Java中,try-catch块是一种常见的异常处理机制,允许开发者在可能抛出异常的代码块中捕获并处理异常。try块负责捕获异常,一旦try中发现异常,程序的控制权将被移交给catch块中的异常处理程序。要注意的是,try语句块不可以独立存在,必须与catch或者finally块并存。(1)try块出现异常后,跳转到catch代码块执行。执行完catch块之后程序跳出catch块,继续执行后面的代码。编写catch块要注意的是,多个catch块处理的异常类,要按照先catch子类后catch父类的处理方式,因为会异常会由上而下,就近处理(2)catch块finally块是最终执行的代码,不管理有没有异常抛出或抛出的异常有没有被捕获执行,finally块一定会执行,一般用于关闭和释放资源。(3)finally块try_catch异常处理示例在项目Unit7_task1中创建包com.example.unit7,包中创建类Example71publicclassExample71{publicstaticvoidmain(String[]args){try{//可能抛出异常的代码intresult=divide(10,0);System.out.println("Result:"+result);//这行代码不会执行}catch(ArithmeticExceptione){//捕获ArithmeticException异常,并处理System.out.println("Error:Divisionbyzero");//可以记录日志、发送通知等处理逻辑}finally{//可选的finally块,用于清理资源System.out.println("Finallyblockexecuted");}//程序继续执行,不受异常影响System.out.println("Programcontinues...");}
//一个可能抛出ArithmeticException的方法privatestaticintdivide(intdividend,intdivisor){returndividend/divisor;}}图7-6测试结果上述程序在运行时会抛出ArithmeticException,因为在divide方法中尝试对10除以0,而除数不能为0。由于异常被捕获,程序不会中断执行,而是进入catch块中处理异常。因此,输出会显示错误信息和"Finallyblockexecuted",而try-catch结构之后的"Programcontinues..."也会执行。程序的运行结果如图7-6所示。任务实现任务在网上商城系统中,我们将所有的异常进行处理,在数据访问层操作数据库时主要有检查异常,通过try_catch方法进行处理,在Servelt处理时进行声明式异常处理,通过在web.xml中进行配置来让异常在前端页面进行信息展示。用try_catch方法进行编程式异常处理,主要针对系统代码内的异常进行捕捉和处理,保证系统的正常运行某商城系统中商品信息的异常处理任务实现某商城系统中商品详细信息的上传与下载任务7.2任务描述和技术分析20技术分析任务描述在商城系统中,在对商品的信息进行操作时,会涉及到商品的图片上传,以更好的给用户展示商品信息,同时,商家可能需要对商品的所有图片进行打包下载。在Servlet技术中实现文件的上传,需要考虑借助第三方工具或者通过注解标注的方式进行操作,通常,上传的文件需要存储在服务器的特定目录中,这可以使用JavaI/O或第三方库(如ApacheCommonsFileUpload)来处理文件的存储。同时,需要考虑安全性,防止恶意文件上传和执行,可以通过设置文件大小限制、文件类型限制、检查文件内容等方式来提高安全性。对于文件的下载,需要设置响应头,告诉浏览器响应内容的类型和如何处理。支撑知识--文件上传/01文件上传通过HTTP上传文件,需要将HTML表单的enctype属性设置为multipart/form-data。这允许表单将其数据作为多部分MIME消息发送,每部分可以包含一个文件内容。利用ApacheCommonsFileUpload对文件上传的丰富处理能力,实现servlet对文件的上传功能。Servlet可以与HTML的form标签一起使用,允许用户上传文件到服务器。上传的文件可以是文本文件或图像文件或任何文档。上传文件需要引入的jar文件:commons-fileupload.jar和commons-io.jar,通过maven依赖引入。文件上传(1)创建项目,引入maven依赖<dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>4.0.1</version></dependency><dependency><groupId>javax.servlet</groupId><artifactId>jstl</artifactId><version>1.2</version></dependency><dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.4</version></dependency><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>1.4</version></dependency>文件上传(2)创建文件上传页面文件上传需要给用户提供一个操作文件上传的页面,页面中创建一个文件上传表单,有几点需要特别注意:表单method属性应该设置为POST方法,不能使用GET方法;表单enctype属性应该设置为multipart/form-data;表单action属性应该设置为在后端服务器上处理文件上传的Servlet文件。文件上传(2)创建文件上传页面在webapp下创建upload.jsp页面文件,在表单的form标签中,设置了表单提交方式为post,同时enctype的类型为“multipart/form-data”。<%@pagelanguage="java"contentType="text/html;charset=UTF-8"pageEncoding="UTF-8"
isELIgnored="false"%><!DOCTYPEhtmlPUBLIC"-//W3C//DTDHTML4.01Transitional//EN""/TR/html4/loose.dtd"><html><head><metahttp-equiv="Content-Type"content="text/html;charset=UTF-8"><title>文件上传实例</title></head><body><h1>文件上传实例</h1><formmethod="post"action="
${pageContext.request.contextPath}/UploadServlet"enctype="multipart/form-data">
选择一个文件:<inputtype="file"name="uploadFile"/><inputtype="submit"value="上传"/></form></body></html>文件上传(3)编写Servlet项目src的main目录的java下,创建包com.example.unit7,包中创建UploadServlet类,接收文件上传请求并处理。根据给定后端的接收地址,将上传的文件存放于WEB-INF目录下。首先,判断上传文件的保存目录是否存在,如果不存在则创建目录,如果存在,利用Apache文件上传组件接收文件,通过文件流的形式读取文件并进行存储。文件上传结束后,返回对应的结果。文件上传(3)编写Servlet//解决上传文件名的中文乱码
upload.setHeaderEncoding("UTF-8");//3、判断提交上来的数据是否是上传表单的数据
if(!ServletFileUpload.isMultipartContent(request)){//按照传统方式获取数据
return;}//4、使用ServletFileUpload解析器解析上传数据,解析结果返回的是一个List<FileItem>集合,每一个FileItem对应一个Form表单的输入项
List<FileItem>list=upload.parseRequest(request);for(FileItemitem:list){//如果fileitem中封装的是普通输入项的数据
if(item.isFormField()){Stringname=item.getFieldName();//解决普通输入项的数据的中文乱码问题
Stringvalue=item.getString("UTF-8");//value=newString(value.getBytes("iso8859-1"),"UTF-8");System.out.println(name+"="+value);}else{//如果fileitem中封装的是上传文件publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{//设置上传文件的保存目录,将上传的文件存放于WEB-INF目录下,不允许外界直接访问,保证上传文件的安全
StringsavePath=this.getServletContext().getRealPath("/WEB-INF/upload");System.out.println(savePath);Filefile=newFile(savePath);//判断上传文件的保存目录是否存在
if(!file.exists()&&!file.isDirectory()){System.out.println(savePath+"目录不存在,需要创建");//创建目录
file.mkdir();}//消息提示
Stringmessage="";try{//使用Apache文件上传组件处理文件上传步骤:
//1、创建一个DiskFileItemFactory工厂
DiskFileItemFactoryfactory=newDiskFileItemFactory();//2、创建一个文件上传解析器
ServletFileUploadupload=newServletFileUpload(factory);文件上传(3)编写Servlet
out.write(buffer,0,len);}//关闭输入流
in.close();//关闭输出流
out.close();//删除处理文件上传时生成的临时文件
item.delete();message="文件上传成功!";}}}catch(Exceptione){message="文件上传失败!";e.printStackTrace();}request.setAttribute("message",message);request.getRequestDispatcher("/message.jsp").forward(request,response);}
//得到上传的文件名称,
Stringfilename=item.getName();System.out.println(filename);if(filename==null||filename.trim().equals("")){continue;}//处理获取到的上传文件的文件名的路径部分,只保留文件名部分
filename=filename.substring(filename.lastIndexOf("\\")+1);//获取item中的上传文件的输入流
InputStreamin=item.getInputStream();//创建一个文件输出流
FileOutputStreamout=newFileOutputStream(savePath+"\\"+filename);//创建一个缓冲区
bytebuffer[]=newbyte[1024];//判断输入流中的数据是否已经读完的标识
intlen=0;//循环将输入流读入到缓冲区当中,(len=in.read(buffer))>0就表示in里面还有数据
while((len=in.read(buffer))>0){//使用FileOutputStream输出流将缓冲区的数据写入到指定的目录(savePath+"\\"+filename)当中文件上传(4)上传结果页面<%@pagelanguage="java"contentType="text/html;charset=UTF-8"pageEncoding="UTF-8"isELIgnored="false"%><!DOCTYPEhtmlPUBLIC"-//W3C//DTDHTML4.01Transitional//EN""/TR/html4/loose.dtd"><html><head><metahttp-equiv="Content-Type"content="text/html;charset=UTF-8"><title>文件上传结果</title></head><body><h2>${message}</h2></body></html>浏览请求上传页面upload.jsp,如图7-9所示。单击“选择文件”,即可打开“打开文件”对话框,进行上传文件的选择。支撑知识--文件下载/02文件下载在Servlet中实现文件下载的过程涉及几个关键步骤,确保用户能够从服务器下载文件。具体过程如下:(1)首先,需要确定用户下载的文件资源是否存在。这可以是服务器上的一个静态文件,或者是动态生成的数据。(2)为了让浏览器识别响应为一个文件下载,而不是显示内容,需要设置HTTP响应头。Content-Type,告诉浏览器文件的类型。如果不确定文件类型,可以使用"application/octet-stream",这是一个通用的二进制文件类型,通常用于下载。Content-Disposition,这用于告诉浏览器如何处理响应的内容。将其设置为"attachment;filename=\""+fileName+"\"",这会提示浏览器将响应作为下载处理,而不是在浏览器中直接打开,并提供一个文件名。Content-Length,这是可选的,指定文件的大小,可以让浏览器显示下载进度。(3)最后,需要将文件的内容通过Servlet的输出流传输给客户端。文件下载通过文件流的形式下载文件,前端示例代码如下。<%@pagelanguage="java"contentType="text/html;charset=UTF-8"pageEncoding="UTF-8"isELIgnored="false"%><!DOCTYPEhtmlPUBLIC"-//W3C//DTDHTML4.01Transitional//EN""/TR/html4/loose.dtd"><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>FileDownloadExample</title></head><body> <h1>FileDownloadExample</h1><!--这里设置一个链接,点击时触发文件下载--><ahref="${pageContext.request.contextPath}/download"target="_blank">DownloadFile</a></body></html>文件下载在com.example.unit7包中创建FileDownloadServlet类,代码如下。@WebServlet("/download")publicclassFileDownloadServletextendsHttpServlet{protectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{//获取要下载的文件路径,这里假设文件在项目的根目录下StringfilePath=getServletContext().getRealP
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 福建电商营销方案设计
- 珍珠奶茶的营销方案策划
- 减肥水果营销策划方案
- 钢筋工程质量管理
- 酒店网站建设方案咨询
- 咨询方案的总结
- 钢箱梁施工方案整改
- 建筑方案设计资源包括哪些
- 跑步健身活动方案策划
- 人工智能技术与AIGC应用 课件全套 第1-8章 认识人工智能 - AIGC 的发展与展望
- 危险源辨识以风险评价登记表格范例
- EN61238-1额定电压36kV电力电缆用压接和机械连接器 试验方法和要求
- 专利法全套ppt课件(完整版)
- 自动插件机操作指导书
- 2020年全球森林资源评估
- 手榴弹使用教案
- 培智三年级上册生活数学全册教案
- 高考作文卷面书写
- 三效并流蒸发器的换热面积计算
- 船舶驾驶台资源管理bridge team management
- 心律失常介入培训教材课后练习及答案
评论
0/150
提交评论