我就写了一个很简单很简单的Servlet,用户在页面上输入用户名和密码,提交到Servlet这边来,doGet()方法就直接跟据传过来的用户名在DB里查找想要的数据,然后再把数据在页面上展现出来。就这样一个很简单的功能,但是我想问一个小问题,我在电脑上同时开两个浏览器,一个用UserA登录,一个用UserB登录,Servlet是怎么保证把serA的数据发只给UserA的浏览器,然后把UserB的数据只发给UserB的浏览器的呢?为什么没有出现发乱了的情况呢,即UserA,UserB同时访问Servlet,UserA的结果发给了UserB,而UserB的结果却发给了UserA。谢谢。

解决方案 »

  1.   

    方法里不是接收两个参数吗,HttpServletRequest 和 HttpServletResponse ,每一个请求对应唯一的一对request和response。所以不会乱。
      

  2.   

    是不是和Cookie什么的有关系啊
      

  3.   

    是不是和Cookie什么的有关系啊
      

  4.   


    码了半天字,一提交没了郁闷跟Cookie没有啥关系,Cookie主要是跟会话有些关系,你的问题还不涉及到会话。你的问题仅仅是单次请求之间为什么不会发生混淆,这个其实说明你的基础知识确实比较薄弱。首先,中间件(Tomcat)准备了N个服务线程,专门为每个请求提供服务;
    其次,浏览器发送请求给服务器时,就会建立一个TCP长连接,而且任何一个请求都是相互独立的长连接,即便是来自同一个浏览器;
    那么,中间件会为这个TCP连接分配一个服务线程,提供一对一服务,该服务线程会根据请求信息准备好干净的上下文环境,比如request、response等;直到该请求服务完毕,该线程与TCP连接之间的关系都是一对一的,从一而终,不是玩3P的;当然服务完毕又会释放回中间件的线程池,等待下一次服务。
    所以,你所说的什么混淆啥的,根本不可能发生好吧。
      

  5.   

    为什么要用doget()会丢失数据的
      

  6.   

    大神,你果然厉害,呵呵。谢谢。再问一个问题哈,书上说Servlet在被访问时只会有一个实例,但是如果有多个客户端同时向这个Servlet对象发送请求,那会怎么样呢?是同时执行,还是一个一个的等待啊?这里不是很明白啊。望详细解释一下,谢谢!
      

  7.   

    有多个客户端同时向这个Servlet对象发送请求是处在不同的进程里面,不会一个一个的等待,Servlet会同时处理不同的请求,至于同时能处理多少个请求,要看服务器的性能了
      

  8.   


    是的,Servlet是单例模式,无论有多少个客户端同时发起请求,都只会有一个实例。但是这并不会导致一个个等待。执行是线程的概念,而Servlet可以理解为只是提供了执行的脚本:
    类似于大合唱:线程就是合唱人,傻傻的对着Servlet这个大屏幕上的歌词照着唱就完了。