【View編】最速のC++ Webフレームワーク「Drogon」を試してみた!
2021.12.20
View 編~最速のC++ Webフレームワーク「Drogon」を試してみた!~
最速の Web フレームワークとして注目を集めている「Drogon」。
前回は、コントローラについて紹介しました。
View を作ってみよう!
今回は、Web アプリケーションの中でも重要な「View」について解説していきます。
Web 上で視覚的に動作するアプリを作成する場合、データのやり取りはもちろん、ユーザビリティにも大きく関わる部分です。
Drogon では、ビューを動的に生成することが可能です。
ビューのコントローラの生成
まずは、ビューを表示させるために必要不可欠なコントローラを生成しましょう!
今回は、受け取った GET パラメータを展開するビューを作成したいので、「ListParaCtrl」と言う名前にします。
1 | $ drogon_ctl create controller ListParaCtrl |
ヘッダーファイルでルーティング
それでは、ヘッダーファイルから見てみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 | #pragma once #include <drogon/HttpSimpleController.h> using namespace drogon; class ListParaCtrl:public drogon::HttpSimpleController<ListParaCtrl> { public: virtual void asyncHandleHttpRequest(const HttpRequestPtr& req, std::function<void (const HttpResponsePtr &)> &&callback) override; PATH_LIST_BEGIN PATH_ADD("/listpara", Get); PATH_LIST_END }; |
「/listpara」という URL をルーティングします。
ソースファイル実装
ソースファイルは、以下のように実装します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #include "ListParaCtrl.h" void ListParaCtrl::asyncHandleHttpRequest(const HttpRequestPtr& req, std::function<void (const HttpResponsePtr &)> &&callback) { // Viewに渡すデータを格納する HttpViewData data; data.insert("title", "list parameters"); data.insert("parameters", req->getParameters() // Getパラメータはこのように取得 ); // ListParaView.cspというビューにデータを渡す (詳細は後述) auto res = drogon::HttpResponse::newHttpViewResponse("ListParaView.csp", data); callback(res); } |
ここで、「GET パラメータの受け取り方」や「ビューへのデータの渡し方」を確認しておきましょう!
CSP(ビュー)の作成
さて、Drogon では、動的な HTML ページを生成するために「CSP」というエンジンを使用しています。
CSP (ビュー) とは?
CSP は「C++ Server Pages」と言って、サーバサイドで C++ライクな構文を処理し、HTMLを生成するものです。
Java における JSP の C++版ととらえればわかりやすいでしょう。
CSP の記法
最初に、CSP の記法について説明しておきます。
基本的には HTML で、あるスコープ内では C++を記述できるのが CSP の特徴です。
CSP の記法は様々あるのですが、今回は代表的なものだけご紹介します。
<%inc %>
<%inc %> 内では、 #include が使用可能です。
(例: <%inc #include <iostream> %> )
<%C++ %>
<%c++ %> 内では、その他の C++コードが記述可能です。
(例: <%c++ std::string name = "Tanaka"; %> )
@@
@@ は、コントローラ側で渡したデータ変数を指します。
例えば、先ほどのソースファイルでいうと、 data そのものを指します。
逆に CSP ファイル内では data という名前では呼び出せず、 @@ のみ参照可能となります。
$$
$$ は標準出力として動作します。
std::cout のようなもので、 << と一緒に使用します。
なお、改行はされません。
[[ ]]
[[ ]] 内に書かれた文字列をキーとして、コントローラ側から対応するデータを取得し、表示させます。
(例: [[ title ]] )
{% %}
{% %} 内では、あらかじめ <%c++ %> などで宣言された変数を展開できます。
これは、 <%c++ $$<<name; %> と同義です。
(例: {% name %} )
<%view %>
<%view %> 内ではサブビューとして、他の CSP ファイルを展開できます。
もし header.csp が存在すれば、 <%view header %> のように記述して展開できます。
これにより、ページの共通部分を1つにまとめることが可能です。
実際に作ってみよう!
今回は、試しに以下のようなファイルを「/views」ディレクトリに作成してみました。
名前は「ListParaView.csp」です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | <!DOCTYPE html> <html> <%c++ // dataからunorder_mapとしてパラメータを取得 auto para = @@.get<std::unordered_map<std::string, std::string>>("parameters"); // 適当に変数宣言してみる auto name = "RightCode Inc."; auto date = "2020.08.01"; %> <head> <meta charset="UTF-8"> <title>[[ title ]]</title> </head> <body> <!-- 変数展開はどちらでも良い --> <p>Hello, {% name %}</p> <p>Date: <%c++ $$ << date; %></p> <%c++ if(para.size()>0){%> <H1>Parameters</H1> <table border="1"> <tr> <th>name</th> <th>value</th> </tr> <!-- イテレーションループでパラメータを展開 --> <%c++ for(auto iter:para){ %> <tr> <td>{% iter.first %}</td> <td><%c++ $$<<iter.second;%></td> </tr> <%c++ } // endfor%> </table> <%c++ }else{ %> <H1>no parameter</H1> <%c++ } // endif %> </body> </html> |
動作確認
試しに、 http://localhost/listpara?arg1=tanaka&arg2=suzuki にアクセスしてみると、
上手く動作しているようです!
エラーが出る場合
もし、ビルドでエラーが出る場合は、CMakeLists.txt に以下を追記しましょう。
ただし、drogon_ctl コマンドでプロジェクトを生成しているなら、基本的には自動生成されるはずです。
1 2 3 4 5 6 7 8 9 10 11 12 | file(GLOB_RECURSE SCP_LIST ${CMAKE_CURRENT_SOURCE_DIR}/views/*.csp) foreach(cspFile ${SCP_LIST}) message(STATUS "cspFile:" ${cspFile}) get_filename_component(classname ${cspFile} NAME_WE) message(STATUS "view classname:" ${classname}) ADD_CUSTOM_COMMAND(OUTPUT ${classname}.h ${classname}.cc COMMAND drogon_ctl ARGS create view ${cspFile} DEPENDS ${cspFile} VERBATIM ) set(VIEWSRC ${VIEWSRC} ${classname}.cc) endforeach() |
ハッシュマップ
Drogon では、GET パラメータは std::unordered_map<> で実装されています。
これはいわゆるハッシュマップで、計算量0(1)でデータを取得できます。
順序付けがされないデメリットはありますが、こんなところも Drogon が最速と言われる一因でしょう。
drogon_ctl コマンドで C++ソースファイルの生成が可能
Drogon には、C++ソースファイルを生成するコントローラを、view ディレクトリ下に自動出力してくれる機能があります。
1 | $ drogon_ctl create view ListParaView.csp |
万が一、CSP ファイルの実行ができないサーバで運用する場合などは役に立つはずです。
さいごに
これで一通り、Drogon の主要機能の紹介が終わりました。
Drogon は多くの機能が実装されたフルスタックなWebフレームワークであり、とてもユーザーフレンドリーな仕様になっていると思います。
まだまだ Drogon の可能性は未知数です。
Web エンジニアのみなさん、これを機に C++に触れてみてはいかがでしょうか?
関連記事はこちら
こちらの記事もオススメ!
書いた人はこんな人
- 「好きを仕事にするエンジニア集団」の(株)ライトコードです!
ライトコードは、福岡、東京、大阪の3拠点で事業展開するIT企業です。
現在は、国内を代表する大手IT企業を取引先にもち、ITシステムの受託事業が中心。
いずれも直取引で、月間PV数1億を超えるWebサービスのシステム開発・運営、インフラの構築・運用に携わっています。
システム開発依頼・お見積もり大歓迎!
また、現在「WEBエンジニア」「モバイルエンジニア」「営業」「WEBデザイナー」「WEBディレクター」を積極採用中です!
インターンや新卒採用も行っております。
以下よりご応募をお待ちしております!
https://rightcode.co.jp/recruit
- ライトコードの日常2月 29, 2024座談会はじめました!ライトコードの話ちょっと聞いてみませんか?
- ライトコードの日常12月 27, 2023年忘れ!ライトコード大忘年会2023
- ライトコードの日常12月 1, 2023ライトコードクエスト〜東京オフィス歴史編〜
- ITエンタメ10月 13, 2023Netflixの成功はレコメンドエンジン?