题记:用“易语言.飞扬”(EF)开发WEB应用程序,此前还没有先例。但因为EF本地开发包(EFNDK)已经发布,用C/C++开发一个EF类库,使其支持EF开发WEB应用程序,应该并非难事。当然也可想而知,其中必有诸多难点有待解决。此系列文章,为本人探索过程之记录,对外人未必有多大价值。如有网友乐观其事,还请理性待之。作者:liigo。转载请务必注明出处:http://blog.youkuaiyun.com/liigo/。在线留言。
试用EF开发WEB应用程序(12):网页计数器
又一个 EFCGI 应用实例,网页计数器。
网页计数器,在目前网络上应用十分普遍,其功能是,对网页的被浏览次数进行统计,网页每被浏览一次,该计数值就被加一。
我实现的这个网页计数器,是一个通用网页计数器。即,它可以给任意人、任意网页提供计数服务,只要你事先申请得到一个ID。在线申请计数器。
以下是本网页计数器的“易语言.飞扬”(EF)源代码:
引入fastcgi,sqlite;
公开类启动类
{
静态Sqlite数据库_db;
公开静态启动()
{
_db = new Sqlite数据库();
_db.打开( " ../db/pagecounter.file " , true );
if (_db.表是否存在( " pagecounter " ) == false )
createTable();
FCGIfcgi = new FCGI;
while (fcgi.Accept() >= 0 )
{
if (fcgi.REQUEST_METHOD.到小写() == " post " )
fcgi.ReadContentAsQueryString();
文本html = html_template.替换全部( " $(title) " , " 网页计数器(由EF开发) " );
stringpathinfo = fcgi.PATH_INFO();
stringmessage;
// 处理提交的表单(form)
if (pathinfo == " /submit " )
{
int id;
if (fcgi.QUERY_STRING( " username " ) != "" || fcgi.QUERY_STRING( " remark " ) != "" )
id = registerID(fcgi);
fcgi.Output( " Location:/efcgi/pagecounter.efcgi/id " + id.到文本() + " " );
continue ;
}
// 显示处理结果
if (pathinfo.左边( 3 ) == " /id " )
{
stringid = pathinfo.右边(pathinfo.长度 - 3 ); // "/id123"->"123"
if (id == " 0 " )
{
message += " <p><b>对不起,操作失败。请尝试重新申请。</b></p> " ;
}
else
{
message += " <p><b>恭喜,注册成功,id为 " + id + " (请务必记住)。</b></p> " ;
message += " <p>欲使用此计数器,请将以下代码放到HTML中任意位置:</p> " ;
message += " <p><pre><scriptsrc="http://liigo.com/efcgi/pagecounter.efcgi?id= " + id + " "></script></pre></p> " ;
}
}
// 根据id查计数器,并返回相应的js代码
if (fcgi.QUERY_STRING( " id " ) != "" )
{
通用型count = _db.读字段值( " pagecounter " , " count " ,Sqlite字段类型.整数, " id= " + fcgi.QUERY_STRING( " id " ));
count = count.取整数() + 1 ;
_db.执行SQL( " updatepagecountersetcount= " + count + " whereid= " + fcgi.QUERY_STRING( " id " ));
fcgi.Output( " Content-type:application/x-javascript document.write(" " + count.取整数().到文本() + " "); " );
continue ;
}
html = html.替换( " $(message) " ,message);
fcgi.Output(html.到UTF8());
}
_db.关闭();
}
private static createTable()
{
Sqlite表结构tdef = new Sqlite表结构();
tdef.添加字段( " id " ,Sqlite字段类型.主键整数);
tdef.添加字段( " count " ,Sqlite字段类型.整数);
tdef.添加字段( " username " ,Sqlite字段类型.文本);
tdef.添加字段( " remark " ,Sqlite字段类型.文本);
_db.创建表( " pagecounter " ,tdef);
}
// 注册计数器,返回id
private static int registerID(FCGIfcgi)
{
stringusername = fcgi.QUERY_STRING( " username " );
if (username == "" )username = " EF爱好者 " ;
stringinitcount = fcgi.QUERY_STRING( " initcount " );
stringsql = " insertintopagecounter(username,remark,count)values(' " + username + " ',' " + fcgi.QUERY_STRING( " remark " ) + " ', " + initcount + " ) " ;
if (_db.执行SQL(sql))
return ( int )_db.取最新插入ID();
else
return 0 ;
}
常量文本html_template = [ " Content-type:text/html
< html >< head >
< metahttp - equiv = " content-type " content = " text/html;charset=utf-8 " >
< title > $(title) </ title >
</ head >
< body >
< h1 > $(title) </ h1 >
< p > 网页记数器:为单个网页提供流量统计。 </ p >
$(message)
< hr ></ hr >
< h3 > 您还没有计数器?请先申请: </ h3 >
< formmethod = " post " action = " /efcgi/pagecounter.efcgi/submit " >
< p > 姓名: < inputtype = " text " name = " username " size = 20 /></ p >
< p > 说明: < inputtype = " text " name = " remark " size = 80 /></ p >
< p > 计数器初始值: < inputtype = " text " name = " initcount " size = 10 value = " 0 " /></ p >
< p >< inputtype = " submit " value = " 提交 " ></ input ></ p >
</ form >
< hr ></ hr >
< p > byliigo, < ahref = " http://blog.youkuaiyun.com/liigo/ " > http: // blog.youkuaiyun.com/liigo/</a></p>
</ body >
</ html >
" ];
}
公开类启动类
{
静态Sqlite数据库_db;
公开静态启动()
{
_db = new Sqlite数据库();
_db.打开( " ../db/pagecounter.file " , true );
if (_db.表是否存在( " pagecounter " ) == false )
createTable();
FCGIfcgi = new FCGI;
while (fcgi.Accept() >= 0 )
{
if (fcgi.REQUEST_METHOD.到小写() == " post " )
fcgi.ReadContentAsQueryString();
文本html = html_template.替换全部( " $(title) " , " 网页计数器(由EF开发) " );
stringpathinfo = fcgi.PATH_INFO();
stringmessage;
// 处理提交的表单(form)
if (pathinfo == " /submit " )
{
int id;
if (fcgi.QUERY_STRING( " username " ) != "" || fcgi.QUERY_STRING( " remark " ) != "" )
id = registerID(fcgi);
fcgi.Output( " Location:/efcgi/pagecounter.efcgi/id " + id.到文本() + " " );
continue ;
}
// 显示处理结果
if (pathinfo.左边( 3 ) == " /id " )
{
stringid = pathinfo.右边(pathinfo.长度 - 3 ); // "/id123"->"123"
if (id == " 0 " )
{
message += " <p><b>对不起,操作失败。请尝试重新申请。</b></p> " ;
}
else
{
message += " <p><b>恭喜,注册成功,id为 " + id + " (请务必记住)。</b></p> " ;
message += " <p>欲使用此计数器,请将以下代码放到HTML中任意位置:</p> " ;
message += " <p><pre><scriptsrc="http://liigo.com/efcgi/pagecounter.efcgi?id= " + id + " "></script></pre></p> " ;
}
}
// 根据id查计数器,并返回相应的js代码
if (fcgi.QUERY_STRING( " id " ) != "" )
{
通用型count = _db.读字段值( " pagecounter " , " count " ,Sqlite字段类型.整数, " id= " + fcgi.QUERY_STRING( " id " ));
count = count.取整数() + 1 ;
_db.执行SQL( " updatepagecountersetcount= " + count + " whereid= " + fcgi.QUERY_STRING( " id " ));
fcgi.Output( " Content-type:application/x-javascript document.write(" " + count.取整数().到文本() + " "); " );
continue ;
}
html = html.替换( " $(message) " ,message);
fcgi.Output(html.到UTF8());
}
_db.关闭();
}
private static createTable()
{
Sqlite表结构tdef = new Sqlite表结构();
tdef.添加字段( " id " ,Sqlite字段类型.主键整数);
tdef.添加字段( " count " ,Sqlite字段类型.整数);
tdef.添加字段( " username " ,Sqlite字段类型.文本);
tdef.添加字段( " remark " ,Sqlite字段类型.文本);
_db.创建表( " pagecounter " ,tdef);
}
// 注册计数器,返回id
private static int registerID(FCGIfcgi)
{
stringusername = fcgi.QUERY_STRING( " username " );
if (username == "" )username = " EF爱好者 " ;
stringinitcount = fcgi.QUERY_STRING( " initcount " );
stringsql = " insertintopagecounter(username,remark,count)values(' " + username + " ',' " + fcgi.QUERY_STRING( " remark " ) + " ', " + initcount + " ) " ;
if (_db.执行SQL(sql))
return ( int )_db.取最新插入ID();
else
return 0 ;
}
常量文本html_template = [ " Content-type:text/html
< html >< head >
< metahttp - equiv = " content-type " content = " text/html;charset=utf-8 " >
< title > $(title) </ title >
</ head >
< body >
< h1 > $(title) </ h1 >
< p > 网页记数器:为单个网页提供流量统计。 </ p >
$(message)
< hr ></ hr >
< h3 > 您还没有计数器?请先申请: </ h3 >
< formmethod = " post " action = " /efcgi/pagecounter.efcgi/submit " >
< p > 姓名: < inputtype = " text " name = " username " size = 20 /></ p >
< p > 说明: < inputtype = " text " name = " remark " size = 80 /></ p >
< p > 计数器初始值: < inputtype = " text " name = " initcount " size = 10 value = " 0 " /></ p >
< p >< inputtype = " submit " value = " 提交 " ></ input ></ p >
</ form >
< hr ></ hr >
< p > byliigo, < ahref = " http://blog.youkuaiyun.com/liigo/ " > http: // blog.youkuaiyun.com/liigo/</a></p>
</ body >
</ html >
" ];
}
在注册得到ID之后,请将以下代码放置到欲添加计数器的HTML网页源代码中:
这里有一个使用了此网页计数器的测试网页。