JavaWeb事务管理

HIVE NOTE

过滤器执行编码设置,请求过来的时候过滤器先拦截并设置编码,之后放行到DispatcherServlet就不用再为设置编码而担心了

CharacterEncodingFilter.java

package com.hive.myssm.filters;

import com.hive.myssm.util.StringUtil;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

//注解传递初始化参数
@WebFilter(urlPatterns = {"*.do"},initParams = {@WebInitParam(name = "encoding",value = "UTF-8")})
public class CharacterEncodingFilter implements Filter {

    //默认为utf8
    private String encoding = "UTF-8";

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        //不写死,写进配置文件更灵活
        String encodingStr = filterConfig.getInitParameter("encoding");
        if(StringUtil.isNotEmpty(encodingStr)){
            encoding = encodingStr ;
        }
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        ((HttpServletRequest)servletRequest).setCharacterEncoding(encoding);
        filterChain.doFilter(servletRequest,servletResponse);

    }

    @Override
    public void destroy() {

    }
}

  1. 事务管理
    1. 涉及到的组件:
    • OpenSessionInViewFilter
    • TransactionManager //将OpenSessionInViewFilter中的操作封装成此类
    • ThreadLocal
    • ConnUtil
    • BaseDAO
      service由一系列对多个DAO的操作组成
      在这里插入图片描述
      演变:

在这里插入图片描述
再演变:
在这里插入图片描述
解决:
在这里插入图片描述

  1. ThreadLocal
    - get() , set(obj)
    - ThreadLocal称之为本地线程 。 我们可以通过set方法在当前线程上存储数据、通过get方法在当前线程上获取数据
    - set方法源码分析:
    public void set(T value) {
    Thread t = Thread.currentThread(); //获取当前的线程
    ThreadLocalMap map = getMap(t); //每一个线程都维护各自的一个容器(ThreadLocalMap)
    if (map != null)
    map.set(this, value); //这里的key对应的是ThreadLocal,因为我们的组件中需要传输(共享)的对象可能会有多个(不止Connection)
    else
    createMap(t, value); //默认情况下map是没有初始化的,那么第一次往其中添加数据时,会去初始化
    }
    -get方法源码分析:
    public T get() {
    Thread t = Thread.currentThread(); //获取当前的线程
    ThreadLocalMap map = getMap(t); //获取和这个线程(企业)相关的ThreadLocalMap(也就是工作纽带的集合)
    if (map != null) {
    ThreadLocalMap.Entry e = map.getEntry(this); //this指的是ThreadLocal对象,通过它才能知道是哪一个工作纽带
    if (e != null) {
    @SuppressWarnings(“unchecked”)
    T result = (T)e.value; //entry.value就可以获取到工具箱了
    return result;
    }
    }
    return setInitialValue();
    }
  1. 监听器

    1. ServletContextListener - 监听ServletContext对象的创建和销毁的过程

    2. HttpSessionListener - 监听HttpSession对象的创建和销毁的过程

    3. ServletRequestListener - 监听ServletRequest对象的创建和销毁的过程

    4. ServletContextAttributeListener - 监听ServletContext的保存作用域的改动(add,remove,replace)

    5. HttpSessionAttributeListener - 监听HttpSession的保存作用域的改动(add,remove,replace)

    6. ServletRequestAttributeListener - 监听ServletRequest的保存作用域的改动(add,remove,replace)

    7. HttpSessionBindingListener - 监听某个对象在Session域中的创建与移除

    8. HttpSessionActivationListener - 监听某个对象在Session域中的序列化和反序列化

  2. ServletContextListener的应用 - ContextLoaderListener

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Alveus

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值