标题:Delphi7 WebBrowser + Struts2 Action
作者:JRQ
正文:
使用Delphi7 WebBrowser客户端调用服务器Struts2 Action,并向服务端传递相关参数。
算是针对异构系统做简单集成的一个测试。
简要记之。
一、客户端WebBrowser以HTTP POST方式调用Action并传递参数
客户端Post方法一:
procedure WebNavigate1(sURL, sPostData: String; var wbWebBrowser: TWebBrowser);
var
vWebAddr, vPostData, vFlags, vFrame, vHeaders: OleVariant;
i: Integer;
begin
if Length(sPostData)> 0 then
begin
//头信息
vHeaders:= 'Content-Type:application/x-www-form-urlencoded'+ #10#13#0;
//创建二进制参数
vPostData:= VarArrayCreate([0, Length(sPostData)], varByte);
for i := 0 to Length(sPostData)-1 do
begin
vPostData[i]:= Ord(sPostData[i+1]);
end;
//结束字符
vPostData[Length(sPostData)]:= 0;
//Set the type of Variant
//TVarData(vPostData).vType:= varArray; //注释此句。否则类型错误。
end;
vWebAddr:= sURL;
wbWebBrowser.Navigate2(vWebAddr,vFlags,vFrame, vPostData, vHeaders);
//wbWebBrowser.Navigate(vWebAddr, EmptyParam, EmptyParam, vPostData, vHeaders);
end;
客户端Post方法二:
procedure WebNavigate2(sURL, sPostData: String; var wbWebBrowser: TWebBrowser);
var PostData,Headers: OleVariant;
i: Integer;
begin
//创建字节方式的可变变量数组,并将字符串转换之。
PostData := VarArrayCreate([0, Length(sPostData) - 1], varByte);
for i := 1 to Length(sPostData) do
begin
PostData[i-1] := Ord(sPostData[i]);
end;
//头类型
Headers := 'Content-Type: application/x-www-form-urlencoded' + #10#13;
//提交
wbWebBrowser.Navigate(sURL, EmptyParam, EmptyParam, PostData, Headers);
end;
客户端WebBrowser调用方法:
uses HttpApp;
var aURL, aPostData: String;
begin
//Post方法一
aURL:='http://127.0.0.1:8088/test/loginAction.action' ;
aPostData:='UserCode=abc&PassWord=abc';
//aPostData:='UserCode='+HTTPEncode('用户名')+'&PassWord=abc';
WebNavigate1(aURL,aPostData,WebBrowser1);
//Post方法二
aURL:= 'http://127.0.0.1:8088/test/testAction.action';
aPostData := 'ParaCode='+HTTPEncode('测试')+'&ParaNumb=123';
WebNavigate2(aURL,aPostData,WebBrowser1);
end;
服务器Action得到参数:
String pUserCode = request.getParameter("UserCode").toString();
String pPassWord = request.getParameter("PassWord").toString();
String pParaCode = request.getParameter("ParaCode").toString();
String pParaNumb = request.getParameter("ParaNumb").toString();
说明:
TWebBrowser有多个重载方法Navigate(),在此使用的Navigate()方法原型如下:
procedure TWebBrowser.Navigate(const URL: WideString; var Flags: OleVariant;
var TargetFrameName: OleVariant; var PostData: OleVariant;
var Headers: OleVariant);
begin
DefaultInterface.Navigate(URL, Flags, TargetFrameName, PostData, Headers);
end;
关于Navigate(),帮助中有如下说明:
-----------------------
Use Navigate to locate and download a specific resource.
Navigate can send an HTTP message to a specified URL and display the results or simply display the results of a specified file.
PostData contains the data sent to the server when using Navigate to generate an HTTP POST message.
If PostData is NULL, Navigate generates an HTTP GET message.
PostData is ignored if URL does not specify an HTTP URL.
-----------------------
如果Navigate()方法使用了PostData参数,则是HTTP POST方式的。如果没有PostData参数,则是HTTP GET方式。
Post方式传递的参数在客户端需要做二进制编码。并设置了Http的头信息。
另外,如果PostData中传递的是中文参数,客户端则需要用uses HttpApp单元,使用HTTPEncode()对中文参数编码,然后再做二进制编码。
客户端可以在WebBrowser的BeforeNavigate2()事件中捕获Post的参数,如下所示:
procedure TForm1.WebBrowser1BeforeNavigate2(Sender: TObject;
const pDisp: IDispatch; var URL, Flags, TargetFrameName, PostData,
Headers: OleVariant; var Cancel: WordBool);
var
i, nLen: Integer;
vPostData: OleVariant;
szData: string;
begin
//解开PostData参数
vPostData := PostData;
if VarIsArray(vPostData, True) then
begin
nLen := VarArrayHighBound(vPostData, 1) - VarArrayLowBound(vPostData, 1) + 1;
SetLength(szData, nLen);
for i := 0 to nLen - 1 do
begin
szData[i + 1] := Chr(Byte(vPostData[VarArrayLowBound(vPostData, 1) + i]));
end;
Application.MessageBox(PChar('PostData is : '+ szData),'测试');
end;
end;
二、客户端WebBrowser以HTTP Get方式调用Action并传递参数
客户端WebBrowser以GET方式发送请求:
uses HttpApp;
var aURL:String;
begin
aURL:= 'http://127.0.0.1:8088/test/loginAction.action?UserCode=abc&PassWord=abc';
WebBrowser1.Navigate(aURL);
aURL:= 'http://127.0.0.1:8088/test/testAction.action?ParaCode='+HTTPEncode('测试')+'&ParaNumb=123';
WebBrowser1.Navigate(aURL);
end;
服务器Action得到参数:
String pUserCode = request.getParameter("UserCode").toString();
String pPassWord = request.getParameter("PassWord").toString();
String pParaCode = new String(request.getParameter("ParaCode").getBytes("ISO8859_1")); //中文参数编码转换
String pParaNumb = request.getParameter("ParaNumb").toString();
说明:
客户端的WebBrowser的方法Navigate()只使用了一个参数:URL。该URL中包含了向服务器Action提交的参数。
Navigate()方法中没有使用PostData参数,使用的是HTTP GET方式请求。
此处客户端WebBrowser使用的Navigate()方法原型如下:
procedure TWebBrowser.Navigate(const URL: WideString);
begin
DefaultInterface.Navigate(URL, EmptyParam, EmptyParam, EmptyParam, EmptyParam);
end;
如果URL中包含中文参数,则需要用HTTPEncode()函数对中文参数编码。
同时,服务器Action中需要对该参数做编码转换。
三、一点想法
1.关于安全性:
针对此案例,使用POST比GET方式更为安全。因为POST方式不会在URL中暴露所传递的参数内容。
2.关于系统集成:
针对此案例,可以应用到多个异构系统的集成中,包括单点登录的实现、远程桌面集成访问等等。 ^_^
[--完--]
by JRQ
2009/05/23 于 京
分享到:
相关推荐
delphi动态 WebBrowser 释放问题.txt var web:TwebBrowser; procedure TForm1.Button1Click(Sender: TObject); begin web:=TWebBrowser.Create(Self); web.ParentWindow:=Self.Handle; web.SetBounds(100,100,...
在IT行业中,WebBrowser控件是许多Windows应用程序中用于嵌入网页浏览功能的常用组件,特别是在使用Delphi这样的集成开发环境中。Delphi的WebBrowser组件是基于Internet Explorer(IE)的ActiveX控件,因此它会继承...
Delphi WebBrowser 将一段HTML文字显示在网页浏览器中,实际是创建了一个HTML格式内容并显示出来,主要使用Delphi中内置的WebBrowser方法来实现: WebBrowser1.Navigate('about:blank'); while(tag=0) do ...
delphi动态 WebBrowser 释放问题 var web:TwebBrowser; procedure TForm1.Button1Click(Sender: TObject); begin web:=TWebBrowser.Create(Self); web.ParentWindow:=Self.Handle; web.SetBounds(100,100,100,...
在Delphi编程环境中,WebBrowser组件是一个非常强大的工具,它允许开发者将网页浏览功能集成到自己的应用程序中,从而创建出炫目且功能丰富的用户界面。本文将深入探讨如何利用WebBrowser打造令人眼前一亮的软件界面...
Delphi中WebBrowser的使用技巧汇总,对使用webbrowser开发很有帮助。
标题与描述均提及了“Delphi操作WebBrowser的几个技巧”,这一主题聚焦于Delphi编程语言如何有效地控制和交互WebBrowser组件,实现诸如获取网页变量、执行网页函数、设置网页背景、调用网页对象等高级功能。...
iAll := (WebBrowser1.Document as IHTMLDocument2).body; ``` 4. **遍历父级元素**: 为了获取到完整的文档结构,我们需要从`body`元素开始向上遍历,直到根节点。 ```delphi while iAll.parentElement <> ...
delphi 调用google chrome浏览器, Chromium(CEF3)组件最新版本,可代替webbrowser浏览器, 支持html5,与UC/360浏览器同等内核,是开发WEB终端显示最好用的浏览器组件、支持DELPHI7 DELPHI2010 XE2,XE10 ,XE8 等
"delphi7 webbrowser" 表明可能使用了Delphi 7版本中的WebBrowser组件,这可能用于显示网页或者在线查询等功能。"phone book delphi" 明确地告诉我们这是个Delphi编写的电话簿应用。最后的 "通讯" 暗示了这个程序与...
在IT领域,尤其是在软件开发与维护中,遇到控件或组件的bug是常见的问题,而本文将深入探讨在Delphi编程环境下,WebBrowser控件所出现的一些常见问题及其解决策略。Delphi是一种广泛使用的集成开发环境(IDE),主要...
在Delphi中,可以利用WebBrowser控件的`Document`属性获取到IWebBrowser2接口,再通过此接口的`Document`属性得到IDispatch接口,进一步转换为IWbemScripting_SWbemLocator接口,这样就能访问到网页的实际内容。...
DELPHI+chrome+替换WebBrowser让你的程序嵌入chrome浏览器,此控件非常方便的让你的程序内置chrome浏览器,解决老webbrowser的各种问题,非常方便。Chrome不挑食,基本上什么系统都可以跑,而且速度那是飞快,所以C/...
根据提供的文件信息,我们可以深入探讨 Delphi 中 WebBrowser 组件的相关事件及属性,这对于开发基于 Delphi 的应用程序具有重要意义。 ### WebBrowser 组件概述 在 Delphi 中,`WebBrowser` 组件允许开发者在其...
在Delphi编程环境中,WebBrowser组件常常用于在应用程序中嵌入网页浏览功能。然而,如何准确判断WebBrowser组件是否已完全加载完毕,是许多开发者在实际应用中会遇到的一个问题。今天,我们将深入探讨这个问题,并...
首先,要在Delphi中调用JavaScript函数,你需要一个能够解析和执行JavaScript代码的引擎。例如,可以使用开源的Chromium Embedded Framework (CEF) 或者CEFSharp,它们都包含了一个内建的V8 JavaScript引擎。一旦...
这里我们专注于使用Delphi集成开发环境以及其内置组件WebBrowser和Ole自动化登录网站的实现方法。Delphi是一款强大的Windows应用开发工具,它支持组件化编程,而WebBrowser组件则是一个封装了Internet Explorer内核...
WebBrowser控件在Delphi编程环境中是一个非常重要的组件,它允许开发者在应用程序中嵌入一个完整的Web浏览器功能。这个控件通常基于Internet Explorer的引擎,因此它可以显示HTML内容,执行JavaScript,以及支持许多...
这篇博客的配套文件主要探讨了如何在WebBrowser控件中实现JavaScript(JS)与C++代码的互相调用,从而实现更灵活的交互功能。这种技术通常用于增强网页应用的功能,或者在桌面应用中利用JavaScript的便利性来操控...