有时候我们需要从低层次获取一些信息,修改起来很麻烦,所以可以在低层次将所需要的信息存入某对象,需要的时候取出,ThreadLocal就是这个作用
public void set(T value) {
Thread t = Thread.currentThread();//当前线程t相当于session的表示JSESSIONID
ThreadLocalMap map = getMap(t);//ThreadLocalMap相当于session
if (map != null)
map.set(this, value);
else
createMap(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);
}
}