题记:用“易语言.飞扬”(EF)开发WEB应用程序,此前还没有先例。但因为EF本地开发包(EFNDK)已经发布,用C/C++开发一个EF类库,使其支持EF开发WEB应用程序,应该并非难事。当然也可想而知,其中必有诸多难点有待解决。此系列文章,为本人探索过程之记录,对外人未必有多大价值。如有网友乐观其事,还请理性待之。作者:liigo。转载请务必注明出处:http://blog.csdn.net/liigo/。在线留言。
试用EF开发WEB应用程序(12): 网页计数器
又一个 EFCGI 应用实例,网页计数器。
网页计数器,在目前网络上应用十分普遍,其功能是,对网页的被浏览次数进行统计,网页每被浏览一次,该计数值就被加一。
我实现的这个网页计数器,是一个通用网页计数器。即,它可以给任意人、任意网页提供计数服务,只要你事先申请得到一个ID。在线申请计数器。
以下是本网页计数器的“易语言.飞扬”(EF)源代码:
引入 fastcgi, sqlite;
公开 类 启动类
{
静态 Sqlite数据库 _db;
公开 静态 启动()
{
_db = new Sqlite数据库();
_db.打开( " ../db/pagecounter.file " , true );
if (_db.表是否存在( " pagecounter " ) == false )
createTable();
FCGI fcgi = new FCGI;
while (fcgi.Accept() >= 0 )
{
if (fcgi.REQUEST_METHOD.到小写() == " post " )
fcgi.ReadContentAsQueryString();
文本 html = html_template.替换全部( " $(title) " , " 网页计数器(由EF开发) " );
string pathinfo = fcgi.PATH_INFO();
string message;
// 处理提交的表单(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 " )
{
string id = 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><script src="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( " update pagecounter set count = " + count + " where id= " + 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(FCGI fcgi)
{
string username = fcgi.QUERY_STRING( " username " );
if (username == "" ) username = " EF爱好者 " ;
string initcount = fcgi.QUERY_STRING( " initcount " );
string sql = " insert into pagecounter(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 >
< meta http - equiv = " content-type " content = " text/html;charset=utf-8 " >
< title > $(title) </ title >
</ head >
< body >
< h1 > $(title) </ h1 >
< p > 网页记数器:为单个网页提供流量统计。 </ p >
$(message)
< hr ></ hr >
< h3 > 您还没有计数器?请先申请: </ h3 >
< form method = " post " action = " /efcgi/pagecounter.efcgi/submit " >
< p > 姓名: < input type = " text " name = " username " size = 20 /></ p >
< p > 说明: < input type = " text " name = " remark " size = 80 /></ p >
< p > 计数器初始值: < input type = " text " name = " initcount " size = 10 value = " 0 " /></ p >
< p >< input type = " submit " value = " 提交 " ></ input ></ p >
</ form >
< hr ></ hr >
< p > by liigo, < a href = " http://blog.csdn.net/liigo/ " > http: // blog.csdn.net/liigo/</a></p>
</ body >
</ html >
" ];
}
公开 类 启动类
{
静态 Sqlite数据库 _db;
公开 静态 启动()
{
_db = new Sqlite数据库();
_db.打开( " ../db/pagecounter.file " , true );
if (_db.表是否存在( " pagecounter " ) == false )
createTable();
FCGI fcgi = new FCGI;
while (fcgi.Accept() >= 0 )
{
if (fcgi.REQUEST_METHOD.到小写() == " post " )
fcgi.ReadContentAsQueryString();
文本 html = html_template.替换全部( " $(title) " , " 网页计数器(由EF开发) " );
string pathinfo = fcgi.PATH_INFO();
string message;
// 处理提交的表单(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 " )
{
string id = 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><script src="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( " update pagecounter set count = " + count + " where id= " + 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(FCGI fcgi)
{
string username = fcgi.QUERY_STRING( " username " );
if (username == "" ) username = " EF爱好者 " ;
string initcount = fcgi.QUERY_STRING( " initcount " );
string sql = " insert into pagecounter(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 >
< meta http - equiv = " content-type " content = " text/html;charset=utf-8 " >
< title > $(title) </ title >
</ head >
< body >
< h1 > $(title) </ h1 >
< p > 网页记数器:为单个网页提供流量统计。 </ p >
$(message)
< hr ></ hr >
< h3 > 您还没有计数器?请先申请: </ h3 >
< form method = " post " action = " /efcgi/pagecounter.efcgi/submit " >
< p > 姓名: < input type = " text " name = " username " size = 20 /></ p >
< p > 说明: < input type = " text " name = " remark " size = 80 /></ p >
< p > 计数器初始值: < input type = " text " name = " initcount " size = 10 value = " 0 " /></ p >
< p >< input type = " submit " value = " 提交 " ></ input ></ p >
</ form >
< hr ></ hr >
< p > by liigo, < a href = " http://blog.csdn.net/liigo/ " > http: // blog.csdn.net/liigo/</a></p>
</ body >
</ html >
" ];
}
在注册得到ID之后,请将以下代码放置到欲添加计数器的HTML网页源代码中:
这里有一个使用了此网页计数器的测试网页。