题记:用“易语言.飞扬”(EF)开发WEB应用程序,此前还没有先例。但因为EF本地开发包(EFNDK)已经发布,用C/C++开发一个EF类库,使其支持EF开发WEB应用程序,应该并非难事。当然也可想而知,其中必有诸多难点有待解决。此系列文章,为本人探索过程之记录,对外人未必有多大价值。如有网友乐观其事,还请理性待之。作者:liigo。转载请务必注明出处:http://blog.csdn.net/liigo/。在线留言。
试用EF开发WEB应用程序(11): 在线留言系统
在线留言系统入口 (非常感谢好友龚辟愚提供网络服务器)
此留言板的“易语言.飞扬”(EF)完整源代码如下:
引入 fastcgi, sqlite, 工具;
公开 类 启动类
{
静态 Sqlite数据库 _db;
公开 静态 启动()
{
_db = new Sqlite数据库();
_db.打开( " ../db/msgboard.file " , true );
if (_db.表是否存在( " messages " ) == false )
createTable();
FCGI fcgi = new FCGI;
while (fcgi.Accept() >= 0 )
{
if (fcgi.REQUEST_METHOD.到小写() == " post " )
fcgi.ReadContentAsQueryString();
文本 html = html_template.替换全部( " $(title) " , " 留言板(由EF开发) " );
if (fcgi.QUERY_STRING( " name " ) != "" || fcgi.QUERY_STRING( " message " ) != "" )
insertMessage(fcgi);
// delete all messages
if (fcgi.QUERY_STRING( " cleandb " ) == " byliigo " )
_db.执行SQL( " delete from messages where 1=1 " );
string messages; int count;
(messages,count) = listAllMessages();
html = html.替换( " $(messages) " , messages);
html = html.替换( " $(count) " , count.到文本());
fcgi.Output(html.到UTF8());
}
_db.关闭();
}
private static createTable()
{
Sqlite表结构 tdef = new Sqlite表结构();
tdef.添加字段( " id " , Sqlite字段类型.主键整数);
tdef.添加字段( " name " , Sqlite字段类型.文本);
tdef.添加字段( " message " , Sqlite字段类型.文本);
tdef.添加字段( " ip " , Sqlite字段类型.文本);
tdef.添加字段( " date " , Sqlite字段类型.文本);
_db.创建表( " messages " , tdef);
}
private static bool insertMessage(FCGI fcgi)
{
private static string GetDate()
{
日期时间类 t = new 日期时间类();
return t.年().到文本() + " / " + t.月().到文本() + " / " + t.日().到文本() + " " + t.时().到文本() + " : " + t.分().到文本() + " : " + t.秒().到文本();
}
string name = fcgi.QUERY_STRING( " name " );
if (name == "" ) name = " EF爱好者 " ;
string message = fcgi.QUERY_STRING( " message " );
if (message == "" ) message = " 他/她很懒,什么都没说:) " ;
string ip = fcgi.REMOTE_ADDR;
string date = GetDate();
string sql = " insert into messages(name, message, ip, date) values(' " + name + " ',' " + message + " ',' " + ip + " ',' " + date + " ') " ;
return _db.执行SQL(sql);
}
private static string, int listAllMessages()
{
private static string fixHTMLChars(string s)
{
s = s.替换全部( " & " , " & " );
s = s.替换全部( " < " , " < " );
s = s.替换全部( " > " , " > " );
// someone note this? :)
s = s.替换全部( " [b] " , " <b> " ); s = s.替换全部( " [/b] " , " </b> " );
s = s.替换全部( " [red] " , " <font color="red"> " ); s = s.替换全部( " [/red] " , " </font> " );
s = s.替换全部( " [blue] " , " <font color="blue"> " ); s = s.替换全部( " [/blue] " , " </font> " );
s = s.替换全部( " [green] " , " <font color="green"> " ); s = s.替换全部( " [/green] " , " </font> " );
return s;
}
private static string formatMessage(string name, string message, string ip, string date)
{
static string msg_template = " <p>$(name) ($(ip)) 于 $(date) 留言:$(message)</p> " ;
string msg = msg_template.替换( " $(name) " , name);
msg = msg.替换( " $(ip) " , ip);
msg = msg.替换( " $(message) " , fixHTMLChars(message));
msg = msg.替换( " $(date) " , date);
return msg;
}
Sqlite记录集 query = new Sqlite记录集(_db, " select* from messages order by _ROWID_ desc " );
string messages = "" ;
int count = 0 ;
if (query.打开())
{
count = query.取记录数();
while (query.到下一记录())
{
messages += formatMessage(query.读字段值( " name " , Sqlite字段类型.文本), query.读字段值( " message " , Sqlite字段类型.文本), query.读字段值( " ip " , Sqlite字段类型.文本), query.读字段值( " date " , Sqlite字段类型.文本));
}
}
return (messages, count);
}
常量 文本 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 >
< hr ></ hr >
< form method = " post " >
< p > 姓名: < input type = " text " name = " name " size = 20 /></ p >
< p > 留言: < input type = " text " name = " message " size = 100 /></ p >
< p >< input type = " submit " value = " 提交留言 " ></ input ></ p >
</ form >
< p >< a href = " msgboard.txt " target = " _blank " > 此留言板的EF源代码 </ a ></ p >
< hr ></ hr >
< h1 > 所有留言(共 $(count) 条) </ h1 >
$(messages)
< 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/msgboard.file " , true );
if (_db.表是否存在( " messages " ) == false )
createTable();
FCGI fcgi = new FCGI;
while (fcgi.Accept() >= 0 )
{
if (fcgi.REQUEST_METHOD.到小写() == " post " )
fcgi.ReadContentAsQueryString();
文本 html = html_template.替换全部( " $(title) " , " 留言板(由EF开发) " );
if (fcgi.QUERY_STRING( " name " ) != "" || fcgi.QUERY_STRING( " message " ) != "" )
insertMessage(fcgi);
// delete all messages
if (fcgi.QUERY_STRING( " cleandb " ) == " byliigo " )
_db.执行SQL( " delete from messages where 1=1 " );
string messages; int count;
(messages,count) = listAllMessages();
html = html.替换( " $(messages) " , messages);
html = html.替换( " $(count) " , count.到文本());
fcgi.Output(html.到UTF8());
}
_db.关闭();
}
private static createTable()
{
Sqlite表结构 tdef = new Sqlite表结构();
tdef.添加字段( " id " , Sqlite字段类型.主键整数);
tdef.添加字段( " name " , Sqlite字段类型.文本);
tdef.添加字段( " message " , Sqlite字段类型.文本);
tdef.添加字段( " ip " , Sqlite字段类型.文本);
tdef.添加字段( " date " , Sqlite字段类型.文本);
_db.创建表( " messages " , tdef);
}
private static bool insertMessage(FCGI fcgi)
{
private static string GetDate()
{
日期时间类 t = new 日期时间类();
return t.年().到文本() + " / " + t.月().到文本() + " / " + t.日().到文本() + " " + t.时().到文本() + " : " + t.分().到文本() + " : " + t.秒().到文本();
}
string name = fcgi.QUERY_STRING( " name " );
if (name == "" ) name = " EF爱好者 " ;
string message = fcgi.QUERY_STRING( " message " );
if (message == "" ) message = " 他/她很懒,什么都没说:) " ;
string ip = fcgi.REMOTE_ADDR;
string date = GetDate();
string sql = " insert into messages(name, message, ip, date) values(' " + name + " ',' " + message + " ',' " + ip + " ',' " + date + " ') " ;
return _db.执行SQL(sql);
}
private static string, int listAllMessages()
{
private static string fixHTMLChars(string s)
{
s = s.替换全部( " & " , " & " );
s = s.替换全部( " < " , " < " );
s = s.替换全部( " > " , " > " );
// someone note this? :)
s = s.替换全部( " [b] " , " <b> " ); s = s.替换全部( " [/b] " , " </b> " );
s = s.替换全部( " [red] " , " <font color="red"> " ); s = s.替换全部( " [/red] " , " </font> " );
s = s.替换全部( " [blue] " , " <font color="blue"> " ); s = s.替换全部( " [/blue] " , " </font> " );
s = s.替换全部( " [green] " , " <font color="green"> " ); s = s.替换全部( " [/green] " , " </font> " );
return s;
}
private static string formatMessage(string name, string message, string ip, string date)
{
static string msg_template = " <p>$(name) ($(ip)) 于 $(date) 留言:$(message)</p> " ;
string msg = msg_template.替换( " $(name) " , name);
msg = msg.替换( " $(ip) " , ip);
msg = msg.替换( " $(message) " , fixHTMLChars(message));
msg = msg.替换( " $(date) " , date);
return msg;
}
Sqlite记录集 query = new Sqlite记录集(_db, " select* from messages order by _ROWID_ desc " );
string messages = "" ;
int count = 0 ;
if (query.打开())
{
count = query.取记录数();
while (query.到下一记录())
{
messages += formatMessage(query.读字段值( " name " , Sqlite字段类型.文本), query.读字段值( " message " , Sqlite字段类型.文本), query.读字段值( " ip " , Sqlite字段类型.文本), query.读字段值( " date " , Sqlite字段类型.文本));
}
}
return (messages, count);
}
常量 文本 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 >
< hr ></ hr >
< form method = " post " >
< p > 姓名: < input type = " text " name = " name " size = 20 /></ p >
< p > 留言: < input type = " text " name = " message " size = 100 /></ p >
< p >< input type = " submit " value = " 提交留言 " ></ input ></ p >
</ form >
< p >< a href = " msgboard.txt " target = " _blank " > 此留言板的EF源代码 </ a ></ p >
< hr ></ hr >
< h1 > 所有留言(共 $(count) 条) </ h1 >
$(messages)
< hr ></ hr >
< p > by liigo, < a href = " http://blog.csdn.net/liigo/ " > http://blog.csdn.net/liigo/</a></p>
</ body >
</ html >
" ];
}