4.14 Введение в программирование CGI
Важнейшей особенностью web-сервера является возможность получения информации от пользователя и обработка ее с помощью CGI(общий шлюзовый интерфейс). CGI – компонент программного обеспечения, который:
- позволяет писать сценарии и создавать на их основе управляемые пользователем интерактивные приложения;
- обеспечивает возможность взаимодействовать с другими программами сервера;
- имеет средства динамического создания Web-страниц на основе информации пользователя;
- может вызвать внешнюю программу и передать в нее пользовательские данные.
В конечном итоге пользователь, не будучи ограничен в рамках заранее написанных документов, используя CGI сценарий может создать круг приложений, которые ему необходимы для получения информации.
Программе CGI необходимо извлечь информацию, обработать ее и сообщить ответ. Рассмотрим простой пример – создание виртуального документа:
Запускаем C++Builder. В главном меню выбираем File/New и в открывшейся таблице New Items выбираем Console App.
Удаляем все, что находится в открывшемся окне и записываем код:
//Пример CGI
#include <vcl\vcl.h>
#pragma hdrstop
char S[] = "ПРИВЕТ<P>\n";
void main(void)
{
setvbuf(stdout, NULL, _IONBF, 0);
printf("\nContent-type: text/html\n\n");
printf("<html>\n");
printf("<body>\n");
printf(S);
printf("</body>\n");
printf("</html>\n");
}
Запоминаем программу и запускаем на трансляцию. После этого помещаем выполняемый файл (например Prim.exe) на Web-сервер в раздел CGI.
Запускаем броузер и вызывем программу из раздела CGI.
Во время выполнения программа посылает свою информацию на стандартный вывод, как поток данных, состоящий из двух частей:
- заголовок в котором описан формат возвращаемых данных
printf("\nContent-type: text/html\n\n"); - текст формата HTML;
- тело выходных данных – данные в формате HTML.
Сервер возвращает результаты выполнения CGI-программы броузеру.
Для Web-сервера неважен язык, на котором написана программа.
4.15 Программирование баз данных
Особенностью разработки доступа к базам данных при помощи C++Builder является полностью объектный визуальный подход. Вторая особенность заключается в том, что доступ к разным базам данных (dBase, Paradox, Oracle и другим) происходит совершенно унифицированно. Эта дает определенные преимущества по сравнению с таким мощным средством разработки баз данных как Visual FoxPro.
Интерфейсом между приложением и базами данных служит BDE - Borland Database Engine, т.е Механизм База данных Borland. Он позволяет не только осуществлять доступ к локальным базам данных, но и осуществлять доступ к данным по типу клиент-сервер. Одной из особенностей C++Builder является то,что доступ к базам данных осуществляется одинаково как на стадии разработки, так и на стадии исполнения.
Для разработки используется трех ступенчатая модель. Каждой ступени соответствует своя компонента (класс).
TDBGrid - отображает в окне область редактирования (по типу команды Browse (Grid) в FoxPro)
TdataSource - служит интерфейсом между TDBEdit и нижней компонентой.
TTable - содержит все записи таблици.
На более низком уровне работают драйвера BDE, осуществляющие непосредственный обмен с хранимыми данными.
Расмотрим более подробно описанные выше компоненты.
Источник данных (TDataSource).
Основные свойства.
AutoEdit - разрешает или запрещает редактирование записей (False или True).
DataSet - определяет имя конкретного набора данных, таблицы или запроса. Например Table1. Можно переключаться с одного набора данных на другой непосредственно во время выполнения программы.
Name - определяет название данной компоненты. Например DataSource.
С данной компонентой связаны три события OnDataChange, OnStateChange, OnUpdateData.
Таблица (TTable).
Основные свойства.
Active - разрешает или запрещает просмотр данных.
DatabaseName - псевдоним базы данных и путь к каталогу, где база данных содержится.
Name - псевдоним таблицы.
TableName - конкретное имя таблицы (в указанном каталоге).
Exclusive - разрешает или запрещает другому приложению обращаться к таблице.
IndexFiles - выбор индексного файла для таблицы.
IndexName - правило сортировки данных в индексе.
Filter - установка фильтра.
MasterFields и MasterSource - для образования связей между двумя таблицами.
Для данной компоненты определены стандартные методы используемые другими системами управления баз данных: Locate, Lookup, Append, Insert, Next, MoveBye и другие.
Отображение данных (TDBGrid).
Некоторые свойства.
DataSource - совпадает со свойством Name компоненты TDataSource. В результате имеем следующую связку:
TDBGrid TDataSource TTable
-----------------------------------------------------------------------------------------
DataSource <--> Name-DataSet <--> Name -DatabaseName-TableName
Такая связка обеспечит в окне редактирования появления записей таблицы имеющей имя TableName (см.ниже).
Другие свойства данной компоненты тривиальны - они определяют положение окна редактирования, цветовую гамму, размера окна, шрифты и т.п.
Еще одна компонента часто используется в связи с работой с базами данных.
Запросы (Tquery).
Данная компонента понадобится вам, если у вас возникнет необходимость пользоваться командами SQL-языка.
Основные свойства.
Active - разрешает или запрещает просмотр данных.
DatabaseName - содержит псевдоним базы данных или полный путь к каталогу, где эта база данных находится.
SQL - используется для ввода команды SQL. Синтаксис этих команд является стандартом и с ним можно познакомиться в любом руководстве по СУБД (например FoxPro).
RequestLive - разрешает или запрещает BDE возращать набор данных в любом случае.
Приступаем теперь к разбору конкретного примера. Пример очень прост. При запуске программы появляется форма. На форме имеется окно редактирования таблицы, кнопка "Выход", кнопка "Добавить", кнопка "Удалить". Таблица содержит данные о людях: ФИО, выданная сумма, дата выдачи. У вас будет имется возможность редактировать таблицу, добавлять и удалять записи. При запуске программа проверяет наличие таблицы в указанном каталоге и при необходимости создает и индексирует эту таблицу.
Поместим на форму три кнопки, TDBGrid (для просмотра таблицы), TTable, TDataSource.. Пусть наша таблица будет находится в каталоге c:\baza\ и будет иметь имя 'proba' Заполним свойства трех компонент основных компонент:
TTable :
DatabaseName=c:\baza\
Name=Table1
TableType=ttDBase
TableName=proba
IndexName=proba
TDataSource:
DataSet=Table1
Name=DataSource1
TDBGrid:
DataSource=DataSource1
Все остальные свойства можно оставить по умолчанию и менять по ходу работы над программой.
Приведем текст модуля Unit1.cpp содержащего основные исполняемые функции.
//---------------------------------------------------------------------------
#include <vcl\vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma link "Grids"
#pragma resource "*.dfm"
TForm1 *Form1;
char * baza="proba.dbf";
char * baza1="proba";
//---------------------------------------------------------------------------
//Конструктор
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
HANDLE handle;
//пытаемся открыть таблицу как обычный файл
handle=CreateFile(baza,
GENERIC_READ,
FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_ARCHIVE,
NULL);
if(handle!=INVALID_HANDLE_VALUE)
{
//файл есть и закроем
CloseHandle(handle);
} else
{
//файла нет
//создаем таблицу
Table1->FieldDefs->Clear();
Table1->FieldDefs->Add("Name", ftString, 20, true);
Table1->FieldDefs->Add("Zarpl", ftFloat, 0, true);
Table1->FieldDefs->Add("Data", ftDate, 0, true);
//теперь создаем индексный файл
Table1->IndexDefs->Clear();
TIndexOptions MyIndexOptions;
MyIndexOptions << ixPrimary << ixUnique;
Table1->IndexDefs->Add(baza1, "Data", MyIndexOptions);
Table1->CreateTable();
}
//здесь открыть таблицу
Table1->Active = true;
//активизировать индекс
Table1->OpenIndexFile("proba.MDX");
}
//----------------------------------------------
//Деструктор
__fastcall TForm1::~TForm1()
{
//закрыть таблицу
Table1->Active = false;
}
//---------------------------------------------------------------------------
//выход
void __fastcall TForm1::Button1Click(TObject *Sender)
{
//метод Close закрывает форму и вызывает деструктор
Close();
}
//---------------------------------------------------------------------------
//кнопка "добавить запись"
void __fastcall TForm1::Button3Click(TObject *Sender)
{
Table1->Append();
}
//---------------------------------------------------------------------------
//кнопка "удалить запись"
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Table1->Delete();
}
Прокоментируем вышеприведенный текст.
Отметим одну интересную возможность C++Builder. Он может одновременно работать как с библиотекой объектов с которой мы до сих пор работали так и непосредственно с функциями API. В нашей программе мы демонстрируем эту возможность: в конструкторе пытаемся открыть файл (функция CreateFile). Если открытие не удается, выполняется часть кода создающий таблицу и индексный файл. Ниже представлено окно работы нашей программы.
... . Имеет ли право на существование эта биологизаторская интерпретация экологии? Видимо, да. Она широко представлена, и с этим следует считаться. Но она не может служить концептуальной основой комплексного непрерывного экологического образования. В структуре научного знания при таком подходе не остаётся места для географической и социальной экологии, экологии человека, а сама биология превращается ...
... хотя бы стены, чтобы нас не унижали в собственном доме, до конца не растащили наше имущество, нам нужна, обладающая высоким моральным и воинским духом достойно обеспеченная армия. Однако, значение российской армии и в том, что она представляет собой, пожалуй, единственный институт в современной виртуальной России, лишенный симулякров, поскольку ней, по крайней мере, погибают реально - в бою. ...
... важные функции управления предприятием, такие как: определение задач; планирование ресурсов; оценка деятельности и мотивация персонала на основе оценки; контроль исполнения. В целом, бюджетирование решает тактические вопросы и, по существу, для стратегического управления не предназначено. Связь бюджетирования со стратегией Практика стратегического планирования западных компаний ...
... . Для этого достаточно измерить его на карте и знать масштаб карты. Компас. Научиться пользоваться компасом нетрудно. Но компас, как правило, наилучшим помощником в ориентировании становится вместе с картой. В спортивном ориентировании пользуются специальными жидкостными компасами. Они позволяют быстро и просто взять с карты нужное направление и двигаться по местности по выбранному азимуту. ...
0 комментариев