Komplettes ERP
Kunden, Produkte, Rechnungsstellung, Dashboard-Diagramme und passkey-Anmeldung.
Live-Demo öffnen →
sgcHTML ist nicht an den sgcWebSockets-Server gebunden. Seine Komponenten- und Node-Ebene erzeugt reine HTML-Strings, die von jedem Transport unabhängig sind, sodass dieselben Seiten, die du für den sgcWebSockets-HTTP-Server baust, aus einer Embarcadero-WebBroker-Anwendung und aus einem DataSnap-Server ausgeliefert werden können. Platziere eine Engine-Komponente auf deinem Web-Modul oder weise sie einem Bridge-Server zu, und deine DataSnap-REST-API und deine sgcHTML-Web-UI laufen nebeneinander auf einem Port.
sgcHTML ist ein serverseitiger HTML-Renderer. Jede Komponente und jede Node gibt Standard-Bootstrap-5-Markup als reinen String aus, ohne Abhängigkeit von dem Transport, der ihn ausliefert. Überall dort, wo dein Delphi- oder C++ Builder-Code eine HTTP-Antwort schreiben kann, kann er eine sgcHTML-Seite ausliefern. Genau das lässt dieselbe Seite, die du für den sgcWebSockets-Server gebaut hast, unverändert in einer WebBroker-Anwendung oder einem DataSnap-Server laufen.
Die Komponenten-Ebene und die Node-Ebene lösen sich beide zu einem string aus Bootstrap-5-Markup auf. Nichts an dieser Ausgabe setzt den sgcWebSockets-Server voraus, sodass du sie aus deinem eigenen Handler in jede beliebige TWebResponse schreiben kannst.
Die WebBroker-Engine implementiert den Standard-Vertrag IWebDispatch. Sie fügt sich wie jede andere automatisch dispatchende Komponente in die normale WebBroker-Dispatch-Kette ein und existiert so neben deinen vorhandenen Actions und Dispatchern.
Da es sich um ganz normales WebBroker handelt, kann eine sgcHTML-Seite aus einem eigenständigen TIdHTTPWebBrokerBridge, einem ISAPI-Modul, einem Apache-Modul, einer CGI-Anwendung oder einem HTTP.sys-Bridge-Server ausgeliefert werden. Eine Codebasis, mehrere Deployment-Formen.
Es gibt zwei Wege, sgcHTML außerhalb des sgcWebSockets-Servers auszuliefern. Reines WebBroker bietet dir die größte Reichweite, von CGI bis ISAPI. Der Bridge-Server-Pfad ergänzt Live-WebSocket-Push und teilt sich einen Port mit DataSnap.
TsgcHTMX_Engine_Server_WebBroker implementiert das Standard-IWebDispatch. Platziere es mit dem Web-Modul als Owner auf deinem TWebModule, oder rufe sein DispatchRequest aus einem TWebActionItem auf, wenn zuerst die Action-Liste laufen soll. So oder so liefert es die sgcHTML-Seite, die eingebauten CSS- und JavaScript-Assets sowie die HTMX-HTTP-Routes aus, die du auf seinem Router registrierst. Es läuft auf einem eigenständigen TIdHTTPWebBrokerBridge, einem ISAPI-Modul, einem Apache-Modul und CGI.
Interaktivität läuft hier über Standard-HTMX per einfacher HTTP-Round-Trips, sodass kein WebSocket nötig ist. Auch ein klassischer Reines-HTML-Modus wird unterstützt, ganz ohne HTMX, mit Vollseiten-Navigation und Standard-Formular-Posts, für Hosts und Seiten, bei denen du nichts als Markup willst. Ein Punkt, den du einplanen solltest: Unter reinem WebBroker, CGI oder ISAPI gibt es keinen WebSocket-Push, weil der Lebenszyklus von Anfrage und Antwort den Socket besitzt. Wenn du auf diesem Weg Live-Updates brauchst, nutze HTMX-Polling oder wechsle zu den Bridge-Servern weiter unten.
TsgcHTMX_Engine_Server_WebBrokerBridge zielt auf die sgcWebSockets-WebBroker-Bridge-Server, TsgcWSHTTPWebBrokerBridgeServer über HTTP/1.1 und TsgcWSHTTP2WebBrokerBridgeServer über HTTP/2. TsgcHTMX_Engine_Server_HTTPAPI_WebBrokerBridge zielt auf TsgcWSServer_HTTPAPI_WebBrokerBridge auf HTTP.sys. Du weist die Server-Eigenschaft der Engine deinem Bridge-Server zu, und die sgcHTML-Seite, ihre Assets und der Live-WebSocket-Fragment-Push über BroadcastFragment laufen alle auf demselben Port wie deine DataSnap-REST-Endpunkte.
Die Engine beansprucht nur ihre eigenen Pfade, sodass /datasnap/*-REST-Aufrufe und deine vorhandenen TWebModule-Actions genau wie zuvor weiterlaufen. Jeder OnCommandRequest-Handler, den du bereits zugewiesen hast, wird verkettet, und dein Handler läuft zuerst, sodass nichts von dem, was du gebaut hast, übernommen wird.
Dieselben DataSnap-Servermethoden können zwei Zielgruppen zugleich bedienen. Ein TDSServerModule ist deine REST- und JSON-API unter /datasnap/rest/... für externe Clients, und es ist zugleich die Datenquelle, aus der deine sgcHTML-Seiten rendern, in-process, auf demselben Server. Du schreibst die Geschäftslogik einmal und erreichst sie dann aus einem Browser-Fragment und von einem externen REST-Aufrufer über eine gemeinsame Klasse.
Externe Clients rufen deine Servermethoden unter /datasnap/rest/TServerMethods/<Method>/... genau so auf, wie ein Standard-DataSnap-WebBroker-Server sie bereitstellt. Die sgcHTML-Engine lässt diese Pfade unberührt.
Deine Route- und Action-Handler rufen genau dieselbe Servermethoden-Klasse in-process auf, lesen das Ergebnis und übergeben es an sgcHTML-Komponenten. Die Seite rendert aus demselben Backend, das auch deine REST-API beantwortet.
Auf dem Bridge-Server-Pfad pusht BroadcastFragment neues HTML über WebSockets an jeden verbundenen Browser, auf demselben Port und im selben Prozess wie deine DataSnap-Endpunkte. Dashboards und Monitore aktualisieren sich in dem Moment, in dem sich deine Daten ändern.
Erzeuge die Engine, gib ihr einen Router und eine Seite und weise sie einem Bridge-Server für den DataSnap- und Echtzeit-Pfad zu, oder platziere sie für den Reines-WebBroker-Pfad auf dem Web-Modul.
uses
Web.HTTPApp, sgcWebSocket_Server_WebBrokerBridge,
sgcHTMX_Engine_Server_WebBrokerBridge, sgcHTMX_Router;
// === DataSnap + realtime: sgcHTML on the SAME port as the DataSnap REST API ===
FServer := TsgcWSHTTPWebBrokerBridgeServer.Create(Self);
FServer.Port := 8080;
// a router holds the HTMX fragment routes (GET / POST round-trips)
FRouter := TsgcHTMX_Router.Create(Self);
oRoute := FRouter.Routes.Add;
oRoute.Path := '/dashboard/refresh';
oRoute.OnRoute := OnDashboardRefresh;
// the engine claims its own page, assets and routes; DataSnap keeps /datasnap/*
FEngine := TsgcHTMX_Engine_Server_WebBrokerBridge.Create(Self);
FEngine.Router := FRouter;
FEngine.Template.Title := 'DataSnap Realtime Dashboard';
FEngine.Template.BodyContent := BuildDashboard; // page built from components
FEngine.Server := FServer; // share the DataSnap port
FServer.Active := True;
// push a live HTML fragment to every connected browser over WebSockets
FEngine.BroadcastFragment(BuildStatsFragment);
// === Plain WebBroker: drop the engine on the TWebModule (standard IWebDispatch) ===
FEngine := TsgcHTMX_Engine_Server_WebBroker.Create(WebModule1); // Owner = WebModule
FEngine.Router := FRouter;
// includes: sgcWebSocket_Server_WebBrokerBridge.hpp,
// sgcHTMX_Engine_Server_WebBrokerBridge.hpp, sgcHTMX_Router.hpp
// === DataSnap + realtime: sgcHTML on the SAME port as the DataSnap REST API ===
FServer = new TsgcWSHTTPWebBrokerBridgeServer(this);
FServer->Port = 8080;
// a router holds the HTMX fragment routes (GET / POST round-trips)
FRouter = new TsgcHTMX_Router(this);
TsgcHTMX_Route *oRoute = FRouter->Routes->Add();
oRoute->Path = "/dashboard/refresh";
oRoute->OnRoute = OnDashboardRefresh;
// the engine claims its own page, assets and routes; DataSnap keeps /datasnap/*
FEngine = new TsgcHTMX_Engine_Server_WebBrokerBridge(this);
FEngine->Router = FRouter;
FEngine->Template->Title = "DataSnap Realtime Dashboard";
FEngine->Template->BodyContent = BuildDashboard(); // page built from components
FEngine->Server = FServer; // share the DataSnap port
FServer->Active = true;
// push a live HTML fragment to every connected browser over WebSockets
FEngine->BroadcastFragment(BuildStatsFragment());
// === Plain WebBroker: drop the engine on the TWebModule (standard IWebDispatch) ===
FEngine = new TsgcHTMX_Engine_Server_WebBroker(WebModule1); // Owner = WebModule
FEngine->Router = FRouter;
// WebBroker and DataSnap are Delphi and C++ Builder (VCL) frameworks.
// .NET has no WebBroker and no DataSnap, so this hosting path is specific
// to Delphi and C++ Builder. The sgcHTML .NET port hosts on ASP.NET Core.
using esegece.sgcHTML;
using esegece.sgcHTML.AspNetCore;
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
// the sgcHTML.AspNetCore adapter maps the same component-built page
// onto an ASP.NET Core endpoint (Kestrel / IIS), the .NET equivalent
// of the WebBroker host used in Delphi and C++ Builder.
app.UseSgcHtml(engine =>
{
engine.MapPage("/", () => BuildDashboard());
});
app.Run();
Jeder der obigen Wege ist eine vollständige, lauffähige Demo in der sgcWebSockets-Distribution, sodass du von einem Projekt aus starten kannst, das bereits baut und dispatcht.
Demos\60.HTML\11.WebBroker ist ein Mini-CRM auf WebBroker mit einem DataSnap-Backend und voller HTMX-Interaktivität und zeigt, wie sich Engine, DataSnap-REST und Standard-WebModule-Actions ein Web-Modul teilen.
Demos\60.HTML\12.WebBrokerHTML liefert dieselbe Art von Seiten im klassischen Reines-HTML-Modus aus, mit Vollseiten-Navigation und Standard-Formular-Posts über ein DataSnap-Backend und ganz ohne HTMX.
Demos\40.DataSnap\Server_Indy_HTTP_HTML betreibt ein Live-sgcHTML-Dashboard neben DataSnap auf einem einzigen Port und pusht Statistik-, Diagramm- und Log-Fragmente über WebSockets an jeden Browser.
Die Engine-Units werden mit sgcHTML ausgeliefert, sodass für keinen der beiden Wege etwas zusätzlich installiert werden muss.
TsgcHTMX_Engine_Server_WebBroker unterstützt Delphi 7 bis Delphi 13. WebBroker ist in jeder RAD Studio Edition verfügbar, und dieselbe Engine ist in C++ Builder verfügbar.
Die DataSnap-Bridge-Server und die /datasnap/*-REST-Schicht erfordern eine Delphi-Edition, die DataSnap enthält, also Enterprise oder Architect. Die sgcHTML-Seite der Verdrahtung ist auf beiden Wegen dieselbe.
Diese Anwendungen liefern ihr HTML aus Delphi aus. Derselbe Ansatz lässt sich in einen bestehenden WebBroker- oder DataSnap-Dienst einfügen.
Kunden, Produkte, Rechnungsstellung, Dashboard-Diagramme und passkey-Anmeldung.
Live-Demo öffnen →
Metriken werden bei jeder Änderung in Out-of-Band-htmx-Fragmente gepusht.
Live-Demo öffnen →
Ein Self-Service-Bereich hinter einem Login, mit demselben Komponentensatz.
Live-Demo öffnen →