PDA

Ver la Versión Completa : Enviar Java desde Delphi


mazinger
11-05-2006, 09:25:42
Aunque en un hilo anterior:

http://clubdelphi.com/foros/showthread.php?t=31503

Ya preguntaba algo parecido, después de mucho investigar he llegado a la conclusión de que mi planteamiento tal vez estuviera equivocado.
Lo que realmente quiero es que mi programa Delphi interactúe de forma transparente con una página web que contiene comandos en Java, de manera que Delphi navegue automáticamente hasta la parte que el cliente necesita, sin que éste tenga que ir recorriendo interminables páginas web.
Esto que parece fácil en principio, no lo es tanto, pues el servidor obliga (o al menos eso creo) a ir siguiendo los pasos correspondientes sin saltarse ninguno, como si llevara un registro de sesión de manera que hay que ir recorriendo obligatoriamente todas las páginas hasta llegar a la que busco.
Para poder abrir alguna página concreta hay que pulsar algún botón que ejecuta un comando Java, por ejemplo:

botones[1] = "javascript:document.formulario.submit()";

Lo que yo quiero es que mi programa envíe ese comando para evitar que el usuario tenga que pulsar ese botón, y así llegar hasta la página que mostrará la información que requiere el cliente.

Espero haber sido algo más claro, y a ver si alguien me echa una mano, que es importante para mi proyecto
Gracias

liadsoft
11-05-2006, 10:00:11
Bueno, cada ves que se presiona un botón en una página, creo que se ejecuta o se envía información a la página que se encuentra en el campo 'action' del formulario al que pertenece el botón. La información se envía de la siguiente forma:

'página en action'+?+componente1 = valor1 & componente2 = valor 2 & ...

Donde los componentes son los botones, la TextBox y eso. Esto en el caso que el comando sea GET, de ser POST, se envía todo esto a la página en action pero con el POST, en el cuer´po del mensage HTTP

Lo que puedes hacer es ver a qué página te envía el botón, bajarla y si existe otro botón ver a qué página envía este, y la última es la que le debes pasar el Browser.

liadsoft
11-05-2006, 10:09:00
Bueno, me parece que no te había entendido bien.
Lo que quieres es que el Delphi, ya con la página bajada, ejecute el comando java que se ejecuta al presionar el botón.

Si no me equivoco, esto lo puedes hacer sin enredarte con el java, dejando que un buscador, como el Internet Expliorer haga ese trabajo. En ese caso, lo que tines es que copiar el comando o la función java que tu quieres que el IE te ejecute, enviarle la página a él pero le agregas un bloque Script (que siempre se ejecuta cuando el IE llega a analizar la página hasta ahí '<script>' y en él pones el código que ejecuta el botón, creo que en ese caso el IE te va a ejecutar el código y él solito te va a acceder a la página que llama el botón.

mazinger
11-05-2006, 12:17:46
Buf, pues no te llego a entender lo que me cuentas.
Yo utilizo el TWebBrowser, pero lo oculto para que sólo aparezca cuando he llegado a la página que quiero. No sé como el TWebBrowser puede enviar el comando Java. ¿Algún ejemplo?
Gracias por tu respuesta.

liadsoft
12-05-2006, 09:15:13
Bueno, te explicaré algo que seguramente ter va a ayudar.

el comando document.formularion.submit() lo que hace es que se ejecute la acción de un formulario que se halla en la página, es decir:

<form name="formulario" action='http://www.hola.com/hola.php'>

lo que tienes que hacer para llegar a la página que se habre después de presionar el botón es obtener la página que está en el campo action del formulario.

Si tienes duda de cómo obtener la página, pregunta.

mazinger
12-05-2006, 09:26:49
LiadSoft, en primer lugar gracias por tus explicaciones, es un campo nuevo para mi, y estoy investigando como resolver esto.

El formulario ejecuta esto:

<form name="formulario" method="POST" action="IndexAction.do">

Pero si llamo directamente por código a la página IndexAction.do, me da error. Me dice que mi sesion no es válida. Si pulso el botón funciona perfectamente.
Tal vez la solución sea emular una pulsación del botón web a través de código desde Delphi, pero no sé como se puede hacer eso.

Te paso el código completo de la página para ver si te ayuda:

roman
12-05-2006, 15:24:58
Hola,

Tal como te dice liadsoft, formulario.submit() (que por cierto, es código JavaScript, que nada tiene que ver con Java) lo que hace es mandar los datos del formulario a la url indicada.

Esto nunca va a ser equivalente a cargar dicha url directamente en el navegador pues justamente no estarías mandando los datos contenidos en el formulario.

El WebBrowser te permite enviar un POST como "dios manda". Revisa este hilo (http://www.clubdelphi.com/foros/showthread.php?t=29258) en donde se da la forma de hacerlo.

Nota que si quieres hacerlo transparente al usuario, entonces tú tienes que proveer los datos en el código delphi y hacer el POST. Tienes entonces que examinar el código HTML del formulario para ver cuáles son los nombres de los campos para saber qué es lo que tienes que mandar.

// Saludos

mazinger
13-05-2006, 09:04:26
Gracias Román tengo que probar ese código que me pones.
Mientras tanto, investigando por mi cuenta (que soy nuevo en esto del JavaScript ;) ) he encontrado una función que permite ejecutar código de cualquier página web.
Lo voy a poner a continuación para que la gente que se encuentre en situaciones similares tenga una ayuda creo que importante.

uses
MSHTML;

procedure TForm1.CallFoo(S: string; I: Integer);
{ Calls JavaScript Foo() function }
var
Doc: IHTMLDocument2; // current HTML document
HTMLWindow: IHTMLWindow2; // parent window of current HTML document
JSFn: string; // stores JavaScipt function call
begin
// Get reference to current document
Doc := WebBrowser1.Document as IHTMLDocument2;
if not Assigned(Doc) then
Exit;
// Get parent window of current document
HTMLWindow := Doc.parentWindow;
if not Assigned(HTMLWindow) then
Exit;
// Run JavaScript
try
JSFn := Format('Foo("%s",%d)', [S, I]); // build function call
HTMLWindow.execScript(JSFn, 'JavaScript'); // execute function
except
// handle exception in case JavaScript fails to run
end;
end;

Extraído de aquí (http://www.delphidabbler.com/articles?article=21), incluyendo explicación en inglés.

Ahora me queda averiguar cómo ejecutar código que no está incluido en la propia página web, sino en librerías de funciones .js que están en el servidor y que ejecuta desde algunas de esas páginas.

Seguiremos informando :D

dec
13-05-2006, 19:19:19
Hola,


Ahora me queda averiguar cómo ejecutar código que no está incluido en la propia página web, sino en librerías de funciones .js que están en el servidor y que ejecuta desde algunas de esas páginas.


Bueno. Me llamó la atención y traté de comprobarlo yo mismo y, como era de suponer, también funciona. Quiere decirse que el código JavaScript que se incluye a partir de un archivo ".js" queda expuesto en el documento de la misma forma (al menos para lo que nos ocupa) que si estuviera "escrito" directamente en el mismo.

Adjunto una pequeña prueba. ;)