Escolar Documentos
Profissional Documentos
Cultura Documentos
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.
de
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.
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;
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).
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);
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+ ...
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
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;
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.
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).