CASL предоставляет мощную среду для разработки Web приложений на языке C++ , путем предоставления CASL-сервиса для Web: - модуля, который при подключении к серверу приложений обеспечивает загрузку и вызов пользовательских компонент по запросам поступающим от Web сервера. Эти компоненты используют высокоуровневое API обработки запросов, равно как и обычное сервисное API CASL.
Вам следует прочитать этот документ если вы планируете писать собственные модули обработки запросов (или собственные Web приложения) на C++ .
Если Вы только используете модуль поддержки Java сервлетов и не
используете C++ API CASL прямо, то можете пропустить этот документ и перейти
непосредственно к описанию CASL Java Web Service.
CASL предполагает на выбор несколько моделей обработки поступающих запросов. Это может быть:
Эта модель выполнения крайне похожа на модель выполнения CORBA сервлетов
в ModCbroker - мы определяем сервлет как некоторую сущность, которая
порождает обработчики. И то, и второе - определяемые нами классы.
Посмотрим, как выглядит Hello World
#include <GradSoft/CASL.h>
#include <GradSoft/CASL/WebService.h>
namespace CASLDemo {
class HelloWorldServlet: public CASL::Servlet
{
private:
CASL::RequestHandler* createHandler(const std::string& name);
};
class HelloWorldHandler: public CASL::RequestHandler
{
public:
void run(void);
};
CASL::RequestHandler* HelloWorldServlet::createHandler(const std::string& name)
{
if (name!="hello") throw CASL::Servlet::HandlerNotFound(name);
return new HelloWorldHandler();
}
void HelloWorldHandler::run(void)
{
getHTTPReplyContext().setContentType("text/plain");
getHTTPReplyContext().content() << "Hello, world" << std::endl;
}
class HelloWorldServletModule: public CASL::ServletModule
{
private:
HelloWorldServlet servlet_;
public:
CASL::Servlet* getServlet() { return &servlet_; }
const char* name() const { return "HelloWorldServlet"; }
const char* author() const { return "Grad-Soft Ltd, Kiev, Ukraine"; }
int versionMajor() const { return 1; }
int versionMinor() const { return 0; }
int versionSubMinor() const { return 0; }
};
}
CASLDemo::HelloWorldServletModule Hello;
EXPORT_OBJECT(Hello);
Что мы видим:
run().
HTTPRequestContext().
Контекст текущего запроса можно получить в обработчике воспользовавшись
методом getHTTPRequestContext()
HTTPReplyContext().
Метод getHTTPReplyContext() возвращает контекст ответа на текущий
запрос.
SessionContext(), getSessionContext().
Собственно, этой информации достаточно для того, что-бы начать читать API, консультируясь с UML схемой.
Первые две буквы JL расшифровываются как ``Java-Like''.
class HelloWorldServlet1: public CASL::JLServlet
{
public:
void doGet(CASL::HTTPRequestContext& requestContext,
CASL::HTTPReplyContext& replyContext)
{
replyContext.setContentType("text/plain");
replyContext.out() << "Hello, world\n";
}
};
class HelloWorldServlet1Module: public CASL::ServletModule
{
private:
HelloWorldServlet1 servlet_;
public:
CASL::Servlet* getServlet() { return &servlet_; }
const char* name() const { return "HelloWorldServlet1"; }
const char* author() const { return "Grad-Soft Ltd, Kiev, Ukraine"; }
int versionMajor() const { return 1; }
int versionMinor() const { return 0; }
int versionSubMinor() const { return 0; }
};
CASLDemo::HelloWorldServlet1Module Hello1;
EXPORT_OBJECT(Hello1);
Что мы видим: модель выполнения C++ сервлетов, очень похожая на стандартное
Java API.
Разница все-таки есть:
Выбор между JLServlet и просто Servlet диктуется, скорее,
соображениями удобства и личного вкуса. Какой-то смысл есть в критерии
сложности обработки запроса: если там у нас не очень много работы, то
использование JLServlet дает нам меньше кода. С другой стороны,
когла обработка запросов сложная, то лучше использовать Servlet
модель - можно хранить данные в обработчике запроса.