• 使用 IntraWeb (2)



    IntraWeb 比我相像中的更贴近 VCL, 传统的非可视组件在这里大都可用(其内部很多复合属性是 TStringList 类型的), 它的诸多可视控件也是从 TControl 继承下来的.
    这或许是它曾被改名为 VCL For Web 的原因.

    建立测试工程时, 一般要使用 StandAlone Application, 这方便调试; 具体发布时只需稍稍修改.

    我建立了一个交 MyTest1 的工程, 自动生成的主要文件有: MyTest1.dpr、ServerController.pas、UserSessionUnit.pas、Unit1.pas

    MyTest1.dpr
    program MyTest1;
    
    uses
      IWRtlFix,
      Forms,
      IWStart,
      UTF8ContentParser,
      Unit1 in 'Unit1.pas' {IWForm2: TIWAppForm},
      ServerController in 'ServerController.pas' {IWServerController: TIWServerControllerBase},
      UserSessionUnit in 'UserSessionUnit.pas' {IWUserSession: TIWUserSessionBase};
    
    {$R *.res}
    
    begin
      TIWStart.Execute(True);
    end.
    
    {注释}
    IWRtlFix          //它没有公开任何功能
    Forms             //还是以前的那个 Forms, 现在叫 Vcl.Forms 了 
    IWStart           //一个 StandAlone 应用是它启动的, 主要提供 Execute 这个 Class 方法
    UTF8ContentParser //但愿有了它, IW 不再有乱码的问题
    Unit1             //
    ServerController  //这才是 IntraWeb 工程的核心单元, 每个工程都会在该单元自动建立一个(只有一个) Server Controller 对象, 这个对象统管所有(包括 Session)
    UserSessionUnit   //该单元主要维护一个 Session 数据对象, 并提供给 ServerController 使用
    
    //这里的代码是自动维护的; 只有在修改发布模式时, 才会来这里做简单的修改(譬如把 program MyTest1 改为 library MyTest1)
    


    UserSessionUnit.pas
    unit UserSessionUnit;
    
    interface
    
    uses
      IWUserSessionBase, SysUtils, Classes;
    
    type
      TIWUserSession = class(TIWUserSessionBase)
      private
      public
      end;
    
    implementation
    
    {$R *.dfm}
    
    end.
    
    {注释}
    //该单元目前只有一个空的 TIWUserSession, 但也已被 ServerController 单元 uses 并使用
    //不同的网站程序对用户信息的需求可能不一样(譬如: 登陆信息、购物车信息等等), 我们可以在这里定义需要的数据格式; 因为灵活性很大, 所以关于 Session 的方便操作也是 IW 在宣传时首先要吹嘘的
    //在它的窗体上可以放置非可视控件
    //TIWUserSessionBase 的父类是我们熟悉的 TDataModule, 所以我说这是 Session 相关的数据模块.
    


    ServerController.pas
    unit ServerController;
    
    interface
    
    uses
      SysUtils, Classes, IWServerControllerBase, IWBaseForm, HTTPApp,
      // For OnNewSession Event
      UserSessionUnit, IWApplication, IWAppForm, IW.Browser.Browser;
    
    type
      TIWServerController = class(TIWServerControllerBase)
        procedure IWServerControllerBaseNewSession(ASession: TIWApplication); //TIWServerControllerBase 的 OnNewSession 事件; 在初始化阶段, 该事件就执行了
      private
      public
      end;
    
    {下面两个函数类似 Printer(Printers.pas), Clipboard(Clipbrd.pas), 可以让我非常方便地使用最常用的对象; 但要使用它们需 uses ServerController}
    function UserSession: TIWUserSession;             //
    function IWServerController: TIWServerController; //也常常会使用 gServerController、gSC 代替它
    
    implementation
    
    {$R *.dfm}
    
    uses
      IWInit, IWGlobal; //IWInit   提供了 WebApplication (类型是 TIWApplication), 从名字上就能感受到它的重要性
                        //LWGlobal 提供了 gServerController(可以简写为 gSC)
    
    function IWServerController: TIWServerController;
    begin
      Result := TIWServerController(GServerController); //GServerController = IWGlobal.gServerController; 在这之前它已建立, 这里只是返回一下
    end;
    
    function UserSession: TIWUserSession;
    begin
      Result := TIWUserSession(WebApplication.Data); //TIWApplication.Data 专门用于存储 Session 数据
    end;
    
    {OnNewSession}
    procedure TIWServerController.IWServerControllerBaseNewSession(ASession: TIWApplication);
    begin
      ASession.Data := TIWUserSession.Create(nil, ASession); //从其参数的命名上可以看出 Session 在 TIWApplication 心中的地位; 每个用户都有一个 TIWApplication 实例, 它还有更多功能
    end;
    
    initialization
    TIWServerController.SetServerControllerClass; //这是 TIWServerControllerBase 提供的 Class 方法; 它应该是做了一些必要的初始化工作, 但没有源码看不到.
    
    end.
    
    //在它的窗体上可以放置非可视控件
    


    Hello IntraWeb
    先在 Unit1 的窗体上放三个控件:
    IWLabel1;
    IWButton1, 并激活其 OnClick 事件;
    IWButton2, 并激活其 OnAsyncClick 事件.
    {代码}
    procedure TIWForm2.IWButton1Click(Sender: TObject);
    begin
      IWLabel1.Caption := 'Hello IntraWeb - OnClick'; //这是全页面刷新的, 会看到 Loading 图标
    end;
    
    procedure TIWForm2.IWButton2AsyncClick(Sender: TObject; EventParams: TStringList); //通过 AJAX 技术进行局部刷新
    begin
      IWLabel1.Caption := 'Hello IntraWeb - OnAsyncClick'; //这是局部刷新的
    end;
    


  • 相关阅读:
    javascript 设计模式-----观察者模式
    javascript 设计模式-----工厂模式
    javascript 设计模式-----模块模式
    javascript 设计模式-----享元模式
    javascript 设计模式-----策略模式
    js操作Dom的一些方法简化
    Centos7下不删除python2.x的情况下安装python3.x
    解决:Linux SSH Secure Shell(ssh) 超时断开的解决方法
    shell变量常用方法
    apache目录别名
  • 原文地址:https://www.cnblogs.com/del/p/3765187.html
Copyright © 2020-2023  润新知