jjw

写给自己的博客。 记录学习的点滴以备查。
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

读DataSnap源代码(三)

Posted on 2015-09-18 11:44  jjw  阅读(587)  评论(0编辑  收藏  举报
 1 function TWebRequestHandler.HandleRequest(Request: TWebRequest;
 2   Response: TWebResponse): Boolean;
 3 var
 4   I: Integer;
 5   LWebModule: TComponent;
 6   LWebAppServices: IWebAppServices;
 7   LGetWebAppServices: IGetWebAppServices;
 8   LComponent: TComponent;
 9 begin
10   Result := False;
11   LWebModule := ActivateWebModules;
12   if Assigned(LWebModule) then
13   try
14     try
15       if Supports(IInterface(LWebModule), IGetWebAppServices, LGetWebAppServices) then
16         LWebAppServices := LGetWebAppServices.GetWebAppServices;
17       if LWebAppServices = nil then
18         for I := 0 to LWebModule.ComponentCount - 1 do
19         begin
20           LComponent := LWebModule.Components[I];
21           if Supports(LComponent, IWebAppServices, LWebAppServices) then
22             if LWebAppServices.Active then
23               break
24             else
25               LWebAppServices := nil;
26         end;
27       if LWebAppServices = nil then
28         LWebAppServices := TDefaultWebAppServices.Create;
29       LWebAppServices.InitContext(LWebModule, Request, Response);
30       try
31         try
32           Result := LWebAppServices.HandleRequest;
33         except
34           ApplicationHandleException(LWebAppServices.ExceptionHandler);
35         end;
36       finally
37         LWebAppServices.FinishContext;
38       end;
39       if Result and not Response.Sent then
40         Response.SendResponse;
41     except
42       ApplicationHandleException(LWebAppServices.ExceptionHandler);
43     end;
44   finally
45     DeactivateWebModules(LWebModule);
46   end;
47 end;


第11行代码,先得到一个激活的WebModule,如何没有,就会创建一个再返回。

第14行到第26行代码,判断WebModule中是否实现了 IGetWebAppServices 接口的,具体做什么先略过。因为WebModule没有继承这个接口。

第27行,创建一个默认的WebAppServices

第32行,执行默认操作。

 1 function TDefaultWebAppServices.HandleRequest: Boolean;
 2 begin
 3   Result := InvokeDispatcher;
 4 end;
 5 
 6 function TDefaultWebAppServices.InvokeDispatcher: Boolean;
 7 begin
 8   if RequestHandler <> nil then
 9   begin
10     Result := RequestHandler.HandleRequest(Request, Response);
11   end
12   else
13     raise EWebBrokerException.CreateRes(@sNoDispatcherComponent);
14 end;

上面的RequestHandler是

    property RequestHandler: IWebRequestHandler read GetRequestHandler;

function TDefaultWebAppServices.GetRequestHandler: IWebRequestHandler;
begin
  if FRequestHandler = nil then
    FRequestHandler := FindRequestHandler;
  Result := FRequestHandler;
end;

function TDefaultWebAppServices.FindRequestHandler: IWebRequestHandler;
var
  Component: TComponent;
begin
  Result := nil;
  Component := FindWebDispatcher;
  if Component <> nil then
    if not Supports(Component, IWebRequestHandler, Result) then
      Assert(False, 'Expect support for IWebRequestHandler');  { do not localize }
end;

function TDefaultWebAppServices.FindWebDispatcher: TComponent;
var
  J: Integer;
begin
  Result := nil;
  if WebModule is TCustomWebDispatcher then
    Result := WebModule
  else
    for J := 0 to WebModule.ComponentCount - 1 do
      if WebModule.Components[J] is TCustomWebDispatcher then
      begin
        Result := WebModule.Components[J];
        break;
      end;
end;


上面红色标记的代码,最终会返回 WebModule.

  TWebModule = class(TCustomWebDispatcher)

所以,上面绿色标记的代码,是调用TCustomWebDispatcher.HandleRequest方法, 内部代码如下:

function TCustomWebDispatcher.HandleRequest(
  Request: TWebRequest; Response: TWebResponse): Boolean;
begin
  FRequest := Request;
  FResponse := Response;
  Result := DispatchAction(Request, Response);
end;