JavaEE期末复习总结——黑马程序员

相关知识点_1

  1. SSM相关资源的下载

Spring的依赖包:Apache Commons Logging

commons-logging-1.2.jar

http://commons.apache.org/proper/commons-logging/download_logging.cgi

Spring框架(上学期:5.2.8;最新:5.3.4)

https://repo.spring.io/simple/libs-release-local/org/springframework/spring/ 找相应版本

Spring的核心包(core、beans、context、expression)

spring-用途-版本号.jar

注:在5.3.4中版本号后的release已没有。

Spring MVC框架是Spring的一部分

spring-web-版本号.jar

spring-webmvc-版本号.jar

MyBatis框架 3.5.6:Releases · mybatis/mybatis-3 · GitHub

  1. Spring中各jar包的命名特点、四个核心包及第三方依赖包

Spring开发所需的JAR包分为两个部分:Spring框架包、依赖包

docs文件中包含Spring的API文档和开发规范

libs文件夹中包含开发需要的JAR包和源码

schema文件夹中包含开发所需要的schema文件

libs目录中分JAR包分三类:jar包的命名特点

以.版本号结尾的是class文件JAR

以.版本号-javadoc.jar结尾的是API文档压缩包

以.版本号-sources.jar结尾的是源文件压缩包

libs目录中有四个Spring的基础包,分别对应Spring核心容器的四个模块。

spring-core-5.3.4.jar 包含Spring框架的核心工具类,Spring其它组件都要用到这个包里的类。

spring-beans-5.3.4.jar  所有应用都要用到的JAR包,它包含访问配置文件、创建和管理Bean以及进行控制反转或者依赖注入操作相关的所有类。

spring-context-5.3.4.jar 提供在基础IoC功能上的扩展服务,还提供了许多企业级服务的支持

spring-expression-5.3.4.jar  定义Spring的表达式语言。

第三方依赖包

在使用Spring开发时,除了要使用自带的JAR包外,Spring的核心容器还需要依赖commons.logging的JAR包。

  1. Eclipse企业版中建立/导入动态Web项目的方法

①在Eclipse中,建一个名为ch01的Dynamic Web项目,将Spring的4个基础包+commons-logging的JAR包复制到lib目录中。

②在src目录下,创建一个com.javaee.ch01.dao包,并在中创建接口UserDao,然后在接口中定义一个say()方法。

③在同一包下,创建UserDao接口的实现类UserDaoImpl,该类需要实现接口中的say()方法,并在方法中编写一条输出语句。

④在src目录下,创建Spring的配置文件applicationContext.xml,并在配置文件中创建一个id为userDao的Bean。

xml配置文件约束:

利用配套的文档完成配置文件

spring-framework-5.3.4/docs/reference/html/core.html#beans-factory-metadata

Spring配置文件的名称可以自定义,通常在实际开发中,都会将配置文件命名为applicationContext.xml

(有时候也会命名为beans.xml)

Object getBean(String name):根据Bean的id或name来获取指定的Bean

    1. 在不同系统版本环境下导入时常见异常的处理

eclipse 导入web项目时常见错误

1. JavaWeb:报错信息The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path

解决方法:右击web工程-》属性或Build Path-》Java Build Path->Libraries-> Add Libray...->Server Runtime -》Tomcat Server

切换到Java Build Path界面中的Orader and Export,选择Tomcat。

按以上方法操作时,若打开Server Runtime后一片空白,需要设置Apache服务器。设置方法为:window->Preferences->Server->Runtime Environment -> add --> 选择Apache的版本后点Next,再填入你apache服务器软件的安装(解压后)地址。

2.导入后中文显示乱码

导入项目之前,请确认工作空间编码已设置为utf-8:window->Preferences->General->Wrokspace->Text file encoding->Other 选择UTF-8

3.导入后,由于你的开发环境中JRE以及Tomcat Library名称可能和源代码中的不一致,可能出现Build Path的错误

解决方法如下:右键project->Build Path->Configure Build Path->选择Libraries tab页->删除带小红叉的Library->点击Add Library->选择JRE System Library(删了Tomcat Library的话就选择Server Runtime)->选择一个JRE后->Finish。

4.Tomcat版本不一样

进入项目包下的.settings目录,找到org.eclipse.wst.common.project.facet.core.xml文件,用记事本打开后才发现这句话有问题:《runtime name="Apache Tomcat v6.0"/》。我eclipse中设置的tomcat是7.0版本的,而它的运行环境是6.0版本的tomcat,肯定会出现问题。于是把这句话删掉,正常建议做完以上操作后,重新启动eclipse,有时做完更改后需要重新启动才能生效

4.the import com.csii cannot be resolved  问题:eclipse 导入类 提示The import XXX cannot be resolved

原因:原来使用JDK和现在使用的JDK不同造成的buildpath不对

解决方法:

1、右键项目-------buildpath--------最下面那个configura;2、选择libraries找到JRE;

3、选中remove掉,重新为该项目选择一个JRE;4、project----clean,全部的包都找到了。

相关知识点_6~9

  1. MyBatis所起的作用P85

MyBatis是持久层框架,支持JDBC,简化了持久层开发。使用MyBatis时,只需要通过接口指定数据操作的抽象方法,然后配置与之关联的SQL语句,即可。

<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId><version>1.3.2</version></dependency>

    MyBatis的操作步骤 P95                                                                                 

MyBatis的配置/映射文件所起作用以及搭配使用P105P114   工作流程 P87

mybatis配置文件的主要作用

1:注册数据库配置文件 db.properties,方便使用

2:注册实体类 JavaBean 的全限定性类名的别名

3:配置MyBatis运行环境,即配置数据源和事务管理器

4:注册映射文件的 mapper

映射文件的作用

1.可以通过读取映射文件调用相应的方法,获取SqlSessionFactoty工厂对象;

2.sql语句都写在映射文件中(查询,插入,删除,更新等)

在映射文件中,<mapper>元素是映射文件的根元素,它包含namespace属性,该属性为这个<Mapper>指定了唯一的命名空间。其他元素都是它的子元素。这些子元素及其作用如下所示:

<select>:用于映射查询语句,可自定义参数,返回结果集等。id属性是<select>属性的为唯一标识 P91

<insert>:用于映射插入语句,执行后返回一个整数,代表插入的条数。

<update>:用于映射更新语句,执行后返回一个整数,代表更新的条数。

<delete>:用于映射删除语句,执行后返回一个整数,代表删除的条数。

<sql>:用于定义一部分SQL,然后可被其他语句引用此SQL。

<cache>:用于给定命名空间的缓存配置。

<cache-ref>:用于其他命名空间缓存配置的引用。

<resultMap>:结果映射集,用于描述如何从数据库结果集中来加载对象。

SqlMapConfig.xml配置文件的配置内容和顺序如下(顺序不能乱,否则报错)P105

<configuration>是配置文件的根元素,其他元素都要在<configuration>内配置

<Properties>(属性)将内部的配置外在化,通过外部配置动态地替换内部定义的属性。           

<Settings>(全局参数设置)用于改变MyBatis运行时的行为。

<typeAliases>(类型别名)设置别名。

<typeHandlers>(类型处理器)将预处理语句传入的参数从JavaType转换为jdbcType,或者从数据库取出结果时将jdbcType转换为javaType。用于在配置文件中注册自定义的类型处理器(两种使用方式)。

<objectFactory>(对象工厂)实例化目标类

<plugins>(插件)配置用户所开发的插件。

<environments>(环境信息集合)对环境的配置。 MyBatis的环境配置实际上就是数据源的配置

     <environment>(单个环境信息)

           <transactionManager>(事物)

           <dataSource>(数据源)

<mappers>(映射器)指定MyBatis映射文件的位置。4种方式引入。

  1. MyBatis动态SQL语句的编写P124

动态SQL:根据实情,自行拼装相应的SQL。

MyBatis动态SQL中的主要元素及其作用如下:

(1)<if>元素:用于判断语句,用于单条件分支判断。

(2)<choose>(<when>、<otherwise>)元素:相当于Java中的switch...case...default语句,用于多条件分支判断。

(3)<where>、<trim>、<set>元素:辅助元素,用于处理一些SQL拼装、特殊字符问题。

(4)<foreach>元素:循环语句,常用于in语句等列举条件中。

(5)<bind>元素:     从OGNL表达式中创建一个变量,并将其绑定到上下文,常用于模糊查询的sql中。

在使用<foreach>时最关键也是最容易出错的就是collection属性(必填)  P134

在使用<foreach>时,collection属性是必须指定的,而且在不同情况下,该属性的值是不一样的。主要有3种情况:

(1)如果传入的是单参数且参数类型是一个数组或者List的时候,collection属性值分别为array和list(或collection);(首字母小写)

(2)如果传入的参数是多个的时候,就需要把它们封装成一个Map了,当然单参数也可以封装成Map集合,这时候collection属性值就为Map的键。

(3)如果传入的参数是POJO包装类的时候,collection属性值就为该包装类中需要进行遍历的数组或集合的属性名。

所以在设置collection属性值的时候,必须按照实际情况配置,否则程序就会出现异常。

  1. MyBatis关联类型及在ResultMap标签中的使用

MyBatis关联类型:一对一、一对多

<resultMap>元素中<association>子元素来处理一对一关联关系。

<resultMap>元素的<collection>子元素处理一对多关联关系。

<collection>子元素的属性大部分与<association>元素相同,但其还包含一个特殊属性--ofType 。ofType属性与javaType属性对应,它用于指定实体对象中集合类属性所包含的元素类型。

在MyBatis中,多对多的关联关系查询,同样使用前面介绍的<collection >元素进行处理(其用法和一对多关联关系查询语句用法基本相同)。

MyBatis加载关联关系对象主要通过两种方式:嵌套查询和嵌套结果。P139-140;虽用嵌套查询的方式较简单,但它要多次执行关联SQL语句,消耗数据库性能并且会降低查询效率。

MyBatis延迟加载的配置 P147  CollectionAssociation P120P147

相关知识点_11-13

将ch11项目发布到Tomcat中,并启动Tomcat服务器。在浏览器中访问地址http://localhost:8080/ch11/firstController。在JSP页中:${pageContext.request.contextPath}可表示contextRoot路径。

  1. Spring MVCSpring的关系

Spring MVC是Spring提供的一个实现了Web MVC设计模式的轻量级Web框架。它与Struts2框架一样,都属于MVC框架。但其使用性能比Struts2更优异。

springmvc就是管理controller对象的容器,spring就是管理service和dao的容器;在springmvc的配置文件里配置的扫描路径就是controller的路径,而spring的配置文件里自然配的就是service和dao的路径

1.@Component在类定义之前添加@Component注解,它会被SpringIoC容器识别,并转为bean。

2.@Repository对Dao实现类进行注解(特殊的@Component)。

3.@Service用于对业务逻辑层进行注解(特殊的@Component)。

4.@Controller用于控制层注解(特殊的@Component)。

5.@RequestMapping:用于处理请求地址映射,可以作用于类和方法上。

既然String类型的返回值不能携带数据,那么在方法中是如何将数据带入视图页面的呢?   P185

Spring MVC 执行流程 P177

  1. Spring MVC配置文件的作用 P175

ViewResolver(视图解析器)设置了视图的前缀和后缀属性。这样设置后,方法中定义的view路径将可以简化。P186

  1. @Controller@RequestMapping两个注解的搭配使用 P180-182

需要将@Controller@RequestMapping注解搭配使用才能让一个方法成为能处理前端请求的后台控制类方法

在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个Model ,然后再把该Model 返回给对应的View 进行展示。在SpringMVC 中提供了一个非常简便的定义Controller 的方法,你无需继承特定的类或实现特定的接口,只需使用@Controller 标记一个类是Controller ,然后使用@RequestMapping 和@RequestParam 等一些注解用以定义URL 请求和Controller 方法之间的映射,这样的Controller 就能被外界访问到。此外Controller 不会直接依赖于HttpServletRequest 和HttpServletResponse 等HttpServlet 对象,它们可以通过Controller 的方法参数灵活的获取到。

因用到注解,必须添加spring-aop包。【使用注解方式时,程序的运行需要依赖SpringAOP包,因此需要在lib目录中添加spring-aop-4.3.6-RELEASE.JAR,否则程序运行时会出错。】

@RequestMapping标注在方法上/类上,请求路径不同。@Controller标注在控制器类上。

@Controller注解在使用时可分为如下两步:

(1)在相应的类上标注@Controller注解。

(2)在Spring MVC的配置文件中添加相应的扫描配置信息。首先需要在配置文件中引入context名称空间的配置,然后使用<context:component-scan>元素指定需要扫描的类包。

  1. 简单数据绑定、绑定数组、绑定集合时,后台处理方法形参、表单元素的name属性值如何设置

将前端请求数据与后台控制类中方法的参数建立连接的过程就是Spring MVC中的数据绑定。【方式1:http://网址?参数1=值&参数2=值】【方式2:表单提交】;在数据绑定过程中,Spring MVC框架通过数据绑定组件(DataBinder)将前端请求参数串的内容进行类型转换,然后将转换后的值赋给控制器类中方法的形参,这样后台方法就可以正确绑定并获取客户端请求携带的参数了。简单数据绑定P194 绑定数组P205 绑定集合P207

@RequestParam:多用于在请求参数名与方法形参名不一致时的参数间接绑定。主要用于对请求中的参数进行定义,在使用时可以指定它的四个属性。关于@RequestParam的value、required、defaultValue三个属性,必须显式指定requiredfalse时,defaultValue才有效。 P195

解决前端输入中文数据出现乱码的问题:P198

使用包装POJO类型数据绑定时,前端请求的参数名编写必须符合两种情况:P200

相关知识点_14

  1. SSM中搭配jQuery框架时json的使用
    1. @RequestBody@ResponseBody注解的使用P214

JSON数据交互时,主要使用了两个注解@RequestBody@ResponseBody其中@RequestBody用于将请求体中的数据绑定到方法的形参中,在使用时标注在方法的形参上。@ResponseBody用于直接返回return对象,在使用时标准在方法上。

    1. JSP视图中事件处理编程

Key必须是String类型,值可为String/Number/Object/Array等

对象结构: {}            数组结构:[]

Object形式必须是“名称:值”的形式

配置静态资源P220 静态资源访问的配置有3种方式P220

1)使用<mvc:resources… />元素用于配置静态资源的访问路径。【lcation本地静态资源文件路径,mapping静态资源全路径】

2)使用<mvc:default-servlet-handler>标签,可以访问所有静态资源。

3)激活Tomcat默认的Servlet来处理静态文件访问。

相关知识点_15

  1. 拦截器所起作用P226以及它的配置、使用 P227P230
    1. 执行机制 P227

①单个拦截器在执行时,

a.程序首先会执行拦截器类中的preHandle()方法,如果该方法的返回值为true,则程序会继续向下执行处理器中的方法,否则将不再向下执行;

b.在业务处理器(即控制器Controller类)处理完请求后,会执行postHandle()方法,然后会通过DispatcherServlet向客户端返回响应;

c.在DispatcherServlet处理完请求后,才会执行afterCompletion()方法。

②当有多个拦截器同时工作时,它们的preHandle()方法会按照配置文件中拦截器的配置顺序执行,而它们的postHandle()方法和afterCompletion()方法则会按照配置顺序的反序执行。

相关知识点_16

  1. 文件上传表单的设置和后台处理 P241

前端:P241;后端:P242

  1. 文件下载时文件名中文乱码的处理 P249

相关知识点_17

  1. SSM融合的具体方法、各层的作用

SSM整合思路:由于Spring MVC是Spring框架中的一个模块,所以Spring MVC与Spring之间不存在整合的问题,只要引入相应JAR包就可以直接使用。因此SSM框架的整合就只涉及到了Spring与MyBatis的整合,以及Spring MVC与MyBatis的整合。Spring与MyBatis框架的整合时,通过Spring实例化Bean,然后调用实例对象中的查询方法来执行MyBatis映射文件中的SQL语句的,如果能够正确查询出数据库中的数据,那么就可以认为Spring与MyBatis框架整合成功。加入Spring MVC后,如果可以通过前台页面来执行查询方法,并且查询出的数据能够在页面中正确显示,那么就可以认为三大框架整合成功。P253

SSM框架是spring MVC ,spring和mybatis框架的整合,是标准的MVC模式。

要完成一个功能【融合的具体方法】

1.先写实体类entity,定义对象的属性,(可参照数据库中表的字段来设置,数据库的设计应该在所有编码开始之前)。

2.写Mapper.xml(Mybatis),其中定义你的功能,对应要对数据库进行的那些操作,比如 insert、selectAll、selectByKey、delete、update等。

3.写Mapper.java/Dao.java,将Mapper.xml中的操作按照id映射成Java函数。实际上就是Dao接口,二者选一即可。

4.写Service.java,为控制层提供服务,接受控制层的参数,完成相应的功能,并返回给控制层。

5.写Controller.java,连接页面请求和服务层,获取页面请求的参数,通过自动装配,映射不同的URL到相应的处理函数,并获取参数,对参数进行处理,之后传给服务层。

6.写JSP页面调用,请求哪些参数,需要获取什么数据。

各层的作用

表现层(springMVC):Controller层(Handler层)

负责具体的业务模块流程的控制。Controller层通过要调用Service层的接口来控制业务流程,控制的 配置也在Spring配置文件里面。

业务层(Spring):Service

Service层:负责业务模块的逻辑应用设计。首先设计其接口,然后再实现他的实现类。通过对Spring配置文件中配置其实现的关联,完成此步工作,我们 就可以通过调用Service的接口来进行业务处理。最后通过调用DAO层已定义的接口,去实现Service具体的 实现类。

持久层(Mybatis):Dao层(Mapper层)

Dao层:负责与数据库进行交互设计,用来处理数据的持久化工作。

DAO层的设计首先是设计DAO的接口,然后在Spring的配置文件中定义此接口的实现类,就可在其他模块中 调用此接口来进行数据业务的处理,而不用关心接口的具体实现类是哪个类,这里用到的就是反射机制, DAO层的数据源配置,以及有 关数据库连接的参数都在Spring的配置文件中进行配置。

视图层:View

负责前台jsp页面的展示。此层需要与Controller层结合起来开发。

所需的各种配置文件P254 编写配置文件P254

①数据库常量配置文件db.properties、P254

【选用的数据库连接池的类型决定了这个属性文件中出现哪些常量参数。】当安装MySQL时未指定UTF-8编码,除了要在create database时特地指定utf8编码外,还要指定2个参数:

jdbc.url=jdbc:mysql://localhost:3306/spring?useSSL=false&useUnicode=true&characterEncoding=UTF-8

②Spring配置文件applicationContext.xml、P255

③Spring MVC配置文件springMVC-servlet.xml,

④以及MyBatis的配置文件mybatis-config.xml。P256

沿着一个功能线先后完成po层、dao层接口及MyBatis映射文件、service层接口及实现类、controller控制类、jsp视图。

SSM框架整合时,Spring配置文件中配置信息主要包括:

(1)读取数据库常量配置文件db.properties的配置信息;

(2)数据源的配置信息;

(3)事务管理器的配置信息;

(4)开启事务注解的配置;

(5)MyBatis工厂SqlSessionFactory的配置信息;

(6)mapper文件扫描器的配置;

(7)扫描Service层的配置。

什么时候用GET什么时候用POST?

Post必须是在表单里面的,且method必须是显式地写了post的;

如果只是在地址栏里随便输个网址回车,一定是get,或是网页上有个超链接,点一下就跳过去也是get

Get是从服务器上获取数据,Post是向服务器传送数据;

get传送的数据量较小,post传送的数据量较大;postget更安全

1、get方式的安全性较Post方式要差些,包含机密信息的话,建议用Post数据提交方式;

2、在做数据查询时,建议用Get方式;而在做数据添加、修改或删除时,建议用Post方式;

区别表现如下:

①get是从服务器上获取数据,post是向服务器传送数据。

②get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。

③对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。

④get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。但理论上,IIS4中最大量为80KB,IIS5中为100KB。

⑤get安全性非常低,post安全性较高。但是执行效率却比Post方法好。

@RequestParam:用于获取前台参数,一般作用于表单。

 其属性有:value:参数的名称 required:定义传入的该参数是否为必须,默认为true

@RequestBody:用于获取前台参数,一般作用于ajax、json。用于将请求体中的数据绑定到方法的形参中,用于方法的形参上。

@PathVariable:用于接收浏览器地址中QueryString的参数。

 其属性有:value:参数的名称 required:轻易传入参数是否为必须

@ResponseBody:作用于方法上,用于直接返回return对象,如json或xml。

@CookieValue:用于获取请求的Cookie值。

@ModelAttribute:用于把参数保存到model中,可以注解方法或参数,注解在方法上的时候,该方法将在处理器方法执行之前执行,然后把返回的对象存放在session(前提是要有@SessionAttributes注解)或模型属性,注解在标注方法的时候指定,如果没有指定,则使用返回类型的类名称作为属性名称。

@SessionAttributes:用于使得模型中的数据存储一份到session域中,配合@ModelAttribute使用的时候,会将对应的名称的model值存到session中。

@Autowired:自动注入,如果按照byName来装配可以结合@Qualifier注解一起使用。

@Resource:此注解和自动注入注解都是做bean的注入时使用。

@RestController:使得当前的Controller层返回的全部都是Json类型的数据。

@Transactional:将类中的方法变为事务。其属性有:readOnly=false,意思为不为只读,可以进行增删改查 propagation=Propagation.REQUIRED,传播行为

@bean:等同于在spring配置文件中配置的bean....。

@Configuration:用于定义配置类,可替换xml配置文件。

<bean class="com.javaee.ch15.interceptor.CustomInterceptor"/>全局拦截器,必须放第一行,bean放第一

<mvc:mapping path="/**"/>:拦截所有路径

<mvc:exclude-mapping path=""/>:配置不需要拦截的路径(符合条件的就不拦截)

return "main";如果改成return "/xyz/main";就会出错,找不到这个页面了

<!-- 前缀 -->前缀设置一个路径,要用的时候才不用写全部

<property name="prefix" value="/WEB-INF/jsp/"/>

<!-- 后缀 -->在这个前缀路径里面建一个.jsp文件<property name="suffix" value=".jsp"/> 

  • 6
    点赞
  • 75
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是JavaEE上传下载案例代码: 上传文件代码: ```java protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 获取上传文件的目录 String uploadFilePath = request.getServletContext().getRealPath("/WEB-INF/upload"); // 存储要下载的文件名 Map<String, String> fileNameMap = new HashMap<String, String>(); // 上传文件的保存路径 File file = new File(uploadFilePath); // 如果目录不存在,创建目录 if (!file.exists() && !file.isDirectory()) { System.out.println("目录不存在,创建目录:" + uploadFilePath); file.mkdir(); } // 消息提示 String message = ""; try { // 使用Apache文件上传组件处理文件上传步骤: // 1、创建一个DiskFileItemFactory工厂 DiskFileItemFactory factory = new DiskFileItemFactory(); // 2、创建一个文件上传解析器 ServletFileUpload upload = new ServletFileUpload(factory); // 解决上传文件名的中文乱码 upload.setHeaderEncoding("UTF-8"); // 3、判断提交上来的数据是否是上传表单的数据 if (!ServletFileUpload.isMultipartContent(request)) { // 按照传统方式获取数据 return; } // 4、使用ServletFileUpload解析器解析上传数据,解析结果返回的是一个List<FileItem>集合,每一个FileItem对应一个Form表单的输入项 List<FileItem> list = upload.parseRequest(request); for (FileItem item : list) { // 如果fileitem中封装的是普通输入项的数据 if (item.isFormField()) { String name = item.getFieldName(); // 解决普通输入项的数据的中文乱码问题 String value = item.getString("UTF-8"); // value = new String(value.getBytes("iso8859-1"),"UTF-8"); System.out.println(name + "=" + value); } else {// 如果fileitem中封装的是上传文件 // 得到上传的文件名称, String filename = item.getName(); System.out.println(filename); if (filename == null || filename.trim().equals("")) { continue; } // 处理获取到的上传文件的文件名的路径部分,只保留文件名部分 filename = filename.substring(filename.lastIndexOf("\\") + 1); // 获取item中的上传文件的输入流 InputStream in = item.getInputStream(); // 创建一个文件输出流 FileOutputStream out = new FileOutputStream(uploadFilePath + "\\" + filename); // 创建一个缓冲区 byte buffer[] = new byte[1024]; // 判断输入流中的数据是否已经读完的标识 int len = 0; // 循环将输入流读入到缓冲区当中 while ((len = in.read(buffer)) > 0) { // 使用FileOutputStream输出流将缓冲区的数据写入到指定的目录(savePath + "\\" + filename)当中 out.write(buffer, 0, len); } // 关闭输入流 in.close(); // 关闭输出流 out.close(); // 删除处理文件上传时生成的临时文件 item.delete(); message = "文件上传成功!"; } } } catch (FileUploadException e) { // TODO Auto-generated catch block message = "文件上传失败!"; e.printStackTrace(); } // 将消息存储到request中 request.setAttribute("message", message); // 跳转到message.jsp request.getRequestDispatcher("/message.jsp").forward(request, response); } ``` 下载文件代码: ```java protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 获取要下载的文件名 String fileName = request.getParameter("filename"); fileName = new String(fileName.getBytes("iso8859-1"), "UTF-8"); // 上传的文件都是保存在/WEB-INF/upload目录下的子目录当中 String fileSaveRootPath = request.getServletContext().getRealPath("/WEB-INF/upload"); // 得到要下载的文件 File file = new File(fileSaveRootPath + "\\" + fileName); // 如果文件不存在 if (!file.exists()) { request.setAttribute("message", "您要下载的资源已被删除!!"); request.getRequestDispatcher("/message.jsp").forward(request, response); return; } // 处理文件名 String realname = fileName.substring(fileName.lastIndexOf("_") + 1); // 设置响应头,控制浏览器下载该文件 response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(realname, "UTF-8")); // 读取要下载的文件,保存到文件输入流 FileInputStream in = new FileInputStream(fileSaveRootPath + "\\" + fileName); // 创建输出流 OutputStream out = response.getOutputStream(); // 创建缓冲区 byte buffer[] = new byte[1024]; int len = 0; // 循环将输入流中的内容读取到缓冲区当中 while ((len = in.read(buffer)) > 0) { // 输出缓冲区的内容到浏览器,实现文件下载 out.write(buffer, 0, len); } // 关闭文件输入流 in.close(); // 关闭输出流 out.close(); } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值