image.pngimage.png有时候我们需要从低层次获取一些信息,修改起来很麻烦,所以可以在低层次将所需要的信息存入某对象,需要的时候取出,ThreadLocal就是这个作用
    image.png

    1. public void set(T value) {
    2. Thread t = Thread.currentThread();//当前线程t相当于session的表示JSESSIONID
    3. ThreadLocalMap map = getMap(t);//ThreadLocalMap相当于session
    4. if (map != null)
    5. map.set(this, value);
    6. else
    7. createMap(t, value);
    8. }

    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类**

    1. package util;
    2. import java.util.HashMap;
    3. public class ThreadLocalManager {
    4. //管理不同的ThreadLocal对象,一个人分配一个ThreadLocal
    5. //用每一个人的账号作为key,每一个ThreadLocal对象作为值
    6. private static HashMap<String,ThreadLocal> localHashMap=new HashMap<>();
    7. public static ThreadLocal getThreadLocal(String username){
    8. ThreadLocal local=localHashMap.get(username);
    9. if(local==null){
    10. local=new ThreadLocal();
    11. localHashMap.put(username,local);
    12. }
    13. return local;
    14. }
    15. }

    service层的login方法

    1. public String login(String username,String password){
    2. User user= userDao.selectOne(username);
    3. if(user!=null&&user.getPassword().equals(password)){
    4. ThreadLocal local= ThreadLocalManager.getThreadLocal(username);
    5. local.set(user);
    6. return "登录成功";
    7. }
    8. return "账号或密码错误";
    9. }

    LoginController的doPost方法

    1. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    2. req.setCharacterEncoding("UTF-8");
    3. String username=req.getParameter("username");
    4. String password=req.getParameter("password");
    5. UserService userService= MySpring.getBean("service.UserService");
    6. String result=userService.login(username,password);
    7. if(result.equals("登录成功")){
    8. ThreadLocal local= ThreadLocalManager.getThreadLocal(username);
    9. User user=(User) local.get();//造型
    10. req.setAttribute("user",user);
    11. req.getRequestDispatcher("welcome.jsp").forward(req,resp);
    12. }else{
    13. req.getRequestDispatcher("index.jsp").forward(req,resp);
    14. }
    15. }