Setting up Wt - creating C++ websites 02-27-2018, 07:52 PM
#1
Ok, so if you didn't know already, there is a framework called Wt (Webtoolkit), which allows you to make full web applications using C++, it's intuitively object oriented, robust, and much faster than PHP. The creators of Wt seem to prefer that each application be a standalone web server, though they do support using other servers, their documentation for it is not good (at all). So, I'm going to walk you through it.
First off, go ahead and set up your debian or ubuntu server (using those for simplicity, its a PITA with arch).
You're going to want to install apache2, suitable compilers, cmake, make, the general stuff. Make sure you install mod_fcgid and enable it!
Ok, so go ahead and clone down the repository
https://github.com/emweb/wt
This repo makes it easy to get all the sample code, I built mine from scratch, but you don't have to. Odds are your OS has these packages already:
![[Image: 52ugGMl.png]](https://i.imgur.com/52ugGMl.png)
So, you can either build from scratch (cmake ,,;make;make install) or install these packages:
Ok, so now let's go ahead and write our first app
Let's save this as hello.cc, and compile it
It should work just fine. Ok, so let's set up a directory for our app:
Cool. Now, copy in that file
![[Image: UMgyH0F.png]](https://i.imgur.com/UMgyH0F.png)
So, if we try and run this, it just downloads it, that's not what we want. We need to edit a config file at /etc/apache2/mods-enabled/fcgid.conf
![[Image: 8BYczMz.png]](https://i.imgur.com/8BYczMz.png)
Go ahead and save that, and restart apache
![[Image: tU7ZdAe.png]](https://i.imgur.com/tU7ZdAe.png)
Ok, that's better, it means it recognized it as CGI, but refused to execute it. We need to make another file: /etc/apache2/sites-available/cpp.conf
![[Image: RtAxg3r.png]](https://i.imgur.com/RtAxg3r.png)
Ok, now go ahead and
Now, refresh your page
![[Image: gYy87zq.png]](https://i.imgur.com/gYy87zq.png)
Cool! it works, you can type whatever into the box and it will greet you, but also take a look at that "Internal Path" line. Go ahead and navigate to hello.wt/whatever
![[Image: 01V7Bbj.png]](https://i.imgur.com/01V7Bbj.png)
Wt has the very useful feature of using internal paths, so you can use this to create dynamic web pages on the fly, pretending to have files backing each page, when they aren't. But, right now, it looks a little weird, having that ,wt extension doesn't it? Let's go ahead and just remove that.
And, of course drop the .wt from the end
![[Image: PMqYDFs.png]](https://i.imgur.com/PMqYDFs.png)
Well that's weird....ok, so drop the /whatever? Oh...that just downloaded the file. Ok, so we aren't detecting that it needs to be executed. That's an easy fix
Go ahead and open our cpp.conf file again, and just before the close directory tag, add the following:
![[Image: 4MFngtf.png]](https://i.imgur.com/4MFngtf.png)
Go ahead and reload apache again
![[Image: 3CjxbJ9.png]](https://i.imgur.com/3CjxbJ9.png)
And there you have it! Those mystical extensionless web pages that seem to have folders all over the place, all written in C++. Happy developing!
First off, go ahead and set up your debian or ubuntu server (using those for simplicity, its a PITA with arch).
You're going to want to install apache2, suitable compilers, cmake, make, the general stuff. Make sure you install mod_fcgid and enable it!
Ok, so go ahead and clone down the repository
https://github.com/emweb/wt
This repo makes it easy to get all the sample code, I built mine from scratch, but you don't have to. Odds are your OS has these packages already:
![[Image: 52ugGMl.png]](https://i.imgur.com/52ugGMl.png)
So, you can either build from scratch (cmake ,,;make;make install) or install these packages:
Code:
libwt-common
libwt-dev
libwd40
libwtext-dev
libwtext40
libwtfcgi-dev
libwtfcgi40
Ok, so now let's go ahead and write our first app
Code:
#include <Wt/WApplication.h>
#include <Wt/WBreak.h>
#include <Wt/WContainerWidget.h>
#include <Wt/WLineEdit.h>
#include <Wt/WPushButton.h>
#include <Wt/WText.h>
class HelloApplication : public Wt::WApplication
{
public:
HelloApplication(const Wt::WEnvironment& env);
private:
Wt::WLineEdit *nameEdit_;
Wt::WText *path_;
};
HelloApplication::HelloApplication(const Wt::WEnvironment& env) : Wt::WApplication(env)
{
setTitle("Hello Test2");
root()->addWidget(std::make_unique<Wt::WText>("Your name, please? ")); // adds the label
nameEdit_ = root()->addWidget(std::make_unique<Wt::WLineEdit>()); // the text box
Wt::WPushButton *button = root()->addWidget(std::make_unique<Wt::WPushButton>("Greet")); // submit button
root()->addWidget(std::make_unique<Wt::WBreak>()); // line break
path_ = root()->addWidget(std::make_unique<Wt::WText>()); // the internal path label
path_->setText("Internal Path: " + internalPath()); // set the label for path
root()->addWidget(std::make_unique<Wt::WBreak>()); // line break
button->clicked().connect([this]
{
auto greeting_ = root()->addWidget(std::make_unique<Wt::WText>());
greeting_->setText("Hello, " + nameEdit_->text());
}); // connect button click -> that lambda
}
int main(int argc, char **argv)
{
return Wt::WRun(argc, argv, [](const Wt::WEnvironment& env) { return std::make_unique<HelloApplication>(env); });
}
Let's save this as hello.cc, and compile it
Code:
g++ -o hello.wt hello.c -I/usr/local/include -L/usr/local/lib -lwt -lwtfcgi
It should work just fine. Ok, so let's set up a directory for our app:
Code:
mkdir /var/www/html/cpp
chown www-data:www-data /var/www/html/cpp
Cool. Now, copy in that file
![[Image: UMgyH0F.png]](https://i.imgur.com/UMgyH0F.png)
So, if we try and run this, it just downloads it, that's not what we want. We need to edit a config file at /etc/apache2/mods-enabled/fcgid.conf
![[Image: 8BYczMz.png]](https://i.imgur.com/8BYczMz.png)
Spoiler:
Go ahead and save that, and restart apache
![[Image: tU7ZdAe.png]](https://i.imgur.com/tU7ZdAe.png)
Ok, that's better, it means it recognized it as CGI, but refused to execute it. We need to make another file: /etc/apache2/sites-available/cpp.conf
![[Image: RtAxg3r.png]](https://i.imgur.com/RtAxg3r.png)
Spoiler:
Ok, now go ahead and
Code:
a2ensite cpp
systemctl restart apache2
Now, refresh your page
![[Image: gYy87zq.png]](https://i.imgur.com/gYy87zq.png)
Cool! it works, you can type whatever into the box and it will greet you, but also take a look at that "Internal Path" line. Go ahead and navigate to hello.wt/whatever
![[Image: 01V7Bbj.png]](https://i.imgur.com/01V7Bbj.png)
Wt has the very useful feature of using internal paths, so you can use this to create dynamic web pages on the fly, pretending to have files backing each page, when they aren't. But, right now, it looks a little weird, having that ,wt extension doesn't it? Let's go ahead and just remove that.
Code:
mv /var/www/html/cpp/hello.wt /var/www/html/cpp/hello
And, of course drop the .wt from the end
![[Image: PMqYDFs.png]](https://i.imgur.com/PMqYDFs.png)
Well that's weird....ok, so drop the /whatever? Oh...that just downloaded the file. Ok, so we aren't detecting that it needs to be executed. That's an easy fix
Go ahead and open our cpp.conf file again, and just before the close directory tag, add the following:
Code:
SetHandler fcgid-script
![[Image: 4MFngtf.png]](https://i.imgur.com/4MFngtf.png)
Go ahead and reload apache again
![[Image: 3CjxbJ9.png]](https://i.imgur.com/3CjxbJ9.png)
And there you have it! Those mystical extensionless web pages that seem to have folders all over the place, all written in C++. Happy developing!
(This post was last modified: 02-27-2018, 07:58 PM by phyrrus9.)