html页面调用存储过程,用WebBrowser实现HTML界面的应用

HTML的界面有以下特点:图文混排,格式灵活,可以包含Flash、声音和视频等,实现图文声像的多媒体界面,而且易于建立和维护。另外,HTML的显示环境一般机器上都具备,通常不需要安装额外的软件。当然,HTML界面也有它欠缺的方面,即:界面控制能力有限,代码调试不便----虽然DHTML提供了比较强的编程特性,但是比起Delphi的传统的开发语言和工具来,对界面的控制能力,尤其是和数据交互时的控制能力还是稍逊一筹。

了解了这些特点,我们就可以在实际应用开发中,适时地选择HTML技术。下面举个例子:

一种仪器的管理程序,需要显示该仪器的操作方法文档,包含文字和图片,并要求可以隐藏或显示文档,并能安要求打印。

这个应用中,图文显示、隐藏/显示部分文档、图文打印等需求,都是HTML界面所擅长的,用传统的表单控件实现几乎无法想像。

用Delphi实现HTML界面的应用主要有两种选择:WebBrowser Control或MSHTML。为了弄清两者如何选择,我们先来看看Internet Exporer 4.0及其后续版本的体系结构:

426009_1.gif

IE浏览器是建立在SHDOCVW.DLL组件之上的,而SHDOCVW.DLL则建立在MSHTML.DLL组件之上,底层则包括脚本引擎等。SHDOCVW.DLL提供了对活动文档(Active Document)的支持----例如Word等文档可以在IE中显示,并提供导航、in-place*连接、收藏夹、浏览历史和分级内容选择(PICS: Platform for Internet Content Selection)等功能。SHDOCVW.DLL组件虽然也提供了很多接口可以单独使用,但是通常所指的SHDOCVW.DLL就是WebBrowser Control。MSHTML.DLL是实行HTML解析和表现的组件。它通过DHTML对象模型提供对HTML文档的访问。它实现了活动文档服务器接口,可以通过COM接口调用。

不难看出,WebBrowser在比较高的层次上,提供了更为丰富的功能,因此一般通常编程都采用WebBrower控件。MSHTML只有在需要解析HTML这样的特殊应用中,才推荐使用。微软的MSDN网站上提供了一个使用MSHTML的例子:WalkAll Sample Source Page。

(*注:In-place链接,是指点击HTML连接时,在相同的WebBrowser实例中显示连接的HTML文档。如果仅使用MSHTML.DLL,点击链接将导致在新的浏览器实例中打开链接的文档。)

首先,在Delphi 7.0组件面板的Internet页上,把TWebBrowser组件放到表单上。

通过执行以下语句装载HTML文档到WebBrowser中进行显示:

WebBrowser1.Navigate(GetCurrentDir + ‘\index.htm‘);

隐藏/显示HTML元件代码示例:

var

Doc : IHTMLDocument2;

element: IHTMLElement;

begin

Doc := IHTMLDocument2(WebBrowser1.Document);

if nil <> Doc then

begin

element := Doc.all.item(‘T1‘, 0) as IHTMLElement;

if nil <> element then begin

if ‘‘ = element.style.display then

element.style.display := ‘none‘

else

element.style.display := ‘‘;

end;

end;

end;

设置/取值代码示例:

var

Doc : IHTMLDocument2;

inputText : IHTMLInputTextElement;

begin

Doc := IHTMLDocument2(WebBrowser1.Document);

if nil <> Doc then

begin

//如果T1不是IHTMLInputTextElement类型将出错

inputText := Doc.all.item(‘T1‘, 0) as IHTMLInputTextElement;

inputText.value := Edit1.Text;

Edit2.Text := inputText.value;

end;

end;

提示:关于哪些HTML元件(标记)应该采用什么MSHTML接口进行访问,请参考MSDN Library中的Web Development > Programming and Reusing the Browser > MSHTML Reference > Interfaces and Scripting Objects。

知道了访问HTML内容的方法,就可以通过间接方式调用HTML页面上包含的JavaScript代码。具体实现方式是:在HTML中插入等不可见元件,利用它的click事件调用响应的JavaScript函数,然后再Delphi中调用该元件的click过程。

下面我们就用Delphi调用JavaScript的alert函数来实现消息提示框。首先在HTML中加入:

Delphi中的调用代码如下:

procedure TForm1.Alert(const Msg : string);

var

Doc : IHTMLDocument2;

Element : IHTMLElement;

begin

Doc := IHTMLDocument2(WebBrowser1.Document);

Assert(nil <> Doc);//一定要先加载HTML

Element := Doc.all.item(‘ShowMessage‘, 0) as IHTMLElement;

if nil <> Element then

begin

Element.innerText := Msg;

Element.click;

end;

end;

我发现在Delphi中用Browser显示HTML,如果你的表单是作为EXE运行,然后嵌入到了别的表单的组件上显示的,例如,Form1.Parent := Form2.Panel1,即Form1显示在Form2中Panel1所占据的位置,当你用ShowMessage显示提示信息时,HTML的内容依然可以被操作,这显然不太好。使用JavaScript中的alert函数则可避免这种现象。

默认情况下,在显示HTML的WebBrowser上点击鼠标右键,会显示一个弹出菜单,和IE中看到的一样。通过这个菜单用户可以查看HTML的源代码。因此有时候我们需要屏蔽该菜单。和该菜单相关的接口是IEDocHostUIHandler。已经用人对它进行了封装,详见ieConst.pas 和 IEDocHostUIHandler.pas。使用方法如下:

var

Form1: TForm1;

FDocHostUIHandler: TDocHostUIHandler;

...

implementation

...

procedure TForm1.FormCreate(Sender: TObject);

begin

FDocHostUIHandler := TDocHostUIHandler.Create;

end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);

begin

FDocHostUIHandler.Free;

end;

procedure TForm1.WebBrowser1NavigateComplete2(Sender: TObject;

pDisp: IDispatch; var URL: OleVariant);

var

hr: HResult;

CustDoc: ICustomDoc;

begin

hr := WebBrowser1.Document.QueryInterface(ICustomDoc, CustDoc);

if hr = S_OK then

CustDoc.SetUIHandler(FDocHostUIHandler);

end;

有时你可能还需要定制自己的右键菜单,这是还是要借助于IEDocHostUIHandler,具体实现方法可以看看MSDN Library。

HTML事件的响应方式有两种:一种是JavaScript,一种是在Delphi中响应。一些简单的功能可以在JavaScript中实现,这样易于修改。但是从功能、安全性等方面考虑,通常还是要在Delphi中实现。例如当用户点击HTML上的一个按钮时,需要访问数据库,这是就得用Delphi了。

在Delphi中响应HTML事件,实际上就是响应ActiveX事件的问题,这通过事件槽(Event Sink)来实现,有些繁琐。还好前人已经为我们作了很多工作。利用Experts Exchange网站的Cynna封装的TDHTMLEvent类(该源码请看本文的附件),实现就简单多了。实现代码如下:

var

Form1: TForm1;

EventSink: TDHTMLEvent;

...

implementation

...

procedure TForm1.FormCreate(Sender: TObject);

begin

EventSink:= TDHTMLEvent.Create;

end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);

begin

EventSink.Free;

end;

procedure TForm1.DemoEventSink(Sender: TObject);

begin

ShowMessage(‘成功从HTML中调用Delphi的过程。‘);

end;

procedure TForm1.WebBrowser1DocumentComplete(Sender: TObject;

const pDisp: IDispatch; var URL: OleVariant);

var

Doc : IHTMLDocument2;

Element : IHTMLElement;

begin

Doc := IHTMLDocument2(WebBrowser1.Document);

if nil <> Doc then

begin            //找到HTML元件            Element := Doc.all.item(‘B3‘, 0) as IHTMLElement;

//使HTML元件的click事件和DemoEventSink过程关连

Element.onclick := EventSink.HookEventHandler(DemoEventSink);

end;

end;

点击HTML页面中ID为‘B3‘的按钮,就会调用DemoEventSink过程。

含有多行文本输入框(textarea )或提交(submit)按钮的HTML表单在TWebBrowser中显示时,对回车键不响应。另外,Delphi表单上按钮的快捷字母键也无法在HTML表单上输入,因为一输入就触发相应按钮的单击事件。解决代码如下:

unitUnit1;

interface

usesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, OleCtrls, SHDocVw_TLB, ActiveX, StdCtrls;

typeTForm1 = class(TForm)

WebBrowser1: TWebBrowser;

Button1: TButton;

Button2: TButton;

procedureFormDestroy(Sender: TObject);

procedureFormCreate(Sender: TObject);

procedureButton1Click(Sender: TObject);

procedureButton2Click(Sender: TObject);

private{ Private declarations }FOleInPlaceActiveObject: IOleInPlaceActiveObject;

procedureMsgHandler(varMsg: TMsg; varHandled: Boolean);

public{ Public declarations }end;

varForm1: TForm1;

implementation{$R *.dfm}procedureTForm1.FormDestroy(Sender: TObject);

beginFOleInPlaceActiveObject := nil;

end;

procedureTForm1.FormCreate(Sender: TObject);

beginApplication.OnMessage := MsgHandler;

end;

procedureTForm1.MsgHandler(varMsg: TMsg; varHandled: Boolean);

constDialogKeys: set ofByte = [VK_LEFT, VK_RIGHT, VK_BACK, VK_UP, VK_DOWN,

$30..$39, $41..42, $44..$55, $57, $59..$5A];

variOIPAO: IOleInPlaceActiveObject;

Dispatch: IDispatch;

begin{ exit if we don‘t get back a webbrowser object }if(WebBrowser1 = nil) then

beginHandled := System.False;

Exit;

end;

Handled := (IsDialogMessage(WebBrowser1.Handle, Msg) = System.True);

if(Handled) and(notWebBrowser1.Busy) then

begin

ifFOleInPlaceActiveObject = nil then

beginDispatch := WebBrowser1.Application;

ifDispatch <> nil then

beginDispatch.QueryInterface(IOleInPlaceActiveObject, iOIPAO);

ifiOIPAO <> nil thenFOleInPlaceActiveObject := iOIPAO;

end;

end;

ifFOleInPlaceActiveObject <> nil then

if((Msg.message= WM_KEYDOWN) or(Msg.message= WM_KEYUP)) and(Msg.wParam inDialogKeys) then// nothing - do not pass on the DialogKeyselseFOleInPlaceActiveObject.TranslateAccelerator(Msg);

end;

end;

initializationOleInitialize(nil);

finalizationOleUninitialize;

本段代码出自SwissDelphiCenter.ch,作者未知。主要要引用ActiveX。Delphi 7中SHDocVw_TLB改为SHDocVw。

HTML的打印和预览向来是个难题,但自从IE5.5推出后,情况大有改观。你可以利用其“打印模板”功能,实现自己的预览窗口和控制打印。“打印模板”的使用方法请参考MSDN Library中的Web Development > Programming and Reusing the Browser > Print Templates目录下的文章。从微软的网站上还可以下载到一个不错的例子,示例如何一步步由浅入深地使用Print Template (下载:打印模板示例)。

你会发现,要自己实现一个功能完善的打印模板也并非易事。IE浏览器本身带的打印模板做得还不错,能否在它的基础上加上自己的定制功能呢?答案是肯定的,至少从技术上看是这样(不考虑版权问题)。下面就介绍这偷懒的招。

用Visual Studio打开x:\Program Files\Internet Explorer\MUI\0804\SHDOCLC.DLL,会看到其资源目录。其中HTML/PREVIEW.DLG就是IE所带的打印模板了。把它export(导出)出来,把文件扩展名改成HTM,打开看看,是不是特刺激?PREVIEW.DLG用到了几个图片文件,在2110目录下,别忘了导出。(注:我的环境是Windows XP Professional英文版+SP1a,IE是6.0sp1。)

IE默认的模版中,页眉页脚均只支持纯文字。下面以定制HTML页眉为例,看看如何定制自己的打印模板。思路是:用自己的页眉内容换掉原有的内容,并修改其页眉高度和页边距使之和新的页眉相对应。

第一步,定义页眉。在要使用此模版预览打印的HTML文件中加入一个id为Header的div标记,括起HTML页眉内容,并制定以英寸为单位的页眉的高度和宽度,其中宽度应该和模版相符。例:

第二步,声明变量。在模版前面变量声明部分加上两个变量声明:

var g_htmlHeader = "";//用于保存页眉内容

var g_nHeaerHeight = 0;//页眉的高度

第三步,取得页眉。在函数OnLoadBody()中的“Printer.footer = dialogArguments.__IE_FooterString”语句之后加入这段代码:

oPageHeader = dialogArguments.__IE_BrowseDocument.all.item("Header", 0);

if (null != oPageHeader)

{

g_htmlHeader = oPageHeader.innerHTML;

g_nHeaerHeight = oPageHeader.style.posHeight;

}

第四步,指定页边距和页眉高度。在上面的代码下面紧接着加入:

//指定页边距。其中40可以自己改,单位是百分之一英寸。

Printer.marginTop = 40 + (g_nHeaerHeight * 100);

Printer.marginBottom = 40;

Printer.marginLeft = 40;

Printer.marginRight = 40;

在函数EnsureDocuments()中,

/*注释掉以下代码

if (header)

{

tmp = upTop + (27 / 100);

if (tmp > top)

top = tmp;

}

if (footer)

{

tmp = upBottom + (27 / 100);

if (tmp > bottom)

bottom = tmp;

}

*/

//紧接着加上:

tmp = upTop + g_nHeaerHeight;

if (tmp > top)

top = tmp;

//下面隔几行,注释掉:oRule.style.top = upTop + "in";

第五步,指定页眉内容。在函数CPrintDoc_AddPage()中,在“HeadFoot.page = HeadFoot.pageTotal;”语句之后加入:

//这两行用于设置页码,你在页眉可以通过加入“[P]”和“[p]”分别代表总页数和当前页数。

g_htmlHeader = g_htmlHeader.replace("[P]", "");

var pageHeader = g_htmlHeader.replace("[p]", HeadFoot.pageTotal);

//下面隔3行,注释掉:

//~oPage.children("header").innerHTML = HeadFoot.HtmlHead;

//~oPage.children("footer").innerHTML = HeadFoot.HtmlFoot;

//下面隔几行,把“newHTM += HeadFoot.HtmlHead;”改为:

newHTM += pageHeader ;

//然后注释掉(不要页脚):newHTM += HeadFoot.HtmlFoot;

至此,一个支持自定义HTML页眉的新模版就定制完成了。是不是觉得特爽?如果觉得它给你省下了两周的时间,就赶紧到“希望之光”网站上,花你2天的工资,资助一个小孩上学吧。

定制好的打印模板怎么用呢?请看以下代码:

var

vaIn, vaOut: OleVariant;

CmdTarget : IOleCommandTarget;

MyHandle : THandle;

begin

vaIn := ‘c:\\Preview.htm‘;

//预览方法1:WebBrowser1.ControlInterface.ExecWB(OLECMDID_PRINTPREVIEW, OLECMDEXECOPT_PROMPTUSER, vaIn, vaOut);

//下面是方法2:    if WebBrowser1.Document <> nil then

begin

WebBrowser1.Document.QueryInterface(IOleCommandTarget, CmdTarget);

if CmdTarget <> nil then

begin

try

CmdTarget.Exec( PGuid(nil), OLECMDID_PRINTPREVIEW, OLECMDEXECOPT_PROMPTUSER, vaIn, vaOut);

finally

CmdTarget._Release;

end;

end

else

begin

ShowMessage(‘IE不支持该功能,请升级至IE5.5以上。‘);

end;

end;

end;

方法1简洁,但是如果WebBroswer不支持打印预览的话就会出错。第二种方法可能更好一些。

在打印预览时,预览窗口的尺寸大小总是和WebBrowser所在的Form的一样,而且没法最大化。更麻烦的是,如果你的表单是嵌入到了别的表单的组件上显示的,例如,Form1.Parent := Form2.Panel1,即Form1显示在Form2中Panel1所占据的位置,那么预览窗口就变得很小了,不拉大根本没法看。解决办法如下,在预览的代码后面加上以下代码,使预览窗口最大化:

Handle:=FindWindow(‘Internet Explorer_TridentDlgFrame‘, ‘打印预览‘);

if 0 <> MyHandle then

begin

ShowWindow(MyHandle , SW_MAXIMIZE);

end;

如果不预览而是直接打印,则把OLECMDID_PRINTPREVIEW换成OLECMDID_PRINT就可以了。

如果要在Web应用中使用打印模板,可以通过ActiveX来实现调用。

注:打印模板需要安装Internet Explorer 5.5以上版本,本文其它功能需要安装Internet Explorer4.0以上版本。

应用做好了,总不能把HTML文件和相关的图片文件等直接发布吧。这样既不安全,前面禁止用户查看源代码的努力也白费了。因此至少应该将这些文件打个包。一般来说,作为资源编译到exe或dll里就行了。我觉得编译到DLL中最为方便。在Visual Studio中,新建一个Win32工程,应用类型选择DLL。然后把HTML文件和相关的图片文件等资源加到工程中,然后编译即可。

再添加HTML等资源时,我强烈推荐用手工加入的方法。原因有二:一,GIF等图片文件加入到工程中时,Studio可能会把文件内容自动改了,使得该文件不能正确显示;二,加入资源后会自动生成资源ID,需要把它改成你需要的名称(通常改成和文件名相同),当文件很多时,这项工作就很浪费时间,也很烦人。手工加入,即用文本编辑器把资源脚本文件(工程名.rc)打开,手工加入内容。我就不赘述了,格式例子如下:

About.htm     HTML     "HTML\\About.htm"

image016.gif     IMAGES     "HTML\\images\\image016.gif"

当加入很多文件时,如何节省时间呢?没有实践经验的人,是不可能想到这些问题的。别着急,按我说的做。

首先,进入命令行(DOS)界面(Windows NT/2000/XP/2003下运行cmd.exe进入),进入你的HTML等资源文件所在的目录,执行“dir > temp.txt”,把文件列表输出到temp.txt。

接着,用文本编辑器把该文件打开,去掉头尾内容,仅留文件列表部分,例如:

2004-03-17 11:20 20,397 About.htm

2004-03-17 11:20 27,397 index.htm

然后,用Excel把修改后的文件打开。打开时,“原始数据类型”请选择“固定宽度 - 每列字段加空格对齐”。这样,日期、时间、文件大小、文件名就被分别放在了不同的列中。删除前三列,仅留文件名一列,并把该列复制一份。在两个文件名列之间插入两个空列,分别填写“HTML”和“"HTML\\”,然后就可以另存成以制表符分隔的文本文件了。

最后,用文本编辑器把上一步处理好的文件打开,不用我多说,只要几个替换,就得到所需要的资源脚本了。对于不同目录下的文件,均需要这么弄以下。

资源脚本弄好了,把资源文件也加入(不是作为资源加入)工程,编译,就得到打包好的DLL文件了。接下来的问题是,这个DLL怎么用啊?别急,WebBrowser支持一种叫res的协议,可以访问文件里的资源。例如,假设上面About.htm打包到了myresource.dll文件中,则可以通过res://myresource.dll/About.htm访问,image016.gif则可通过res://myresource.dll/images/image016.gif访问(注意到了吧,HTML在根目录下,而IMAGES等其它资源则在同名目录下)。如果About.htm中通过“images/image016.gif”引用了image016.gif文件,则该图片在WebBrowser中正常显示。换句话说,你在打包之前,程序可以通过file://...访问HTML,打包之后,只需要换成res://...就可以了----打包对程序和HTML几乎没什么影响。但是,切记,切记!千万不要仅以数字来做文件名(如:1.htm、2.gif等),因为数字是被用来标识某种资源或某个资源的,如果用仅用数字作文件名(可以用字母+数字),打包后会导致访问找不到文件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/346562.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

凡事多找找自己的原因_布袋除尘器灰斗积粉过多、堵灰该咋办?别急,从这8个方面找原因...

灰斗布置在袋室的下部&#xff0c;它除了存放收集下来的粉尘以外&#xff0c;还作为下进气总管使用&#xff0c;当含尘气体进入袋室前先进入灰斗&#xff0c;由于灰斗内容积较大&#xff0c;使得气流速度降低&#xff0c;加之气流方向的改变&#xff0c;使得较粗的尘粒在这里得…

python怎么改变字体大小_Python-docx 整体修改或者部分修改文字的大小和字体类型...

Python中可以用docx来生成word文档&#xff0c;docx中可以自定义文字的大小和字体等。 其中要整体修改文字的字体大小和字体&#xff0c;可以用以下方法&#xff1a; newfile docx.Document() newfile.styles[Normal].font.name Times New Roman newfile.styles[Normal]._ele…

cad设计院常用字体_如何把CAD图纸坐标转换成现场坐标?

使用CAD软件画建筑施工图是很常见的&#xff0c;特别是在施工现场&#xff0c;为了不受现场场地落差的影响&#xff0c;需要使用全站仪&#xff0c;但是使用全站仪需要把CAD图纸转换成CAD坐标&#xff0c;很多人可能并不知道该怎么转换&#xff0c;下面我们就来介绍一下如何把图…

sqlserver select 数值精度_SQL Server读懂语句运行 (二) SET STATISTICS IO ON

对于语句的运行&#xff0c;除了执行计划本身&#xff0c;还有一些其他因素要考虑&#xff0c;例如语句的编译时间、执行时间、做了多少次磁盘读等。这些信息对分析问题很有价值。1 SET STATISTICS TIME ON 2 SET STATISTICS IO ON 3 SET STATISTICS PROFILE ON今天&#xff0c…

.net webservice studio调用方法传参_springboot整合WebService简单版

一.什么是webservice这里给大家分享一下我们的专栏《Java 进阶集中营》&#xff0c;每天都会给大家分享一个最新的java技术内容&#xff0c;有优秀的技术讯息&#xff0c;也欢迎分享在我的专栏里。JAVA 进阶集中营​zhuanlan.zhihu.com二.springboot整合webservice 整合webserv…

如何用html5编写彩色同心圆,HTML5 canvas 同心圆动画

原创。产生的动画效果&#xff1a;* 生成文字渐变颜色随时间的变化。* 使得一组同心圆的取色&#xff0c;随时间而变化1.[图片] open_source.png2.[代码][JavaScript]代码var cnew Array("red","blue","cyan","darkGray","green&…

swiper如何防止冲突_冲突管理:化冲突为机会的8个谈话技巧,从此告别争吵和冷战...

书语人间&#xff1a;每天10分钟&#xff0c;读懂1本好书&#xff0c;点击文章右边的「关注」&#xff0c;一起成长大家好呀~今天&#xff0c;灵遥将继续为你带来《解决冲突的关键技巧&#xff1a;如何增加你的有效社交》一书的共读。上一篇里&#xff0c;我们读到了让聆听和谈…

spss非线性回归分析步骤_SPSS与简单线性回归分析

对数据进行简单线性回归分析常按照以下步骤&#xff1a;1根据研究目的确定因变量和自变量现研究某服装店销售额和客流量的关系&#xff0c;销售额为因变量&#xff0c;客流量为自变量&#xff0c;共计36条数据。2 判断有无异常值判断方法&#xff1a;⑴通过绘制散点图直观观察&…

通过OAuth 2.0和Okta构建具有安全的服务器到服务器通信的Spring Boot应用

“我喜欢编写身份验证和授权代码。” 〜从来没有Java开发人员。 厌倦了一次又一次地建立相同的登录屏幕&#xff1f; 尝试使用Okta API进行托管身份验证&#xff0c;授权和多因素身份验证。 大多数OAuth 2.0指南都围绕用户的上下文&#xff0c;即使用Google&#xff0c;Github…

springboot java获取版本号_深入实践Spring Boot 实战篇,大佬整理出的PDF文档

如何使用Spring Boot 本文章将会详细介绍如何使用Spring Boot。它覆盖了构建系统&#xff0c;自动配置和运行/部署选项等主题。我们也覆盖了一些Spring Boot最佳实践。尽管Spring Boot没有什么特别的(只是一个你能消费的库)&#xff0c;但仍有一些建议&#xff0c;如果你遵循的…

6 redis 编译失败_Centos7.8环境搭建Redis主从复制和哨兵模式

本节我们搭建Redis主从复制和哨兵模式集群&#xff0c;集群的好处是把数据分散不不同的服务器上&#xff0c;解决网站中的很多高并发&#xff0c;高负载等问题&#xff0c;很好的提高网站的性能&#xff0c;也能解决mysql的数据读写问题&#xff0c;所以我们搭建集群非常有必要…

springboot异步注解_Spring Boot 2 :Spring Boot 中的响应式编程和 WebFlux 入门

【小宅按】Spring 5.0 中发布了重量级组件 Webflux&#xff0c;拉起了响应式编程的规模使用序幕。WebFlux 使用的场景是异步非阻塞的&#xff0c;使用 Webflux 作为系统解决方案&#xff0c;在大多数场景下可以提高系统吞吐量。Spring Boot 2.0 是基于 Spring5 构建而成&#x…

结尾的单词_22个以“ez”结尾的西语单词,你掌握了吗?

22 palabras que terminan en -ez22个以“-ez”结尾的西语单词ntido → nitidez 清澈&#xff0c;透明lcido → lucidez 光亮&#xff1b;清楚plido → palidez 苍白&#xff1b;暗淡rpido → rapidez 迅速cido → acidez 酸性estrecho → estrechez 狭窄esbelto → esb…

python xlwt xlrd模块详解_python操作excel之xlrd、xlwt模块详解

python操作excel主要用到xlrd和xlwt这两个库&#xff0c;即xlrd是读excel&#xff0c;xlwt是写excel的库。 可从这里下载https://pypi.python.org/pypi。下面分别记录python读和写excel. python读excel——xlrd 这个过程有几个比较麻烦的问题&#xff0c;比如读取日期、读合并单…

python应届生找工作在深圳_应届毕业程序员找工作,企业最看重你们这些地方

这篇文章来谈一下应届生找工作的问题&#xff0c;最近有很多在校大学生跟我咨询很多企业很多工作要求有工作经验&#xff0c;那这样没工作经验的人都去哪学经验&#xff0c;要求工作经验真的有必要吗&#xff1f;应届生毕业找工作&#xff0c;一直有一个困惑是什么&#xff0c;…

PHP密码问题陈婷代码_PHP实现登录注册

一、首先实现一个PHP的简单登录注册的话 我们要简单的与后端定义一下接口和传输数据的方式 并且我们要有一个phpStudy服务器。第一步&#xff1a;当我们点击注册按钮的时候数据库要接收到客户端请求的数据 第二步&#xff1a;接收到数据以后服务器要处理数据&#xff1a;1.确定…

在Spring Boot中使用Vaadin的简介

介绍 Vaadin的工作方式依赖于服务器端渲染&#xff0c;因此可以自然地集成到诸如Spring之类的框架中。 Vaadin的Spring集成已经存在了一段时间&#xff0c;并且提供了用于在Spring容器中配置和管理Vaadin的工具&#xff0c;如果您希望将Vaadin与Spring Boot结合使用&#xff0c…

excel转las文件_这3种Word、Excel格式不变的互转方法,实在太好用了

日常工作中用Word写总结、写报告&#xff0c;写分析&#xff0c;一定离不开数据支持。但在制作的过程中你一定碰到过这些问题&#xff1a;Excel里做的表格、图表&#xff0c;一复制到word就变的乱七八糟&#xff01;那么&#xff0c;有没有什么好的方法&#xff0c;即省时&…

stm32编码器正反转计数程序_光电编码器接线图分析

编码器(encoder)是将信号(如比特流)或数据进行编制、转换为可用以通讯、传输和存储的信号形式的设备。光电编码器如果按信号原理来分类的话&#xff0c;可以分为增量型编码器和绝对型编码器。旋转编码器是一种光电式旋转测量装置&#xff0c;它将被测的角位移直接转换成数字信号…

jieba库词频统计_如何用python对《三国演义》、《红楼梦》等名著开展词云分析及字频统计、出场统计等工作。...

以下以《红楼梦》为例进行设计。在制作词云图及统计之前&#xff0c;需要下载python的几个库&#xff0c;wordcloud、jieba以及imageio等&#xff0c;我的操作系统为Windows10&#xff0c;IDE环境为idle&#xff0c;下载方式就直接搜索cmd&#xff0c;打开命令提示符窗口&#…