000 appweb動態加載自定義模塊文件

Post date: 2013/1/28 上午 07:02:13

服務器端:simpleModule.c

#include <stdio.h>

#include <stdlib.h>

#include "/usr/lib/appweb/inc/appweb.h"

#include "/usr/lib/appweb/inc/ejs.h"

EjsVar *MyFunction(Ejs *ejs, EjsVar *thisObj, int argc, EjsVar **argv)

{

int i = 1;

if ( i == 1) {

ejsWrite(ejs, "<h1>Hello Linux</h1>");

}

else{

ejsWrite(ejs, "<h1>Hello World</h1>");

}

return 0;

}

MprModule *maSimpleModuleInit(MaHttp *http)

{

MprModule *module;

Ejs *ejs;

/**

*創建Module

*simpleModule為模塊的名字

*3.3.4為appweb版本號

**/

module = mprCreateModule(http, "simpleModule", "3.3.4", NULL, NULL, NULL);

if (module == 0)

return 0;

ejs = ejsGetMaster(http);

//綁定自己的C函數

ejsDefineGlobalFunction(ejs, "myTest", MyFunction);

return module;

}

這裡兩個重點:

1、創建模塊mprCreateModule(),模塊的名字必須是獨一無二的;

2、綁定c函數ejsDefineGlobalFunction();訪問的時候通過綁定後的函數名訪問c函數,即myTest();


編譯生成動態庫:gcc simpleModule.c -fPIC -shared -o mod_test.so -L /usr/lib/appweb/lib -lappweb -lajs

將動態庫拷貝到/usr/lib/appweb/modules目錄下面(該目錄是appweb.conf配置文件指定搜索路徑)

在appweb裡面添加模塊加載:(這一步還是很重要的)在appweb.conf的ejs模塊加載後填上這句

LoadModule simpleModule mod_test

simpleModule:就是我們的模塊名字

mod_test:是動態庫的名字

客戶端:hello.ejs:

<html>

<body>

<p>welcome to appweb ejs:<% myTest() %></p>

<!--

這裡調用myTest()函數,該函數是在simpleModule.c裡面綁定的MyFunction();

-->

</body>

</html>

這樣建立的hello.ejs不能直接使用,需要經過編譯

ajsweb hello.ejs

出現[BUILD]: hello.ejs代表編譯成功,相應的會有hello.mod生成(這個mod文件的生成困擾了我一段時間。。。)

運行appweb --config /etc/appweb/appweb.conf

在瀏覽器輸入127.0.0.1/hello.ejs即可看到結果:

welcome to appweb ejs:

Hello Linux

OK!