C++ APP 是MYCP 业务层组件,用于处理业务逻辑。
新建一个cspApp.cpp 文件,或者利用VC 新建一个普通DLL 类型工程项目。
#include <CGCBase/httpapp.h>
#include <CGCBase/cgcServices.h>
using namespace cgc;
class CAppService
: public cgcServiceInterface
{
public :
typedef boost::shared_ptr<CAppService> pointer;
static CAppService::pointer create(void )
{
return CAppService::pointer(new CAppService());
}
virtual tstring serviceName(void ) const {return _T("AppService" );}
protected :
virtual bool callService(int function, const cgcValueInfo::pointer& inParam, cgcValueInfo::pointer outParam)
{
theApplication->log(LOG_INFO, "AppService callService = %d\n" , function);
return true ;
}
virtual bool callService(const tstring& function, const cgcValueInfo::pointer& inParam, cgcValueInfo::pointer outParam)
{
theApplication->log(LOG_INFO, "AppService callService = %s\n" , function.c_str());
return true ;
}
virtual cgcAttributes::pointer getAttributes(void ) const {return theAppAttributes;}
};
定义CappService 服务接口,继承于cgcServiceInterface ,实现callService 函数,getAttributes 函数用于实现组件的参数管理,详细代码请看samples/cspApp/cspApp.cpp 文件。
extern "C" void CGC_API CGC_GetService(cgcServiceInterface::pointer & outService, const cgcValueInfo::pointer& parameter)
{
CAppService::pointer appService = CAppService::create();
appService->initService();
outService = appService;
cgcAttributes::pointer attributes = theApplication->getAttributes();
assert (attributes.get() != NULL);
theAppAttributes->setAttribute(ATTRIBUTE_NAME, outService.get(), appService);
}
extern "C" void CGC_API CGC_ResetService(cgcServiceInterface::pointer inService)
{
if (inService.get() == NULL) return ;
theAppAttributes->removeAttribute(ATTRIBUTE_NAME, inService.get());
inService->finalService();
}
编译cspApp 工程,生成cspApp.dll 或者libcspApp.so 文件,复制文件到$(MYCP_BINPATH)/modules 目录。
修改$(MYCP_BINPATH)/conf/modules.xml 文件,在app 配置项增加一个组件配置项;
<app>
… <module> <file>cspApp</fil
<allowall>1</allowall>
</module> … </app>
设置组件文件,允许开放所有函数。
以下内容为调用cspApp 组件的CSP 代码,详细请看bin/web/samples/csp-app.csp 文件:
<csp:define type="app" id="$var_app" name="cspApp" />
<h1>Call APP Function</h1>
call $var_app "info" function.<br> <csp:app:call id="$var_app" name="info" /> call result: <%=_$result%><br> <br> <b>See MYCP console print info.</b><br> cspApp SourceCode see Samples/cspApp/cspApp.cpp<br> <h1>APP Get/Set Function</h1> set $var_app p1 = 1111111<br> <csp:app:set id="$var_app" name="p1" in="1111111" /> get $var_app p1 to $var_p2<br> <csp:app:get id="$var_app" name="p1" out="$var_p2" /> $var_p2 = <%=$var_p2%><br> <h1>Final APP</h1> <csp:reset id="$var_app" /> $var_app reset ok<br>
浏览器访问如下图:
以上例子演示如何定义一个C++ APP 组件,在页面退出的时候需要清空该组件变量;为了方便开发者使用C++ APP 应用组件;MYCP 支持通过配置apps.xml 文件,部署好所有的C++ APP 应用组件,配置好的应用组件,直接在CSP 页面用A$ 变量直接使用,不需要定义,和清空操作。
配置例子请看conf/HttpServer/apps.xml 文件;
使用例子请看bin/web/samples/csp-app-fs.csp 文件等例子;
不错!榄地嘎嘎!######编译成功,放入相应的目录modules,配置好文件,启动服务器CGCP.exe,打开浏览器,输入网址,回车, 报错!,CGCP.EXE停留在
,代码是拷贝来的,如下
#include <CGCBase/httpapp.h> using namespace cgc;
extern "C" HTTP_STATUSCODE CGC_API doGET(const cgcHttpRequest::pointer & request, cgcHttpResponse::pointer response) { cgcSession::pointer session = request->getSession();
response->println("<HTML>"); response->println("<TITLE>MYCP Web Server</TITLE>"); response->println("<h1>Get Sample</h1>");
response->println("<h2>Session Info:</h2>"); if (session->isNewSession()) { response->println("This is a new session."); }else { response->println("This is not a new session."); }
response->println("<h2>Headers:</h2>"); std::vector<cgcKeyValue::pointer> headers; if (request->getHeaders(headers)) { for (size_t i=0; i<headers.size(); i++) { cgcKeyValue::pointer keyValue = headers[i]; response->println("%s: %s", keyValue->getKey().c_str(), keyValue->getValue()->getStr().c_str()); } }else { response->println("Not header info."); }
response->println("<h2>Propertys:</h2>"); std::vector<cgcKeyValue::pointer> parameters; if (request->getParameters(parameters)) { for (size_t i=0; i<parameters.size(); i++) { cgcKeyValue::pointer keyValue = parameters[i]; response->println("%s = %s", keyValue->getKey().c_str(), keyValue->getValue()->getStr().c_str()); } }else { response->println("Not property."); }
response->println("</HTML>"); return STATUS_CODE_200; } ,哪位高手能解决啊?我用的编译器是visual studio 2010,里面的案例都能正常使用,只要运行自己编译的**.dll,就报错!######自己重新编译过里面的例子cspServlet,生成的是cspServletd.dll,运行时同样也报错!
######问题解决了!是代码的问题, 用下面的代码就可以 #include <CGCBase/httpapp.h> using namespace cgc;
extern "C" HTTP_STATUSCODE CGC_API doGET(const cgcHttpRequest::pointer & request, cgcHttpResponse::pointer response) { cgcSession::pointer session = request->getSession();
response->println("<HTML>"); response->println("<TITLE>MYCP Web Server</TITLE>"); response->println("<BODY>");
response->println("<h2>Session Info:</h2>"); response->println("<h2>Session Info:</h2>");
response->println("</BODY></HTML>"); return STATUS_CODE_200; } ######专门为MYCP项目建了QQ群:183161496,主要讨论MYCP,CSP评议和一些开源软件,技术开发交流等,有需要的请申请加入,加入请注明MYCP。######谢谢,正纠结于怎么运行不了的呢,还想着是不是因为其他原因的。已经折腾好几天了,想把这个MYCP好好用起来还不是件容易的事,还得慢慢来。 今天忙了一天,好像是MYCP部分头文件不支持UNICODE编码,最后通过预编译头,分ANSI和UNICODE两种情况去调用各个关联的头文件,把问题解决了。 接下来还得继续研究CSP,希望各位前辈能不吝赐教啊######对了,不知道那样的解决方法对不对,潜意识里总觉得不妥,希望高人给以指点
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。