📄 intraweb开发学习笔记(二).htm
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0034)http://www.51delphi.com/wz/16.html -->
<HTML><HEAD><TITLE>IntraWeb开发学习笔记(二)</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<STYLE type=text/css>BODY {
FONT-SIZE: 10pt; FONT-FAMILY: "Tahoma", "宋体"
}
.Title {
FONT-WEIGHT: bold; FONT-SIZE: 12pt; LINE-HEIGHT: 14pt; FONT-FAMILY: "Tahoma", "宋体"; BACKGROUND-COLOR: #ccccff
}
TD {
TEXT-INDENT: 18pt
}
.SubTitle {
FONT-SIZE: 10pt; LINE-HEIGHT: 14pt; FONT-FAMILY: "Tahoma", "宋体"; BACKGROUND-COLOR: #cc99ff
}
.body {
FONT-SIZE: 10pt; FONT-FAMILY: "Tahoma", "宋体"
}
</STYLE>
<META content="MSHTML 6.00.2600.0" name=GENERATOR></HEAD>
<BODY>
<TABLE cellSpacing=1 cellPadding=0 width="80%" align=center bgColor=#0033ff
border=0>
<TBODY>
<TR>
<TD class=Title bgColor=#ffffff>
<DIV align=center>IntraWeb开发学习笔记<FONT size=-1>(二)</FONT></DIV>
<DIV align=right><FONT size=-1>作者:bnPYSse(原创)</FONT></DIV></TD></TR>
<TR>
<TD class=body bgColor=#ffffff>
<P>第一期学习笔记在窑洞刊出后,热心的朋友们给了我很多鼓励,于是我就不自量力,再来一篇。如需交流,请联系我:<A
href="mailto:bnpysse@sina.com">邮箱</A></P>
<P>用Delphi的WebBroker开发应用程序,按我的理解,先是做好网站的架构,然后利用TPageProducer来处理模板文件中的HtmlTag,利用Action来控制程序的流向或者处理用户的提交请求(路径的概念就象是ASP应用中的一个个子程序)。整个开发过程步骤比较简单,而且按Xalion的话来讲,是容易定制或可以满足你所有要求的,唯一的缺点,就是比较繁琐。而IntraWeb在方面可以说是走了另外的路子,不过,由于其本身的限制,它并不是非常适合做网站的开发应用,当然,这只是我个人的理解。</P>
<P>比如,大家比较关心的问题,如何打开第二个窗口的问题,IntraWeb并不支持这种功能,每个服务程序在运行时只能有一个主窗口,所谓的第二个窗口只可以显示某些信息,不能够响应用户的请求。再比如Frames的问题,虽然在它的第三方控件Arcana中提供了一个TEmbededHtml,来模拟显示多框架结构,但并没有在根本上解决这个问题(后面我会讲到利用TEmbededHtml结合TPageForm来实现类似多框架显示的问题,大家可以到<A
href="http://www.arcanatech.com/">Arcana网站</A>看一下它的效果)。</P></TD></TR>
<TR>
<TD class=SubTitle bgColor=#ffffff>8、关于模板文件的问题。</TD></TR>
<TR>
<TD class=body bgColor=#ffffff>
<P>在应用模板文件过程中,有几个需要注意的问题。</P>
<P>一是目录的位置。必须是建在当前目录的Templates下,不要试图去更改这个位置。</P>
<P>二是命名的问题。模板文件的名称后缀必须是.html,其名称必须和你所建的PageForm的名称相同,有些朋友以为是和自己存盘的PAS文件同名,那样是不会找到模板的。</P>
<P>三是在加入标记的时候,是和Form中的组件一一对应的。当然,也可以利用它的OnUnknownTag来处理一些特殊的自己定义的标记。比如你在模板中加入了一个{%img%},但在Form中并没有对应的组件,就必须你自己来写处理代码:</P>
<P>if AName='img' then<BR> VValue:='<img
src="/../files/chinaPost.gif">';</P>
<P>四是如果你在你的程序中应用了Delphi的TFrame,就象IntraWeb自带的那个Features程序一样,在生成的AppForm中再使用模板,那么程序将会冲掉你主程序的样式,而进入模板文件所带的样式。<BR></P></TD></TR>
<TR>
<TD class=SubTitle bgColor=#ffffff>9、目录的问题</TD></TR>
<TR>
<TD class=body bgColor=#ffffff>
<P>在一个AppMode的程序开始运行里,如果大家看一下它的网页源代码,就会发现象下面这样的语句:</P>
<P><script language=Javascript
src="/js/IWCommon.js_5.0.56"></script></P>
<P>其中/js,/gfx目录是系统设置的目录,如果是在页模式下,你就会发现有这样一个全局变量(这个全局变量在APPMode下永远是空的):</P>
<P>var GURLBase="/YourWebDirectory/YourISAPIProject.dll/iw"</P>
<P>而且上面的地址也变成了:</P>
<P><script language=Javascript
src="/YourWebDirectory/YourISAPIProject.dll/iw/js/IWCommon.js_5.0.56"></script></P>
<P>哈哈,不知道大家发现没有,目录里面多了一个/iw,这也就是为什么在你的目录引用中要加上/../files/的原因。</P>
<P>如果发现你的图形没有显示出来或文件没有找到,首先要查的就是这里哟。</P></TD></TR>
<TR>
<TD class=SubTitle bgColor=#ffffff>10、AppMode下的用户管理</TD></TR>
<TR>
<TD class=body bgColor=#ffffff>
<P> </P>
<P>新建一个IntraWebApplication之后,在ServerController中向导会自动生成如下的语句:</P>
<P>TUserSession = class<BR> public<BR> end;</P>
<P>在此处你就可以添加自己的用户个人信息,比如用户名,口令,以及权限管理等属性,比如在Login里面,如果通过了口令字验证,就可以添加下列语句:</P>
<P>UserSession.UserName:=trim(edtUser.text);<BR>
UserSession.UserPass:=Trim(edtPass.Text);</P>
<P>UserSession可以在程序的整个过程中维持,可以写数据库或者文件中,什么时候想用拿来使就可以,相当方便,而且远比Cookie要安全得多。</P></TD></TR>
<TR>
<TD class=SubTitle bgColor=#ffffff>11、gsAppPath的说明</TD></TR>
<TR>
<TD class=body bgColor=#ffffff>
<P>如果在程序中想要获得服务器程序的工作目录,不能象传统的Delphi应用程序那样使用Application.ExeName,而必须使用gsAppPath,,这是一个全局变量,并且不要忘了在Uses子句中加上它的单元名称:SWSystem。</P>
<P>比如您允许客户端上传文件到指定的服务器目录时或者存取服务器上某些文件时,它就用得到了。</P></TD></TR>
<TR>
<TD class=SubTitle bgColor=#ffffff>12、打开一个新窗口的问题</TD></TR>
<TR>
<TD class=body bgColor=#ffffff>
<P>在AppMode下打开一个新窗口是比较简单的,在Demo程序中有示例,即:</P>
<P>AddToInitProc('NewWindow("' + WebApplication.URLBase + '/Files/' +
'test.html' + '", "","resizeable=yes,toolbar=yes");');</P>
<P>最后一个参数供您对新打开的窗口进行某属性的设置。</P>
<P>这里打开的文件只能是网页文件或者是PDF文件,显示一些处理结果和信息给客户,是无法打AppForm的。</P>
<P>如果想在一个无状态条、无菜单栏的Browser窗口中运行你自己的WebApplication(也许这样看起来更专业一些),可以借用下面这段JavaScript代码:
</P>
<P><HTML><BR><HEAD><BR><SCRIPT
LANGUAGE="JavaScript"><BR><!-- Begin<BR>var curPopupWindow =
null;<BR>function openNewWindow() {<BR>var center = true<BR>var xposition
= 0; // Postions the window vertically in px<BR>var yposition = 0; //
Postions the window horizontally in px<BR>if
((parseInt(navigator.appVersion) >= 4 ) &&
(center)){<BR>xposition = 0;<BR>yposition = 0;<BR>}<BR>var width =
800<BR>var winName = 'Test'<BR>var height = 600<BR><FONT
color=#ff0066>//在这里您需要设置您的服务器地址和端口号</FONT><BR>var url =
'http://127.0.0.1:1234/'<BR>// Features to specify for a new
window<BR><FONT color=#ff0066>//在这里您还可以设置您要打开窗口的某些属性</FONT><BR>args =
"width=" + width + ","<BR>+ "height=" + height + ","<BR>+
"location=0,"<BR>+ "menubar=0,"<BR>+ "resizable=1,"<BR>+
"scrollbars=0,"<BR>+ "status=0,"<BR>+ "titlebar=0,"<BR>+ "toolbar=0,"<BR>+
"hotkeys=0,"<BR>+ "screenx=" + xposition + "," //NN Only<BR>+ "screeny=" +
yposition + "," //NN Only<BR>+ "left=" + xposition + "," //IE Only<BR>+
"top=" + yposition; //IE Only<BR>// Performs the opening of the
window.<BR>if (curPopupWindow != null) {<BR>if (!curPopupWindow.closed)
{<BR>curPopupWindow.close();<BR>}<BR>curPopupWindow =
null;<BR>}<BR>curPopupWindow = window.open(url, winName, args,
false);<BR>curPopupWindow.focus();<BR>}<BR>//
--><BR></script><BR></HEAD><BR><BODY><BR><SCRIPT
LANGUAGE="JavaScript"><BR><!-- Begin<BR>var useragent =
navigator.userAgent;<BR>var bName = (useragent.indexOf('Opera') > -1) ?
'Opera' : navigator.appName;<BR>var pos = useragent.indexOf('MSIE');<BR>if
(pos > -1) {<BR>bVer = useragent.substring(pos + 5);<BR>var pos =
bVer.indexOf(';');<BR>var bVer = bVer.substring(0,pos);<BR>}<BR>var pos =
useragent.indexOf('Opera');<BR>if (pos > -1) {<BR>bVer =
useragent.substring(pos + 6);<BR>var pos = bVer.indexOf(' ');<BR>var bVer
= bVer.substring(0, pos);<BR>}<BR>if (bName == "Netscape") {<BR>var bVer =
useragent.substring(8);<BR>var pos = bVer.indexOf(' ');<BR>var bVer =
bVer.substring(0, pos);<BR>}<BR>if (bName == "Netscape" &&
parseInt(navigator.appVersion) >= 5) {<BR>var pos =
useragent.lastIndexOf('/');<BR>var bVer = useragent.substring(pos +
1);<BR>}<BR>document.writeln('You are using
<br>');<BR>document.writeln('Browser Name: ' + bName +
'<br>');<BR>document.writeln('Browser Version: ' + bVer +
'<br>');<BR>if (bVer >= 5)
{<BR>document.writeln('<br><br><b>CLICK <a
href="javascript:openNewWindow()">HERE </a> TO LOG
IN</b>');<BR>}<BR>else {<BR>document.writeln('This section requires
a fully HTML 4.0 compatible browser with javascript
enabled.<br><br>');<BR>document.writeln('Free browsers that
meet HTML4 specifications are downloadable
at:<br><br>');<BR>document.writeln('<a
href="http://www.microsoft.com">Microsoft (version 5 or
higher)</a><br>');<BR>document.writeln('<a
href="http://www.netscape.com">Netscape (version 6 or
higher)</a><br>');<BR>document.writeln('<a
href="http://www.opera.com">Opera (version 6 or
higher)</a><br>');<BR>}<BR>// End
--><BR></script></P>
<P>将这个HTML文件放入到您的WWW目录中,然后在服务器端安装好您的IntraWeb服务程序,那么当访问您的站点时,将引导使用者进入到一个无状态条、无菜单栏的浏览器窗口中。</P></TD></TR>
<TR>
<TD class=body bgColor=#ffffff><FONT
color=#990000>先到这里吧,如果有什么错误的地方,请大家指正。谢谢!</FONT></TD></TR></TBODY></TABLE></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -