SERVLET复习完了,把重要的几点内容记录一下。
1.Servlet的线程安全问题。
Servlet容器对于每个Servlet只产生一个Servlet实例,那么当有多个请求时,又是如何处理的呢?原来Servlet容器有一个线程池,线程池中有个调度线程,调度线程对于每个请求分配一个工作者线程,工作者线程调用Servlet的service方法进行响应。也就是说,当有多个请求时,Servlet的service方法运行于多个工作者线程中。这样就涉及到多线程问题,多线程问题最麻烦的就是多个线程对共享公共变量的修改,这容易出问题。解决的办法:1.将变量定义在方法类,使之成为本地变量,这样每个线程都有这个变量的一个拷贝,就不存在共享变量的问题。2.用synchronized关键字对方法进行同步,但这样会导致请求排队(实际上成了串行)。
ServletContext可以被所有servlet访问,很明显,它不是线程安全的;HttpSession虽然只能被属于同一个Session的请求访问,但如果用户用同一个浏览器打开多个页面,它们属于同一个Session,故HttpSession不是线程安全的。ServletRequest是线程安全的。
2.Servlet异常处理
最重要的是,在web.xml中配置
<error-page>
<error-code>404</error-code>
<location>/errorProcess.html</location>
</error-page>
这样就可以对异常进行处理。而不是显示一大堆错误信息给用户。显得程序比较健壮。
3.Cookie和HttpSession
叫做会话跟踪,其实就是缓存。HttpSession是保存在服务器端,不过为了标志是哪个HttpSession,服务器会给HttpSession分配Session Id,这个是保存在Cookie中,不过这个Cookie不是在影盘上而是在浏览器内存中。当有用户请求时,取出Session ID,放给服务器,服务器就知道对应哪个HttpSession。Cookie是保存在用户硬盘上,不是很安全,存储前最好对信息进行编码。
如果用户浏览器禁用Cookie,那么这两种方法没法用,只能用URL重写。response.encodeUrl和response.encodeRedirectUrl。