C++ Web Framework (CWF) เป็น MVC web framework, Open Source, ภายใต้ MIT License, โดยใช้ C++ กับ Qt เพื่อใช้ในการพัฒนาเว็บแอปพลิเคชัน CWF ได้รับการออกแบบมาเพื่อใช้ทรัพยากรการคำนวณเพียงเล็กน้อย เช่น หน่วยความจำและการประมวลผล และมีเวลาตอบสนองต่ำสำหรับคำขอ ด้วยสถาปัตยกรรม MVC (Model-View-Controller) ซึ่งคุณสามารถสร้างคลาสเพื่อดูแลชั้นธุรกิจ (Model) ให้ใช้ CSTL (ไลบรารีแท็กมาตรฐานของเพจเซิร์ฟเวอร์ C++) ภายในเว็บเพจเพื่อดูแลการนำเสนอข้อมูล (ดู) และใช้ตัวควบคุมเป็นตัวกั้นระหว่างสองชั้น (Controller) 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++ Web Framework
ขั้นตอนในการทดสอบตัวอย่าง HelloWorldDocker ของ C++ Web Framework ด้วยคอนเทนเนอร์ Docker