一,ServletConfig和ServletContext
• ServletConfig
– 如何给Servlet类配置初始化参数
– 如何在Servlet类中获取它的初始化参数值
• ServletContext
– 如何配置Web应用上下文初始化参数
– 如何在Servlet类中获取Web应用上下文的初始化参数值
• ServletContext的其他用途
– public void setAttribute(String name, Object obj):根据指定名name把对象obj存放到应用上下文范围中。
– public Object getAttribute(String name):根据指定名从应用上下文范围中获取到该属性对象。
– public void removeAttribut(String name):根据指定名从应用上下文范围中移除该属性。
• ServletConfig和ServletContext的区别
– 整个Web应用只有一个ServletContext,在部署Web应用的时候,容器会建立这一个ServletContext对象,这个上下文对Web应用中的每个Servlet和JSP都可用。
– Web应用中的各个Servlet都有自己的ServletConfig,它只对当前Servlet有效。
二,Servlet的线程安全问题
• 使用synchronized
– 使用synchronized关键字同步操作成员变量和共享数据的代码,就可以防止可能出现的线程安全问题。
• 尽量少使用成员变量和共享数据
– ServletContext是可以多线程同时读/写成员变量和共享数据的,线程是不安全的。
– ServletRequest对象在service方法的范围内是有效的,不要试图在service方法结束后仍然保存请求对象的引用。
– Servlet本身就是多线程的,在Servlet中再创建线程,将导致执行情况复杂化,出现多线程安全问题。
三,会 话 跟 踪
• HTTP是一种无状态协议,每当用户发出请求时,服务器就做出响应,客户端与服务器之间的联系是离散的、非连续的。
• 当用户在同一网站的多个页面之间转换时,根本无法知道是否是同一个客户,会话跟踪是一种灵活、轻便的机制,它使在页面上的状态编程变为可能。当一个客户在多个页面间切换时,服务器会保存该用户的信息。
• Web应用中的会话是指一个客户端浏览器与Web服务器之间连续发生的一系列请求和响应过程。
• 从客户端打开浏览器并连接服务器开始,到客户关闭浏览器离开这个服务器结束,被称为一个会话。
• Web应用的会话状态是指定Web服务器与浏览器在会话过程中产生的状态信息。
• 借助于会话状态,Web服务器能够把同一会话中的一系列的请求和响应过程关联起来,使得它们之间可以互相依赖和传递信息。例如在购物过程中,购物结算时,必须知道用户的登录结果(登录成功或失败),产品订购的结果(订购了哪些产品,订购了几件)等,所以,在购物会话中,用户的登录账户信息和订购的产品就是这个会话的状态信息
• 几乎所有的Web应用程序,客户端浏览器与Web服务器的会话过程都是要有状态的,即Web服务器程序在处理浏览器发出的请求时,能够把它和用户会话信息关联起来。
• HTTP协议是一种无状态的协议,浏览器主动发出一个请求,Web服务器接收请求并返回一个响应,Web服务器并不能区分这个请求是从哪一个主机上的哪种浏览器发出的。Web服务器接收到一个客户端浏览器的请求时,根本无法确定该浏览器先前的访问请求信息。对于这种无状态的会话过程,浏览器每一次请求都是完全孤立的,Web服务器端根本就不认为同一个浏览器发出的请求之间有任何关联。
• 由于HTTP协议本身不具有会话状态,所以,要想在Web应用程序中维持会话状态信息和实现有状态的会话管理,必须采用一些专门的技术来进行解决。
• 要实现有状态的会话,就需要在Web服务器程序和客户端浏览器之间来回传递会话ID,以关联同一客户端浏览器向服务器发出的连续请求。实现在Web服务器程序和客户端浏览器之间来回传递会话ID的技术被称为会话跟踪技术。
• 会话跟踪技术主要有两种:
• 通过Cookie技术在请求消息首部中传递会话ID;
• 通过URL重写,即在URL的末尾添加上这个会话ID