На языке C++ мы создадим простую Web-страницу на основе ASP.NET, на которой отображается информация о гостиницах. Названия городов и гостиниц хранятся в раскрывающихся списках. Выбор названия города в первом раскрывающемся списке приводит к тому, что во втором раскрывающемся списке будут перечислены названия гостиниц, которые расположены в выбранном городе. Информацию о гостиницах содержит компонент Hotel.dll, расположенный в каталоге CaseStudy\AcmeWeb. В свою очередь, этот каталог находится в папке к данной главе. Для заполнения списков мы используем привязку данных. Завершенный проект расположен в каталоге Cas-eStudy\AcmeWeb в папке к данной главе. Вы можете также самостоятельно создать приложение, выполнив все необходимые действия. Сохраните созданное вами приложение в папке Demos (Демонстрации), хранящейся в папке к данной главе.
Чтобы увидеть результаты работы приложения, введите в адресной строке броузера унифицированный указатель информационного ресурса (URL) http://localhost/NetCpp/ CaseStudy/AcmeWeb/AcmeWeb.aspx. Но перед этим еще необходимо создать виртуальный каталог и, используя диспетчер служб Internet (Internet Services Manager), сконфигурировать его в информационном сервере Internet (US) в качестве приложения. Конфигурирование виртуального каталога описывается ниже.
Конфигурирование соединения с Web-сервером
Перед тем как писать приложение, вы, возможно, пожелаете проверить, а, может быть, есть смысл изменить настройки соединения Web-сервера. Имеются два переключателя: File share (Совместное использование файлов) и FrontPage. Если приложение полностью разрабатывается на локальном компьютере, для удобства и ускорения работы рекомендуется выбрать переключатель File share (Совместное использование файлов). Чтобы получить доступ к этому параметру настройки, в меню Tools (Сервис) выберите команду Options (Параметры). Затем выберите папку Projects (Проекты), а в ней — пункт Web Settings (Параметры Web). Наконец, в группе Preferred Access Method (Предпочтительный метод доступа) выберите нужный переключатель. Процесс конфигурации соединения иллюстрируется на Рисунок 10.17.
Создание сетевого приложения с помощью C++ на основе ASP.NET
1. В Visual Studio в меню File (Файл) выберите команду New (Создать), а затем пункт Project (Проект).
2. В диалоговом окне New Project (Новый проект) в качестве типа проекта (Project Туре) укажите Visual C++ Projects (Проекты на Visual C++). В качестве используемого шаблона (Template) укажите Managed C++ Class Library (Библиотека классов управляемого C++).
3. Укажите AcmeWeb в качестве имени проекта.
4. Укажите путь к проекту С: \OI\NetCpp\ChaplO\Demos (Рисунок 10.18).
5. Щелкните на ОК При этом в каталоге С: \OI\NetCpp\ChaplO\Demos будут созданы файлы проекта, включая файл решения Acme Web sin
6. Создайте на основе каталога C:\OI\NetCpp\ChaplO виртуальный каталог с псевдонимом NetCpp (рис 10 3), если вы не создали его раньше
Конструирование формы
Поскольку в среде Visual Studio NET конструктор форм не поддерживает язык C++, то форму лучше спроектировать на С#, а затем полученный код (на С#) перенести на язык C++ Сначала вы могли бы создать на С# фиктивный проект с формой и сконструировать саму форму Но это все уже сделано за вас Вы можете воспользоваться файлом WebForml.aspx.h, содержащим готовый код на C++ Он находится в каталоге Cas-eStudy\AcmeWeb Добавьте его в ваш проект, который расположен в каталоге Demo s\AcmeWeb
Форма содержит две надписи (Label (Надпись)), два раскрывающихся списка (DropDownList) и одну кнопку (Button) Свойство Text (Текст) первой надписи имеет значения City (Город), а второй — Hotel (Гостиница) Свойство Text (Текст) единственной кнопки имеет значение Make Reservation (Забронировать) Идентификатор (ID) первого раскрывающегося списка принимает значение listCities, второго— listHo-tels Идентификатор (ID) кнопки имеет значение cmdMakeReservation Данная форма представлена на Рисунок 10.19 Размер раскрывающихся списков, которые показаны на рисунке, был изменен
Чтобы в новом проекте (он расположен в каталоге Demos\AcmeWeb) воспользоваться кодом, перенесенным на C++, (этот код содержится в файле WebForml.aspx.h, хранящемся в папке CaseStudy\AcmeWeb), выполните следующие действия
1. Скопируйте файл WebForml. aspx. h из каталога CaseStudy\AcmeWeb в каталог Demos\AcmeWeb, в котором расположен новый проект
2. Откройте новый проект, если он еще не открыт Для этого войдите в каталог Demos\AcmeWeb идважды щелкните на файле Acme Web. sin
3. В окне поиска решения (Solution Explorer), щелкните правой кнопкой мыши на узле Header Files (Заголовочные файлы) (Этот узел находится в проекте Acme Web ) Теперь из контекстного меню выберите команду Add (Добавить) и затем Add Existing Item (Добавить существующий элемент) После этого дважды щелкните левой кнопкой мыши на файле WebForml. aspx. h
4. Удалите файл Acme Web. h, который в проекте не используется Для этого выделите этот файл в окне поиска решения (Solution Explorer) и нажмите клавишу Delete (Удалить) Поскольку файл AcmeWeb h больше не требуется вообще, его можно удалить и из каталога \Demos\AcmeWeb С этой целью можно использовать и Проводник Windows (Windows Explorer)
5. Отредактируйте файл AcmeWeb срр Удалите директиву iinclude, которая включает файл AcmeWeb h Добавьте директиву # include, чтобы включить файл WebForml aspx.h Вскоре мы добавим в проект еще один заголовочный файл, который называется Global. азах. h Включите его в текущий файл при помощи директивы #include
// Это - основной файл динамически подключаемой библиотеки (DLL).
#include "stdafx.h"
#include "Global.asax.h"
#include "WebForml.aspx h"
Ниже приведен исходный файл WebForml. aspx. h Обратите внимание, что для извлечения объекта HotelBroker используется статическое поле Global: : hotelBroker Вскоре мы увидим, что этот объект создается методом Application_Start объекта Global (Глобальный), который определен в исходном файле Global. asax. h
//WebForml.aspx.h
namespace AcmeWeb
// пространство имен AcmeWeb
{
public _gc class WebForml :
public System::Web::UI::Page
// класс сборщика мусора WebForml:
// общедоступная Система::Сеть::Пользовательский
// интерфейс::Страница
{
protected: // защищенный
System::Web::UI::WebControls::Label *Labell;
System::Web::UI::WebControls::Label *Label2;
System::Web::UI::WebControls::DropDownList
*listCities; System::Web::UI::WebControls::DropDownList
*listHotels;
private: // частный
static HotelBroker *hotelBroker; // статический
public:
WebForml()
{
Page::Init += new System::EventHandler(
this, Page_Init);
}
private: // частный
void Page_Load(Object *sender, System::EventArgs *e)
{
if ( HsPostBack)
{
hotelBroker = Global:rhotelBroker;
ArrayList *cities = hotelBroker->GetCities();
listCities->DataSource = cities; // города
ArrayList *hotels = hotelBroker->GetHotels;
dynamic_cast<String *> // Строка
(cities->get_Item(0))); // города
BindHotels(hotels); // гостиницы
DataBind();
}
}
};