Java web基础(二)

事务/连接池/Listener/Filter/文件上传

事务

事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部不成功
事务的特性:原子性、一致性、隔离性、持久性

Mysql中的事务

mysql支持事务、默认自动提交事务,每条语句都处在单独的事务中
手动控制事务

  1. 开启事务:start transaction | begin
  2. 提交事务:commit
  3. 回滚事务:rollback

连接池

解决建立数据库连接耗费资源和时间很多的问题,提高性能,常用的数据源:DBCP、C3P0

DBCP

Apache推出的Database Connection Pool
使用步骤

  1. 添加jar包
  2. 添加属性资源文件
  3. 编写数据源工具类

C3P0

使用步骤

  1. 添加jar包
  2. 编写配置文件,c3p0-config.xml,放在classpath中,或classes目录中

Listener

用于监听web常见对象:HttpServletRequest/HttpSession/ServletContext
监听它们的创建与销毁/属性变化,监听session绑定javaBean

Filter

拦截所有访问web资源的请求或响应操作

步骤

  1. 创建一个类实现Filter接口
  2. 重写接口中方法 doFilter方法是真正过滤的。
  3. 在web.xml文件中配置
    //在Filter的doFilter方法内如果没有执行chain.doFilter(request,response),那么资源不会被访问到

FilterChain

提供了对某一资源的已过滤请求调用链的视图
过滤器使用FilterChain调用链中的下一个过滤器,如果调用的过滤器是链中的最后一个过滤器,则调用链末尾的资源
//多个Filter对同一个资源进行拦截就可以形成Filter链、Filter的执行顺序由来确定

FilterConfig

Filter的配置对象,它可以完成下列功能

  1. 获取Filtr名称
  2. 获取Filter初始化参数
  3. 获取ServletContext对象

生命周期

  1. 当服务器启动,会创建Filter对象,并调用init方法,只调用一次
  2. 当访问资源时,路径与Filter的拦截路径匹配,会执行Filter中的doFilter方法,这个方法是真正拦截操作的方法
  3. 当服务器关闭时,会调用Filter的destroy方法来进行销毁操作

配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<filter>
<filter-name>filter名称</filter-name>
<filter-class>Filter类的包名.类名</filter-class>
</filter>
<filter-mapping>
<filter-name>filter名称</filter-name>
<url-pattern>路径</url-pattern>
</filter-mapping>
 
<servlet-name>:对指定的servlet名称的servlet进行拦截
<dispatcher>:可以取的值:REQUEST/FORWARD/ERROR/INCLUDE
1. REQUEST 当是从浏览器直接访问资源,或是重定向到某个资源时进行拦截方式配置的 它也是默认值
2. FORWARD 它描述的是请求转发的拦截方式配置
3. ERROR 如果目标资源是通过声明式异常处理机制调用时,那么该过滤器将被调用。除此之外,过滤器不会被调用。
4. INCLUDE 如果目标资源是通过RequestDispatcher的include()方法访问时,那么该过滤器将被调用。除此之外,该过滤器不会被调用

文件上传

前提

  1. 提供form表单,method为post
  2. form表单的enctype为multipart/form-data
  3. 提供input type=”file”类的上传输入域

fileupload

fileupload是由apache的commons组件提供的上传组件,帮我们解析request.getInputStream()
相关jar包

  1. commons-fileupload.jar 核心包
  2. commons-io.jar 依赖包
    核心类
    DiskFileItemFactory、ServletFileUpload、FileItem

步骤

  1. 创建工厂类DiskFileItemFactory对象
    DiskFileItemFactory factory = new DiskFileItemFactory()
  2. 使用工厂创建解析器对象
    ServletFileUpload fileUpload = new ServletFileUpload(factory)
  3. 使用解析器来解析request对象
    List list = fileUpload.parseRequest(request)

FileItem对象对应一个表单项(表单字段),可以是文件字段或普通字段

1
2
3
4
5
6
7
8
9
boolean isFormField() 判断当前表单字段是否为普通文本字段,如果返回false,说明是文件字段
String getFieldName() 获取字段名称,例如:<input type=”text” name=”username”/>,返回的是username
String getString() 获取字段的内容,如果是文件字段,那么获取的是文件内容,当然上传的文件必须是文本文件
String getName() 获取文件字段的文件名称
String getContentType() 获取上传的文件的MIME类型,例如:text/plain
int getSize() 获取上传文件的大小
InputStream getInputStream() 获取上传文件对应的输入流
void write(File) 把上传的文件保存到指定文件中
delete() 删除临时文件