基于java的web服务器毕业论文 - 图文

上下文的安全域、绑定对应于该上下文的命名服务。当一个应用程序上下文实例化且相关服务启动后,它就可以服务于对部署在其中的Servlet的请求。

按照Servlet规范,一个Servlet具有一定的生命周期,这个生命周期由javax.servlet.Servlet接口的init,service和destroy方法表达。Servlet只需被服务器加载一次并且常驻内存。DM Servlet容器按照Servlet的生命周期来管理容器中的Servlet。

容器维持一个Servlet缓冲池。当客户端向服务器请求某个Servlet服务时,容器首先在Servlet缓冲池中查找是否有所请求的Servlet实例,如果有,直接取出并调用该Servlet的service方法服务于客户端;如果没有,表明该Servlet是被第一次请求,容器调用当前上下文的Web类装载器将请求的Servlet类装载进内存并实例化。Servlet加载并实例化后,容器对该Servlet进行初始化。初始化的过程主要是读取Servlet的配置信息、系统资源(例如JDBC连接)以及其它仅仅需要执行一次的任务。通过调用它的init方法并给它传递唯一的一个DMServletConfig对象完成这个过程。DMServletConfig实现了ServletConfig接口,它封装了Servlet的一些初始化参数。DMServletConfig对象同时给Servlet提供了访问实现了ServletContext接口的DMServletContext对象的方法,从而使得该Servlet能够访问ServletContext定义的一切公共接口。init方法在Servlet生命周期过程中仅被调用一次。在初始化期间,Servlet实例可能通过抛出UnavailableException或者ServletException异常表明它不能进行有效服务。如果一个Servlet抛出一个这样的异常,它将不会被置入有效服务并且容器立即将其释放并向客户端返回错误。如果Servlet初始化正常,容器将该Servlet放入缓冲池,同时将DMRequest和DMResponse对象传给Servlet的service方法并执行。同样,如果在执行过程中发生异常,容器直接向客户端返回错误。

在Servlet的执行过程中,需要注意一个多线程和持久性的问题。因为Servlet只被创建一次,然后作为不变的实例一直运行,所以在Servlet中可以创建持久的变量和对象。同一Servlet的所有线程共享这些持久的变量和对象。这样就会带来一个问题—线程竞赛。发生线程竞赛的情况是:一个线程正准备私用数据,而第二个线程在第一个线程使用完数据前修改了此数据。

Servlet API提供了SingleThreadModel接口解决了这个问题。开发者如果想

防止线程竞赛问题,他可以将其编写的Servlet实现SingleThreadModel接口。容器保证在调用实现了SingleThreadModel接口的Servlet的service方法时只会让一个线程执行并且一次性执行完,其它相同请求的线程只能等待。

Servlet规范没有规定容器要将一个加载的Servlet保存多长时间,显然将一个初始化的Servlet永久保存在缓冲池中是不可取的。DM Servlet容器会按照最近最少使用算法(Least Recently Used,LRU)定期清理Servlet缓冲池中的Servlet,对于很久未使用的Servlet,容器调用它的destroy方法并将其移除以便它能够被垃圾回收。

Servlet缓冲池LRUCache按如下算法实现。

1.用一个缓冲对象CacheObject对Servlet实例进行包装,CacheObject由两 个变量组成,一个是代表Servlet实例的对象变量,一个是代表每次访问该Servlet实例的时间变量。

2.LRUCache的主要方法是put方法和get方法,其内部用一个哈希表和一个有向链表实现缓冲,用一个后台守护线程定期清理最近很久未使用的Servlet对象。

哈希表存储Servlet实例的类名和将该Servlet实例进行包装的CacheObject的名—值对,有向链表存储Servlet实例的类名。具体实现见算法3.1、算法3.2以及算法3.3。

3.3.3 Servlet过滤器

Servlet2.3规范增加了一个很重要的新功能—Servlet过滤器(Servlet Filter),其主要作用是在客户端请求到达被请求的服务之前,或者服务响应离开服务器到达客户端之前,根据需要对请求或响应进行预处理。

与Servlet一样,一个Filter也有三个方法表示它的生命周期:init、doFilter和destroy。容器处理Filter的生命周期与处理Servlet类似,这里不再重述。

容器实现过滤器的机制关键是要处理好过滤链(FilerChain)。DMFilerChain实现了FilerChain接口,用以表示一个或多个Filter的集合。DMFilerChain内部采用一个队列用来存储所有该过滤链上的所有过滤器。过滤链上的过滤器执行时具有先后顺序,它们按照击鼓传花的方式逐个执行。

DM Servlet容器按照如下方法处理过滤器:当容器接收到一个请求时,它获取请求的requestURL,找出所有在Web描述符中定义的与该requestURL匹配的Filter,按照Web描述符中配置的Filter映射的先后循序逐个将这些Filter加到DMFilerChain过滤链上。DMFilerChain对象通过Filter的doFilter方法传给该过滤链上的每个Filter。过滤链提供doFilter方法用以激活过滤链上下一个Filter。

是否调用过滤链的doFilter方法完全由应用程序决定,容器只保证在请求到达时激活过滤链上的第一个Filter。如果过滤器在过滤链的尾部,没有后继过滤器,容器将处理客户端所请求的服务。

联系客服:779662525#qq.com(#替换为@)