Давайте напишем наше первое CppCMS-приложение. |
|
Для начала создадим файл hello.cpp и сохраним в нем следующее содержание. |
|
_Includes:_ |
|
Нам необходимо импортировать некоторые определения для первого приложения: |
|
- `cppcms/application.h` - класс `application`, из которого наследуется каждое приложение CppCMS. |
- `cppcms/applications_pool.h` - класс `applications_pool`, управляющий пользовательскими приложениями - создает новое приложение при каждом HTTP-запросе, кэшируя его для будущего использования. |
- `cppcms/service.h` - севис - центральный цикл событий сетевого сервиса. |
- `cppcms/http_response.h` - класс, в котором происходит формирование HTTP-ответа клиенту. |
|
Давайте подключим их все. |
|
|
#include <cppcms/application.h> |
#include <cppcms/applications_pool.h> |
#include <cppcms/service.h> |
#include <cppcms/http_response.h> |
#include <iostream> |
|
Теперь определим первый класс приложения, наследуемый из `cppcms::application`. Он должен получить в своем конструкторе ссылку на основной сервис CppCMS, который запускает наше приложение. |
Теперь определим первый класс приложения наследующий `cppcms::application`. Он должен получить в своем конструкторе ссылку на основной сервис CppCMS, который запускает наше приложение. |
|
|
class my_hello_world : public cppcms::application { |
public: |
my_hello_world(cppcms::service &srv) : |
cppcms::application(srv) |
{ |
} |
virtual void main(std::string url); |
}; |
|
На этом этапе, чтобы отвечать на пользовательские запросы переопределим функцию-член класса `cppcms::application::main`, которая всегда вызывается в каждом запросе. |
|
В этой функции запишем простой HTML в поток вывода. |
Доступ к потоку вывода осуществляется с использованием функции-члена `response` класса `application`, дающей доступ к потоку вывода `out()`. |
|
|
void my_hello_world::main(std::string /*url*/) |
{ |
response().out()<< |
"<html>\n" |
"<body>\n" |
" <h1>Hello World</h1>\n" |
"</body>\n" |
"</html>\n"; |
} |
|
|
Теперь подготовим функцию main. Для начала создадим класс сервиса, который парсит параметры командной строки и ищет опции конфигурации |
Теперь подготовим функцию main. Для начала создадим класс сервиса, который парсит параметры командной строки и ищет опции конфигурации. |
|
|
int main(int argc,char ** argv) |
{ |
try { |
cppcms::service srv(argc,argv); |
|
Затем укажем классу `applications_pool` использовать наше приложение - `my_hello_world` предоставляя ее предопределенной фабрике объектов `cppcms::applications_factory<my_hello_world>()`. Мы, так сказать, примонтировали наше приложение к пулу, чтобы оно |
Затем укажем классу `applications_pool` использовать наше приложение - `my_hello_world` предоставляя его предопределенной фабрике объектов `cppcms::applications_factory<my_hello_world>()`. Мы, так сказать, примонтировали наше приложение к пулу, чтобы оно |
использовалось для обработки запроса. |
srv.applications_pool().mount(cppcms::applications_factory<my_hello_world>()); |
|
И теперь запустим цикл событий (event loop). Функция `run()` завершается, если процесс получает сигналы `SIGINT`, `SIGTERM` или `SIGUSR1`. |
|
srv.run(); |
} |
catch(std::exception const &e) { |
std::cerr<<e.what()<<std::endl; |
} |
} |
|
|
Вот наше приложение и готово. Теперь можно скомпилировать его также просто как: |
|
c++ hello.cpp -lcppcms -o hello |
|
Теперь нужно подготовить конфигурационный файл `config.js`, использующий файловый формат JSON для передачи всех опций: |
|
{ |
"service" : { |
"api" : "http", |
"port" : 8080 |
}, |
"http" : { |
"script_names" : [ "/hello" ] |
} |
} |
|
Мы настроили сервис слушать порт 8080, используя протокол HTTP (что очень полезно для отладки приложения). |
|
Также мы передали параметр `script_names`, определяющий путь к виртуальным "CGI скриптам" или, проще говоря, путь, по которому должно вызываться наше приложение. |
|
Теперь можно запустить приложение |
|
|
./hello -c config.js |
|
Наберем в браузере ссылку <http://localhost:8080/hello>, чтобы увидеть наше первое рабочее CppCMS-приложение. |