
有时候我们需要从低层次获取一些信息,修改起来很麻烦,所以可以在低层次将所需要的信息存入某对象,需要的时候取出,ThreadLocal就是这个作用
public void set(T value) {Thread t = Thread.currentThread();//当前线程t相当于session的表示JSESSIONIDThreadLocalMap map = getMap(t);//ThreadLocalMap相当于sessionif (map != null)map.set(this, value);elsecreateMap(t, value);}
JSESSIONID(String标识)——-t当前线程(Thread类型 标识)
通过标识找session(一个箱子)——-通过t找ThreadLocalMap(一个箱子)
通过session.Attribute(key,value);这里的key是自己定义的——-ThreadLocalMap.set(this,value);key是固定的,this是当前对象(ThreadLocal)
我是一个线程t t本身是找箱子的密码
t负责找到我的箱子ThreadLocalMap
这个箱子只有一个格子
找到箱子打开才能获取里面的value
打开箱子需要另一个密码(ThreadLocal对象)
当前t线程配着一个Threadlocal对象 map就是唯一的
value只能存储一个信息 想要存储多个 将多个信息包装起来
例如登录时,我们有账号密码和昵称,欢迎界面我们想要使用昵称欢迎而不是账号,我们就可以在service层的login方法中使用ThreadLocal类,为了更好管理,且ThreadLocal类是一对一的关系,一个人对应一个ThreadLocal,我们创建一个ThreadLocalManager类来管理ThreadLocal
ThreadLocalManager类**
package util;import java.util.HashMap;public class ThreadLocalManager {//管理不同的ThreadLocal对象,一个人分配一个ThreadLocal//用每一个人的账号作为key,每一个ThreadLocal对象作为值private static HashMap<String,ThreadLocal> localHashMap=new HashMap<>();public static ThreadLocal getThreadLocal(String username){ThreadLocal local=localHashMap.get(username);if(local==null){local=new ThreadLocal();localHashMap.put(username,local);}return local;}}
service层的login方法
public String login(String username,String password){User user= userDao.selectOne(username);if(user!=null&&user.getPassword().equals(password)){ThreadLocal local= ThreadLocalManager.getThreadLocal(username);local.set(user);return "登录成功";}return "账号或密码错误";}
LoginController的doPost方法
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {req.setCharacterEncoding("UTF-8");String username=req.getParameter("username");String password=req.getParameter("password");UserService userService= MySpring.getBean("service.UserService");String result=userService.login(username,password);if(result.equals("登录成功")){ThreadLocal local= ThreadLocalManager.getThreadLocal(username);User user=(User) local.get();//造型req.setAttribute("user",user);req.getRequestDispatcher("welcome.jsp").forward(req,resp);}else{req.getRequestDispatcher("index.jsp").forward(req,resp);}}
