إطار عمل الويب C++ (CWF) هو إطار ويب MVC، مفتوح المصدر، بموجب ترخيص MIT، يستخدم C++ مع Qt لاستخدامه في تطوير تطبيقات الويب. تم تصميم CWF لاستهلاك القليل من الموارد الحسابية، مثل الذاكرة والمعالجة، كما يتميز بوقت استجابة منخفض للطلبات. باستخدام بنية MVC (نموذج عرض وحدة التحكم)، حيث يمكنك إنشاء فئات لرعاية طبقة الأعمال (النموذج)، استخدم CSTL (مكتبة العلامات القياسية لصفحات خادم C++) داخل صفحات الويب للعناية بعرض البيانات (عرض) واستخدم وحدات التحكم كفاصل بين الطبقتين (وحدة التحكم). كان لدى CWF إلهامات في Java Servlets وJSTL وSpring Framework.
نظرًا لأنه تم إنشاؤه في Qt، يمكن تشغيل C++ Web Framework على نفس الأنظمة الأساسية التي تدعمها Qt:
يحتوي CWF على ملف تكوين واحد فقط، يسمى CPPWeb.ini وسياسة استخدام C++ وQt فقط في تطوير مكوناته لتجنب تثبيت العديد من المكتبات والصراعات، والحفاظ على خصائص الأنظمة الأساسية المتعددة، وتسهيل التثبيت والحفاظ على منحنى التعلم منخفض لجعل تطوير الويب بسيطًا قدر الإمكان، حتى بالنسبة للمبتدئين.
# include " cppwebapplication.h "
class HelloWorldController : public CWF ::Controller
{
public:
void doGet (CWF::Request &request, CWF::Response &response) const override
{
response. write ( " <html><body>Hello World!</body></html> " );
}
};
// Call
// http://localhost:8080/hello
int main ( int argc, char *argv[])
{
CWF::CppWebApplication server (argc, argv, " /PATH_TO_EXAMPLE/server/ " );
server. addController <HelloWorldController>( " /hello " );
return server. start ();
}
// hellomodel.h (Model)
# include < QObject >
class HelloModel : public QObject
{
Q_OBJECT
public slots:
QString greeting () const
{
return " Hello User! " ;
}
};
// helloview.view (View)
<html>
<head>
<title>Hello</title>
</head>
<body>
<out value= " #{model.greeting} " />
</body>
</html>
// hellocontroller.h (Controller)
# include < cwf/controller.h >
# include < model/hellomodel.h >
class HelloController : public CWF ::Controller
{
public:
void doGet (CWF::Request &request, CWF::Response &response) const override
{
HelloModel model;
request. addAttribute ( " model " , &model);
request. getRequestDispatcher ( " /pages/helloview.view " ). forward (request, response);
}
};
// main.cpp
# include < cwf/cppwebapplication.h >
# include < controller/hellocontroller.h >
// Call
// http://localhost:8080/hello
int main ( int argc, char *argv[])
{
CWF::CppWebApplication server (argc, argv, " /PATH_TO_EXAMPLE/server/ " );
server. addController <HelloController>( " /hello " );
return server. start ();
}
# include < cwf/sqlquery.h >
# include < cwf/cppwebapplication.h >
# include < cwf/sqldatabasestorage.h >
/*
* SQL Script
* create table countries (co_id serial primary key, co_name varchar unique);
* insert into countries (co_name) values ('BRAZIL'), ('UNITED STATES OF AMERICA'), ('CANADA');
*/
CWF::SqlDatabaseStorage storage ( " QPSQL " , " localhost " , " postgres " , " postgres " , " 1234 " , 5432 );
class CountriesController : public CWF ::Controller
{
public:
void doGet (CWF::Request &request, CWF::Response &response) const override
{
CWF::SqlQuery qry (storage);
qry. exec ( " select * from countries " );
response. write (qry. toJson ());
}
};
// Call
// http://localhost:8080/countries
int main ( int argc, char *argv[])
{
CWF::CppWebApplication server (argc, argv, " /PATH_TO_EXAMPLE/server/ " );
server. addController <CountriesController>( " /countries " );
return server. start ();
}
# include < usermodel.h >
# include < cwf/cppwebapplication.h >
# include < cwf/sqldatabasestorage.h >
/*
* ORM (Experimental) - Tested only on PostgreSQL
*/
CWF::SqlDatabaseStorage conexao ( " QPSQL " , " localhost " , " postgres " , " postgres " , " 1234 " , 5432 );
class ORMController : public CWF ::Controller
{
public:
void doGet (CWF::Request &request, CWF::Response &response) const override
{
UserModel user{conexao};
user. setName ( " Herik Lima " );
user. setPhone ( " +55 11 9 99999-0000 " );
user. setCountry ( " Brazil " );
user. setState ( " São Paulo " );
response. write ( QByteArray ( " <html><body> " ) + (user. save () ? " Saved " : " Error " ) + " </body></html> " );
}
};
// Call
// http://localhost:8080/orm
int main ( int argc, char *argv[])
{
CWF::CppWebApplication server (argc, argv, " /home/herik/CPPWebFramework/examples/ORM/server " );
UserModel{conexao}. updateDB (); // Create or update the table in database
server. addController <ORMController>( " /orm " );
return server. start ();
}
// usermodel.h
# ifndef USERMODEL_H
# define USERMODEL_H
# include < cwf/model.h >
class UserModel : public CWF ::Model
{
Q_OBJECT
Q_PROPERTY (QString name READ getName WRITE setName)
Q_PROPERTY (QString phone READ getPhone WRITE setPhone)
Q_PROPERTY (QString country READ getCountry WRITE setCountry)
Q_PROPERTY (QString state READ getState WRITE setState)
QString name;
QString phone;
QString country;
QString state;
public:
explicit UserModel (CWF::SqlDatabaseStorage &connection) : CWF::Model(connection, " usuario " ) {}
public slots:
QString getName () const { return name; }
void setName ( const QString &value) { name = value; }
QString getPhone () const { return phone; }
void setPhone ( const QString &value) { phone = value; }
QString getCountry () const { return country; }
void setCountry ( const QString &value) { country = value; }
QString getState () const { return state; }
void setState ( const QString &value) { state = value; }
};
# endif // USERMODEL_H
تثبيت Jemalloc الاختياري (مستحسن)
خطوات اختبار أمثلة إطار عمل الويب C++
خطوات اختبار مثال HelloWorldDocker الخاص بـ C++ Web Framework مع حاويات Docker