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() {
}
}
- 事务管理
- 涉及到的组件:
- OpenSessionInViewFilter
- TransactionManager //将OpenSessionInViewFilter中的操作封装成此类
- ThreadLocal
- ConnUtil
- BaseDAO
service由一系列对多个DAO的操作组成
演变:
再演变:
解决:
- 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();
}
-
监听器
-
ServletContextListener - 监听ServletContext对象的创建和销毁的过程
-
HttpSessionListener - 监听HttpSession对象的创建和销毁的过程
-
ServletRequestListener - 监听ServletRequest对象的创建和销毁的过程
-
ServletContextAttributeListener - 监听ServletContext的保存作用域的改动(add,remove,replace)
-
HttpSessionAttributeListener - 监听HttpSession的保存作用域的改动(add,remove,replace)
-
ServletRequestAttributeListener - 监听ServletRequest的保存作用域的改动(add,remove,replace)
-
HttpSessionBindingListener - 监听某个对象在Session域中的创建与移除
-
HttpSessionActivationListener - 监听某个对象在Session域中的序列化和反序列化
-
-
ServletContextListener的应用 - ContextLoaderListener