Está en la página 1de 13

WebBroker Tecnologa de Delphi

El fragmento de cdigo CGI que te he mostrado demuestra la llanura, el enfoque directo a este
protocolo. Yo podra haber proporcionado ejemplos similares de bajo nivel para ISAPI o mdulos
de Apache, pero en Delphi es ms interesante utilizar la tecnologa WebBroker. Esto comprende
una jerarqua de clases dentro de VCL y CLX (construido para simplificar el desarrollo del lado del
servidor en la web) y un tipo especfico de mdulos de datos llamada WebModules. Tanto el Studio
Enterprise y Professional de Delphi incluyen este marco (en comparacin con el marco ms
avanzado y ms reciente WebSnap, que slo est disponible en la versin Enterprise Studio).
Utilizando la tecnologa WebBroker, usted puede comenzar a desarrollar una aplicacin ISAPI o
CGI o un mdulo de Apache fcilmente. En la primera pgina (Nuevo) del cuadro de dilogo
Elementos Nuevo, seleccione el icono del servidor de aplicaciones Web. El cuadro de dilogo
posterior le ofrecer una opcin entre ISAPI, CGI, Apache 1 o 2 mdulos, y de la aplicacin web de
depurador:

En cada caso, Delphi generar un proyecto con un webModule, que es un recipiente no visual
similar a un mdulo de datos. Esta unidad ser idntica, independientemente del tipo de
proyectos; slo los principales cambios en los archivos del proyecto. Para una aplicacin CGI, que
se ver as:
programa Project2; {$ APPTYPE CONSOLA}
use WebBroker, CGIApp, Unit1 en 'unit1.pas' {WebModule1: TWebModule};
{$ R * .res} begin
Application.Initialize;
Application.CreateForm (TWebModule1, WebModule1);
Application.Run;
End.
Aunque este es un programa CGI de la consola, el cdigo tiene una apariencia similar a la de una
aplicacin estndar Delphi. Sin embargo, se utiliza un truco el objeto Application utilizado por este
programa no es el objeto global tpico de clase TApplication sino un objeto de una nueva
clase. Este objeto de aplicacin es de TCGIApplication clase o otra clase derivada de
TWebApplication, dependiendo del tipo de proyecto web.

Las operaciones ms importantes tienen lugar en el webModule. Este componente se deriva


TCustomWebDispatcher, que proporciona soporte para toda la entrada y salida de sus
programas.

de

La clase TCustomWebDispatcher define Request y Response propiedades, que almacenan la


solicitud del cliente y la respuesta que vas a enviar de vuelta al cliente. Cada una de estas
propiedades se define usando una clase abstracta de base (TWebRequest y TWebResponse),
pero una aplicacin inicializa utilizando un objeto especfico (por ejemplo, las subclases
TISAPIRequest y TISAPIResponse). Estas clases ponen a disposicin toda la informacin pasa al
servidor, por lo que tiene un enfoque nico para el acceso a toda la informacin. Lo mismo es cierto
de una respuesta, que es fcil de manipular.
La ventaja clave de este enfoque es que el cdigo escrito con WebBroker es independiente del
tipo de aplicacin (CGI, ISAPI, el mdulo de Apache); podrs pasar de uno a otro, modificar el
archivo de proyecto o cambiar a otro, pero no ser necesario modificar el cdigo escrito en un
webModule.
Esta es la estructura del marco de Delphi. Para escribir el cdigo de la aplicacin, puede utilizar el
editor de acciones en el webModule para definir una serie de acciones (almacenado en la
propiedad de matriz acciones) en funcin de la ruta de la solicitud:

Esta ruta es una parte de la CGI URL o ISAPI de aplicacin, lo que viene despus de que el
nombre del programa y antes de que los parmetros, como ruta1 en la siguiente URL:
http://www.example.com/scripts/cgitest.exe/path1?param1=date
Al proporcionar diferentes acciones, la aplicacin puede responder fcilmente a las solicitudes con
diferentes nombres de ruta, y se puede asignar un componente productor diferente o llamar a un
controlador de eventos OnAction diferente para cada posible ruta. Por supuesto, se puede omitir el
nombre de ruta para manejar una solicitud genrica. Tambin considere que, en lugar de basar su
solicitud en un webModule, puede utilizar un mdulo de datos sin formato y aadir un componente
WebDispatcher a ella. Este es un buen mtodo si desea activar una aplicacin Delphi existente en
una extensin de servidor web.
Advertencia
El webModule hereda de la clase WebDispatcher base y no lo requiere como
un componente separado. A diferencia de las aplicaciones WebSnap, los
programas WebBroker no pueden tener mltiples despachadores o varios
mdulos web. Tambin tenga en cuenta que las acciones de la
WebDispatcher no tienen nada que ver con las acciones guardadas en un
componente ActionList o ActionManager.
Al definir las pginas HTML adjuntos que iniciar la aplicacin, los enlaces harn solicitudes de
pgina a las direcciones URL de cada uno de esos caminos. Tener una nica biblioteca que puede
realizar diferentes operaciones en funcin de un parmetro (en este caso, el nombre de ruta)
permite que el servidor para mantener una copia de esta biblioteca en la memoria y responder
mucho ms rpidamente a las peticiones del usuario. Lo mismo es cierto en parte para una
aplicacin CGI: El servidor tiene que ejecutar varias instancias, pero puede almacenar en cach el
archivo recin creado y hacer que est disponible ms rpidamente.

En caso OnAction, se escribe el cdigo para especificar la respuesta a una solicitud


determinada, los dos principales parmetros que se pasan al controlador de eventos. He aqu un
ejemplo:
procedimiento TWebModule1.WebModule1WebActionItem1Action (Sender:
TObject;
Solicitud: TWebRequest;
Boolean);

Respuesta: TWebResponse; var que trabaja:

Begin-comenzar

Response.Content: =
'<html> <head> <title> Hola Pginas </ title> </ head>
<body>' +
'<h1> Hola </ h1>' +
'<hr> <p> <i> Pgina generada por Rafael Barraza </ i> </ p>
</ body>
</ html>';
End-terminar;

En la propiedad de contenido de la respuesta de los parmetros, se introduce el cdigo HTML


que desea que los usuarios vean. El nico inconveniente de este cdigo es que la salida en un
navegador se mostrar correctamente en varias lneas, pero buscando en el cdigo fuente HTML,
ver una sola lnea que corresponde a toda la cadena.
Para hacer que el cdigo fuente HTML ms legible mediante su divisin en varias lneas, puede
insertar el # carcter de nueva lnea 13 (o, mejor an, el valor sLineBreak multiplataforma).
Para permitir que otras acciones manejan esta solicitud, se establece el ltimo parmetro,
gestionen, en False. El valor predeterminado es True; si este valor se establece, a continuacin,
una vez que se ha manejado la solicitud con su accin, el webModule asume haya terminado.
La mayor parte del cdigo de una aplicacin web ser estar en los controladores de eventos
OnAction de las acciones definidas en el contenedor webModule. Estas acciones reciben una
solicitud del cliente y devuelven una respuesta utilizando los parmetros de solicitud y respuesta.
Cuando usted est utilizando los componentes productores de contenido tales como
Tpageproducer,Tdatasetpegeproducer,Tquerydatasetproducer, su evento OnAction a menudo
regresa o retorna una variable: como Response.Content que muestra el contenido del
componente productor, con una operacin de asignacin. Puede atajo este cdigo asignando un
componente productor a la propiedad Productor de la accin, y usted no tendr que escribir estos
controladores de eventos ms (pero no hacer las dos cosas, porque hacerlo, podra meterse en
problemas).
Sugerencia
Como alternativa a la propiedad Productor, puede utilizar la propiedad
ProducerContent. Esta propiedad le permite conectar productores encargo
clases que no heredan de la clase TCustomContentProducer pero
implementan la interfaz IProduceContent. La propiedad ProducerContent
es casi una interfaz Inmueble: Se comporta de la misma manera, pero este
comportamiento se debe a su editor de la propiedad y no se basa en el apoyo
de Delphi para las propiedades interconectados.

Depuracin con la aplicacin web de depurador

Depuracin de aplicaciones web escritas en Delphi es a menudo difcil. Usted no puede


simplemente ejecutar el programa y establecer puntos de interrupcin en ella, pero debe convencer
al servidor web para ejecutar su programa CGI o biblioteca dentro del depurador de Delphi. Puede
hacerlo mediante la indicacin de una aplicacin host en el cuadro de dilogo Parmetros
Parameters de ejecucin de Delphi, pero este enfoque implica dejar que Delphi ejecuta el servidor
web (que es a menudo un servicio de Windows, no es un programa independiente).
Para resolver estos problemas, Borland ha desarrollado una web especfica del programa
Aplicacin depurador. Este programa, que se activa por el elemento correspondiente en el men
Herramientas, es un servidor web que espera peticiones en un puerto que puede configurar (1024
por defecto). Cuando llega una peticin, el programa puede remitirlo a un ejecutable
independiente. En Delphi 6, esta comunicacin se basa en tcnicas de COM; en Delphi 7, que se
basa en sockets Indy. En ambos casos, puede ejecutar la aplicacin de servidor web desde dentro
del IDE de Delphi, establecer todos los puntos de interrupcin que necesita, y luego (cuando el
programa se activa a travs de la aplicacin web de depurador) depurar el programa como si fuera
un archivo ejecutable normal.
La aplicacin web de depurador hace un buen trabajo de registrar todas las solicitudes recibidas y
las respuestas devueltas al navegador. El programa tambin tiene una pgina de estadsticas que
registra el tiempo requerido para cada respuesta, lo que le permite probar la eficacia de una
aplicacin en diferentes condiciones. Otra de las novedades de la aplicacin web de depuracin en
Delphi 7 es que ahora es una aplicacin CLX lugar de una aplicacin VCL. Este cambio de interfaz
de usuario y la conversin de COM para tomas fueron tanto por hacer para que la aplicacin web
de depurador disponible en Kylix.
Advertencia
Debido a que la aplicacin web de depurador utiliza Indy zcalos, su
aplicacin recibir excepciones frecuentes de tipo
EidConnClosedGracefully. Por esta razn, esta excepcin se desactiva
automticamente en todas Delphi 7 proyectos.
Mediante el uso de la opcin correspondiente en el cuadro de dilogo New Application Server Web,
usted puede crear fcilmente una nueva aplicacin compatible con el depurador. Esta opcin define
un proyecto de norma, que crea tanto un formulario principal y un mdulo web. La forma (intil)
incluye cdigo para proporcionar el cdigo de inicializacin y la adicin de la solicitud en el Registro
de Windows:
inicializacin
TWebAppSockObjectFactory.Create ('program_name');
La aplicacin web de depurador utiliza esta informacin para obtener una lista de los programas
disponibles. As que cuando lo hace se utiliza el valor predeterminado de la URL para el depurador,
se indica en el formulario como un enlace, como se puede ver (por ejemplo) en la figura 20.2. La
lista incluye todos los servidores registrados, no slo los que estn en ejecucin, y se puede utilizar
para activar un programa. Esto no es una buena idea, sin embargo, porque usted tiene que
ejecutar el programa en el IDE de Delphi para poder depurarlo. (Observe que puede ampliar la
lista, haga clic en Ver detalles;. Esta visin incluye una lista de los archivos ejecutables y muchos
otros detalles)

Figura 20.2: Una lista de aplicaciones registradas se muestra con la aplicacin web de
depurador cuando se engancha a su pgina principal.
El mdulo de datos para este tipo de proyecto incluye cdigo de inicializacin:
utiliza WebReq;
inicializacin
IF WebRequestHandler <> nil THEN
WebRequestHandler.WebModuleClass: = TWebModule2;
La aplicacin web de depuracin debe ser utilizado slo para la
depuracin. Para implementar la aplicacin, se debe utilizar una de las otras
opciones. Puede crear los archivos de proyecto para otro tipo de programa de
servidor web y aadir al proyecto el mismo mdulo web como la aplicacin de
depuracin.
Hay otros dos elementos de inters involucrados en el uso de la aplicacin web de depurador. En
primer lugar, usted puede probar su programa sin tener un servidor web instalado y sin tener que
ajustar su configuracin. En otras palabras, usted no tiene que implementar sus programas para
probalos- puede probar de inmediato. En segundo lugar, en vez de hacer el desarrollo temprano de
una aplicacin como CGI, puede comenzar a experimentar con una arquitectura multiproceso de
inmediato, sin tener que hacer frente a la carga y descarga de las bibliotecas (que a menudo
implica cerrar el servidor web y, posiblemente, incluso la computadora).

La construccin de un Multiusos webModule


Para demostrar lo fcil que es construir una aplicacin de servidor rica en caractersticas utilizando
el sprte y apoyo de Delphi, he creado el ejemplo BrokDemo. Constru este ejemplo utilizando la
tecnologa Web y App depurador, pero debe ser relativamente simple recompilar como CGI o una
biblioteca de servidor web.
Un elemento clave del ejemplo WebBroker es la lista de acciones. Las acciones se pueden
gestionar en el editor de acciones o directamente en el TreeView Objeto. Las acciones tambin son
visibles en la pgina Diseador del editor, por lo que se puede ver grficamente su relacin con los
objetos de base de datos. Si examina el cdigo fuente, te dars cuenta de que cada accin tiene
un nombre especfico. Tambin di nombres significativos a los OnAction controladores de
eventos.

Por ejemplo, TimeAction como un nombre de mtodo es mucho


ms comprensible que el nombre WebModule1WebActionItem1Action
generado automticamente por Delphi.
Cada accin tiene una ruta diferente, y uno se marca como un defecto y ejecutado, aunque no se
especifica ningn nombre de ruta. La primera idea interesante en este programa es el uso de dos
componentes PageProducer, PageHead y PageTail, que se utilizan para la porcin inicial y final de
cada pgina. Centralizar el cdigo hace que sea ms fcil de modificar, en particular si se basa en
archivos HTML externos. El HTML producida por estos componentes se aade al principio y al final
de la HTML resultante en controlador de eventos OnAfterDispatch del mdulo web:
procedimiento TWebModule1.WebModule1AfterDispatch (Sender: TObject;
Solicitud: TWebRequest;
Boolean);

Respuesta: TWebResponse; var que trabaja:

comenzar
Response.Content: = PageHead.Content + Response.Content +
PageTail.Content;
terminar;
Agrega el HTML inicial y final en el final de la generacin de la pgina ya que al hacerlo permite
que los componentes para producir el cdigo HTML como si estuvieran haciendo
todo. Comenzando con HTML en caso OnBeforeDispatch significa que no se puede asignar
directamente los componentes de productores a las acciones, o el componente productor anular
el contenido que ya ha proporcionado en la respuesta.

El componente PageTail incluye una etiqueta personalizada para el nombre del script,
sustituido por el siguiente cdigo, que utiliza el objeto de la peticin actual disponible en el mdulo
web:
procedimiento TWebModule1.PageTailHTMLTag (Sender: TObject; Tag: TTAG;
const TagString: String;
String);

TagParams: TStrings; var replaceText:

comenzar
si TagString = 'script' a continuacin
ReplaceText: = Request.ScriptName;
terminar;

Este cdigo se activa para ampliar la <#script> etiqueta de propiedad HTMLDoc del
componente PageTail.
El cdigo de las acciones de fecha y hora es sencillo. La parte realmente interesante comienza con
la Ruta de mens, que es la accin predeterminada. En su controlador de eventos OnAction, la
aplicacin utiliza un bucle for para construir una lista de las acciones disponibles (con sus
nombres sin las dos primeras letras, que son siempre Wa en este ejemplo), que proporciona un
enlace a cada uno de ellos con un ancla ( una etiqueta <a>):
procedimiento TWebModule1.MenuAction (Sender: TObject; Solicitud:
TWebRequest;
Respuesta: TWebResponse; var que trabaja: Boolean);
var
I: Integer;

comenzar
Response.Content: = "<h3> Men </ h3> <ul> '# 13;
porque yo: = 0 a Actions.Count - 1 hacer
Response.Content: = Response.Content + '<li> <a href = "' +
Request.ScriptName + Accin [I] .PathInfo + '">' +
Copiar (Accin [I] .name 3, 1000) + '</a>' # 13;
Response.Content: = Response.Content + '</ ul>';
terminar;
El ejemplo BrokDemo tambin proporciona a los usuarios una lista de los ajustes del sistema
relacionados con la solicitud, que es til para la depuracin. Tambin es instructivo para aprender
la cantidad de informacin (y exactamente qu informacin) las transferencias de protocolo HTTP
de un navegador a un servidor web y viceversa. Para producir esta lista, el programa busca por el
valor de cada propiedad de la clase TWebRequest, como demuestra este fragmento:
procedimiento TWebModule1.StatusAction (Sender: TObject; Solicitud:
TWebRequest;
Respuesta: TWebResponse; var que trabaja: Boolean);
var
I: Integer;
comenzar
Response.Content: = "<h3> Estado </ h3> '# 13+
'Mtodo:' + request.method + '<br>' # 13+
'ProtocolVersion:' + Request.ProtocolVersion + '<br>' # 13+
'URL:' + Request.URL + '<br>' # 13+
'Pregunta:' + Request.Query + '<br>' # 13+ ...

Informes Base de datos dinmico


El ejemplo BrokDemo define dos ms acciones, sealados por la mesa / y / grabar nombres de
ruta. Para estas dos ltimas acciones, el programa genera una lista de nombres y luego muestra
los detalles de un registro, el uso de un componente DatasetTableProducer para dar formato a toda
la tabla y un componente DataSetPageProducer para construir la vista los registro. Estas son las
propiedades mas comunes de estos dos componentes:
Objeto DataSetTableProducer1: TDataSetTableProducer
DataSet = dataEmployee
OnFormatCell = DataSetTableProducer1FormatCell
Final
objeto DataSetPage1: TDataSetPageProducer
HTMLDoc.Strings = (
'<h3> Empleados: <#LastName> </ h3>'
'<ul> <li> Employee ID: <#EmpNo>'
'<li> Nombre: <#FirstName> <#LastName>'
'<li> Telfono: <#PhoneExt>'
'<li> Contratado Por: <#HireDate>'

'<li> Salario: <#Salary> </ ul>')


OnHTMLTag = PageTailHTMLTag
DataSet = dataEmployee
final
Para producir toda la tabla, se conecta el DatasetTableProducer a la propiedad Productor de las
acciones correspondientes, sin proporcionar un controlador de eventos especficos. El cuadro se
hace ms poderosa mediante la adicin de enlaces internos a los registros especficos.
El siguiente cdigo se ejecuta para cada celda de la tabla, pero se crea un enlace slo para la primera
columna y no por la primera fila (el que tiene el ttulo):
procedimiento TWebModule1.DataSetTableProducer1FormatCell (Sender:
TObject;
CellRow, CellColumn: Integer; var BgColor: THTMLBgColor;
Alinear var: THTMLAlign; var VAlign: THTMLVAlign;
CustomAttrs var, CellData: String);
comenzar
IF (CellColumn = 0) y (CellRow <0>), entonces
CellData: = '<a href = "' + NombreDeSecuenciaDeComandos + '/
registro LastName =' +
dataEmployee ['LAST_NAME'] + '& Nombre =' +
dataEmployee ['nombre'] + '">'
+ CellData + '</a>';
terminar;
Usted puede ver el resultado que de esta accin en la figura 20.3. Cuando el usuario selecciona
uno de los enlaces, el programa se llama de nuevo, y se puede consultar la lista de cadenas
queryFields y extraer los parmetros de la URL. A continuacin, utiliza los valores correspondientes
a los campos de la tabla utilizados para la bsqueda de grabacin (que se basa en la llamada
FindNearest):
procedimiento TWebModule1.RecordAction (Sender: TObject; Solicitud:
TWebRequest;
Respuesta: TWebResponse; var que trabaja: Boolean);
comenzar
dataEmployee.Open;
// Ir al registro solicitado
dataEmployee.Locate ('LAST_NAME; FIRST_NAME',
VarArrayOf ([Request.QueryFields.Values ['Apellidos'],
Request.QueryFields.Values ['FirstName']]), []);
// Obtener la salida
Response.Content: = Response.Content + DataSetPage1.Content;
terminar;

Figura 20.3: La salida correspondiente a la trayectoria de la tabla del ejemplo de BrokDemo, que
produce una tabla HTML con hipervnculos internos

Consultas y Formas
El ejemplo anterior utiliza algunos de los componentes de productores HTML introducidas
anteriormente en este captulo. Este grupo incluye otro componente que no ha utilizado an:
QueryTableProducer (para el BDE) y su hermana SQL QueryTableProducer (para
dbExpress). Como vers en un momento, este componente hace que la construccin de bases de
datos hasta programas complejos de una brisa.
Suponga que desea buscar clientes en una base de datos. Es posible construir el siguiente
formulario HTML (incrustado en una tabla HTML para un mejor formato):
<h4> Cliente QueryProducer Buscar Form </ h4> <form action = "<# script>
/ bsqueda" method = "POST"> <table> <tr> <td> Estado: </ td> <td> <input
type = "text" name = "Estado"> </ td> </ tr> <tr> <td> Pas: </ td> <td>
<input type = "text"name = "Pas"> </ td> </ tr> <tr> <td> </ td> <td>
<center> <input type = "Enviar"> </ center> </ td> </ tr> </ table> </
form>
Billete
Al igual que en Delphi, un formulario HTML alberga una serie de controles. Existen
herramientas visuales para ayudarle a disear estas formas, o se puede introducir
manualmente el cdigo HTML. Los controles disponibles incluyen botones, texto de
entrada (o cuadros de edicin), selecciones (o cuadros combinados), y los botones
de entrada (o botones de radio). Puede definir botones como tipos especficos,
como Enviar o Restablecer, que implican comportamientos estndar. Un elemento
importante de las formas es la solicitud de mtodo, que puede ser o POST (datos
se pasa detrs de las escenas, y recibir en la propiedad ContentFields) o GET
(datos se pasa como parte de la URL, y extraerlo de la propiedad queryFields).
Usted debe notar un elemento muy importante en la forma: los nombres de los componentes de
entrada (estado y pas), que deben coincidir con los parmetros de un componente SQLQuery:
SELECT Cliente, State_Province, Pas
DE CLIENTE
DONDE
State_Province =: estado o pas =: Pas
Este cdigo se utiliza en el ejemplo CustQueP (productor consulta del cliente). Para construirlo,
coloqu un componente SQLQuery dentro del webModule y gener los objetos de campo para
ello. En la misma webModule, he aadido un componente SQLQueryTableProducer conectado a la

propiedad Productor de la accin / bsqueda. El programa genera la respuesta adecuada. Al


activar el componente SQLQuery-TableProducer llamando a su funcin de contenido, se inicia el
componente SQLQuery mediante la obtencin de los parmetros de la peticin HTTP. El
componente puede examinar automticamente el mtodo de solicitud y luego utilizar la propiedad
queryFields (si la solicitud es un GET) o la propiedad ContentFields (si la solicitud es un POST).
Un problema con el uso de un formulario HTML esttico como lo hizo anteriormente es que no te
dice que los estados y los pases se puede buscar. Para solucionar este problema, puede utilizar
un control de seleccin en lugar de un control de edicin en el formulario HTML. Sin embargo, si el
usuario aade un nuevo registro a la tabla de base de datos, tendr que actualizar la lista de
elementos de forma automtica. Como solucin final, se puede disear la DLL ISAPI para producir
una forma en la marcha, y usted puede llenar los controles de seleccin con los elementos
disponibles.
Usted va a generar el cdigo HTML de esta pgina en la accin / forma, que se conecta a un
componente PageProducer. El PageProducer contiene el siguiente texto HTML, que incorpora dos
etiquetas especiales:
<h4> Cliente QueryProducer Formulario de bsqueda </ h4>
<form action = "<#script> / bsqueda" method = "POST">
<table>
<tr> <td> Estado: </ td>
<td> <select name = "Estado"> <option> </ option> <#State_Province> </
select> </ td> </ tr>
<tr> <td> Pas: </ td>
<td> <select name = "Pas"> <option> </ option> <#Country> </ select>
</ td> </ tr>
<tr> <td> </ td>
<td> <center> <input type = "Enviar"> </ center> </ td> </ tr>
</ Table> </ form>
Se dar cuenta de que las etiquetas tienen el mismo nombre que algunos de los campos de la
tabla. Cuando el PageProducer encuentra con una de estas etiquetas, se agrega una etiqueta
<option> de HTML para cada valor distinto del campo correspondiente. Aqu est el controlador
de eventos OnTag cdigo, que es genrica y reutilizable:
procedimiento TWebModule1.PageProducer1HTMLTag (Sender: TObject; Tag:
TTAG; TagString const: String; TagParams: TStrings; var ReplaceText:
String); comienzan ReplaceText: = ''; SQLQuery2.SQL.Clear;
SQLQuery2.SQL.Add ('SELECT DISTINCT' + TagString + 'de cliente); tratar
SQLQuery2.Open, tratar SQLQuery2.First; aunque no SQLQuery2.EOF no
comenzar ReplaceText: = replaceText +' <option> '+ SQLQuery2.Fields
[0] .AsString + '</ option>' # 13; SQLQuery2.Next; fin; finalmente
SQLQuery2.Close; fin; excepto ReplaceText: = '{campo incorrecto:' +
TagString + '}'; final; final;
Este mtodo utiliza un segundo componente SQLQuery, que coloqu manualmente en el formulario
y conectado a un componente SQLConnection compartida. Se produce la salida se muestra en
la Figura 20.4.

Figura 20.4: La accin forma del ejemplo CustQueP produce un formulario HTML con un
componente de la seleccin dinmica actualizado para reflejar el estado actual de la base de datos.
Esta extensin de servidor web, como muchos otros, permite al usuario ver los detalles de un
registro especfico. Como en el ejemplo anterior, se puede lograr esto mediante la personalizacin
de la salida de la primera columna (columna de cero), que se genera por el componente
QueryTableProducer:
procedimiento TWebModule1.QueryTableProducer1FormatCell (
Sender: TObject;

CellRow, CellColumn: Integer;

BgColor var: THTMLBgColor; Alinear var: THTMLAlign;


var VAlign: THTMLVAlign; CustomAttrs var, CellData: String);
comenzar
si (CellColumn = 0) y (CellRow <0>), entonces
CellData: = '<a href = "' + Request.ScriptName + '/ registro de la
empresa =' + CellData +
'">' + CellData + '</a>' # 13;
si CellData = '' despus
CellData: = '& nbsp; ";
terminar;
Sugerencia

Cuando usted tiene una celda vaca en una tabla HTML, la mayora de los
navegadores hacerla sin la frontera. Por esta razn, he aadido un no
separacin simbolo (& nbsp;) en cada celda vaca. Vas a tener que hacer esto
en cada mesa HTML generado con los productores de mesa de Delphi.

La accin de este enlace es / registro, y se pasa un elemento especfico despus de la?


Parmetro (sin el nombre del parmetro, que es ligeramente no estndar). El cdigo que se utiliza
para producir las tablas HTML para los registros no utilizar los componentes de productores que
has estado haciendo; en cambio, muestra los datos de cada campo en una tabla hecha a la
medida:
TWebModule1.RecordAction procedimiento (Sender: TObject; Solicitud:
TWebRequest; Respuesta: TWebResponse; var Manejado: Boolean); var I:
Integer; empiezo si Request.QueryFields.Count = 0 entonces
Response.Content: 'No Record = encontr' else begin Query2.SQL.Clear;
Query2.SQL.Add ('select * from clientes' + ', donde la empresa = "' +
Request.QueryFields.Values ['Empresa'] + '"'); Query2.Open;
Response.Content: = '<html> <head> <title> Cliente Registro </ title> </

head> <body> "# 13 +' <h1> Cliente de registro: '+ Request.QueryFields


[0] +' < / h1> '# 13 +' <table border> '# 13; porque yo: = 1 a
Query2.FieldCount - 1 hacen Response.Content: = Response.Content +' <tr>
<td> '+ Query2.Fields [ I] .FieldName + '</ td>' # 13 '<td>' +
Query2.Fields [I] .AsString + '</ td> </ tr>' # 13; Response.Content: =
Response.Content + '</ table> <hr>' # 13 + // puntero al formulario de
consulta '<a href="' + Request.ScriptName +'/form">' + 'Siguiente
consultas </a> '# 13 +' </ body> </ html> '# 13; final; final;

Trabajar con Apache


Si va a utilizar Apache en lugar de IIS u otro servidor web, usted puede tomar ventaja de la
tecnologa CGI para desplegar sus aplicaciones en casi cualquier servidor web. Sin embargo, el
uso de CGI significa velocidad reducida y algo de informacin de estado de problemas de vista
(porque no se puede mantener todos los datos en la memoria). Esta es una buena razn para
escribir una aplicacin ISAPI o un mdulo de Apache dinmico. Utilizando la tecnologa WebBroker
de Delphi, tambin puede compilar fcilmente el mismo cdigo para ambas tecnologas, de modo
que se mueve su programa a una plataforma web diferente se convierte en mucho ms
simple. Tambin puede volver a compilar un programa CGI o un mdulo dinmico Apache con Kylix
y desplegar en un servidor Linux.
Como he mencionado, Apache puede ejecutar aplicaciones CGI tradicional, pero tambin tiene una
tecnologa especfica para mantener el programa de extensin de servidor cargado en la memoria
en todo momento para una respuesta ms rpida. Para construir un programa de este tipo en
Delphi, puede utilizar la opcin mdulo compartido Apache en el cuadro de dilogo Nueva
Aplicacin de Servidor Web; elegir Apache 1 o Apache 2, dependiendo de la versin del servidor
web que va a utilizar.
Advertencia
Mientras D7 compatible con la versin 2.0.39 de Apache, que no admite la
actual versin popular 2.0.40 debido a un cambio en las interfaces de la
biblioteca. El uso de la versin 2.0.39 se desanime, ya que tiene un problema
de seguridad. Sobre la forma de Informacin fijar la VCL debajo de cdigo y
hacer que sus mdulos compatibles con Apache 2.0.40 y superiores han sido
escritos por los miembros de Borland de I + D en los grupos de noticias y
actualmente estn disponibles tambin en el sitio web de Bob Swart en la
URL del www.drbob42.com/delphi7/ apache2040.htm.
Si decide crear un mdulo de Apache, se termina con una biblioteca que tiene este tipo de cdigo
fuente de su proyecto:
biblioteca Apache1;
usos
WebBroker,
ApacheApp,
ApacheWm en 'ApacheWm.pas' {WebModule1: TWebModule};
{$ R * .res}
exportaciones
Nombre apache_module 'apache1_module';

comenzar
Application.Initialize;
Application.CreateForm (TWebModule1, WebModule1);
Application.Run;
final.

Ntese en particular la clusula de las exportaciones, lo que indica el nombre utilizado por los
archivos de configuracin de Apache para hacer referencia al mdulo dinmico. En el cdigo fuente
del proyecto, puede agregar dos definiciones: la ms nombre del mdulo y el tipo en el contenido
de la siguiente manera:
ModuleName: = 'Apache1_module';
ContentType: = 'Apache1-handler';
Si no configura estos valores, Delphi asignarles valores por defecto, que se construyen agregando
las cuerdas _module y -handler al nombre del proyecto (lo que resulta en los dos nombres que he
usado aqu).
Un mdulo de Apache en general, no se despliega dentro de una carpeta de escritura, pero dentro
de la subcarpeta mdulos del servidor (por defecto, c: \ Archivos de programa \ Apache \
modules). Tiene que editar el archivo http.conf, agregando una lnea para cargar el mdulo, de
la siguiente manera:
Mdulos apache1_module LoadModule / apache1.dll
Por ltimo, debe indicar cuando se invoca el mdulo. El manejador definido por el mdulo puede
estar asociado con una extensin de archivo dado (de modo que su mdulo procesar todos los
archivos que tienen una extensin dada) o con una carpeta fsica o virtual. En este ltimo caso, no
existe la carpeta, pero Apache finge que est ah. As es como se puede configurar una carpeta
virtual para el mdulo Apache1:
<Location / Apache1> SetHandler Apache1-manejador </ Location>
Debido a que Apache es el caso inherentemente sensible (a causa de su patrimonio Linux), es
posible que tambin desee agregar una segunda carpeta virtual, minsculas:
<Location / Apache1> SetHandler Apache1-manejador </ Location>
Ahora se puede invocar la aplicacin de la muestra con la URL http: // localhost / Apache1. Una
gran ventaja del uso de carpetas virtuales en Apache es que un usuario realmente no distingue
entre las partes fsicas y dinmicas de su sitio, como se puede ver mediante la experimentacin
con el ejemplo Apache1 (que incluye el cdigo discutido aqu).

También podría gustarte