Файл: Справочник для опытных и как пособие для начинающих программистов. Компактдиск содержит исходные коды примеров из книги.doc

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 11.01.2024

Просмотров: 960

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
Глава 14. Типичные Web-ориентированные приложения ASP.NET на Visual С# 2010

Пример 102. Чтение/запись текстового файла Web-приложением

Активная Web-страница может сохранять, а также читать данные на диске в ка­ких-либо файлах, в том числе текстовых. Принцип чтения/записи на диск тексто­вых файлов такой же как и в Windows-приложениях, однако есть некоторые осо­бенности. Поставим задачу написать Web-приложение, читающее текстовый файл и выводящее его в текстовое поле, пользователь имеет возможность редактировать текст и сохранять его в том же файле.

Для решения поставленной задачи запустим Visual Studio 2010, закажем новый проект из шаблона Empty ASP.NET Web Application, имя Web-приложения — RW_txt. К текущему проекту добавим Web-форму. Для этого в пункте меню Pro­ject выберем команду Add New Item и в появившемся окне дважды щелкнем на шаблоне Web Form.

В конструкторе формы из раздела Standard панели Toolbox перетащим мышью текстовое поле TextBox и две командных кнопки Button. Расположим их на форме так, как показано на рис. 14.1. Содержимое файла программной поддержки приве­дено в листинге 14.1.

Листинг 14.1. Чтение/запись текстового файла

// Чтение/запись текстового файла Web-приложением. Web-приложение читает текстовый файл в текстовое

//поле, а пользователь имеет возможность редактировать текст и сохранять его в том же файле

using System;

using System.Web.Ul.WebControls;

//Другие директивы using удалены, поскольку они не используются в данной программе

namespace RW_txt

{

public partial class WebForml : System.Web.UI.Page

{

string filename; // - имя файла используется в обеих процедурах

// Чтобы русские буквы читались корректно, объявляем объект КОДИРОВКА

System.Text.Encoding КОДИРОВКА = System.Text.Encoding.GetEncoding(1251);

protected void Page_Load(object sender, EventArgs e)

{

Page.Title = "Здесь кодировка Win1251";

Button1.Text = "Читать"; Button2.Text = "Сохранить";

Button1.Focus();

// Разрешаем многострочие

TextBox1.TextMode = TextBoxMode.MultiLine;

filename = Request.PhysicalApplicationPath + "txt.txt";

}

protected void Button1_Click(object sender, EventArgs e)

{ // Чтение файла:

try

{ // Создаем экземпляр StreamReader для чтения из файла

var ЧИТАТЕЛЬ = new System.10.StreamReader(filename, КОДИРОВКА);

TextBox1. Text = ЧИТАТЕЛЬ. ReadToEnd ();

ЧИТАТЕЛЬ.Close();

}

catch (System.IO.FileNotFoundException Ситуация)

{

Response.Write("Нет такого файла

" + Ситуация.Message);

}

catch (Exception Ситуация) // Отчет о других ошибках

{

Response.Write("Ошибка чтения файла
" + Ситуация.Message + "
");

}

}

protected void Button2_Click(object sender, EventArgs e)

{ // Сохранение файла:

try

{ // Создание экземпляра StreamWriter для записи в файл

var ПИСАТЕЛЬ = new System.IO.StreamWriter(filename, false, КОДИРОВКА);

ПИСАТЕЛЬ.Write(TextBox1.Text);

ПИСАТЕЛЬ.Close();

}

catch (Exception Ситуация)

{ // Отчет обо всех возможных ошибках

Response.Write("Ошибка записи файла <Ьг />" + Ситуация.Message + "
");

}

}

}

}



Рис. 14.1. Форма приложения в режиме конструктора

В начале программного кода объявляем имя файла filename и объект кодировка в качестве внешних переменных по отношению к процедурам класса, чтобы они были видны из всех процедур обработки событий. При загрузке страни­цы Page_Load задаем надписи на кнопках Button1 и Button2, а текстовое поле пе­реводим в режим Multiline, т. е. разрешаем размещать текст на нескольких строч­ках. Далее, поскольку мы не можем разрешить пользователю выбирать папку на удаленном сервере для размещения файла, в качестве такой папки указываем пап­ку, где расположено текущее Web-приложение. При этом мы не сможем восполь­зоваться методом GetCurrentDirectory класса IO.Directory, поскольку эта функ­ция нам укажет на системную папку C:\Windows\system32. Поэтому воспользуемся методом РhysicalApplicationPath объекта Request. При обработке события "щелчок на кнопке" Читать читаем текстовый файл, используя объект StreamReader. Так же как и при записи файла, данная процедура ничем не отличается от про­граммирования ее в Windows-приложении.

Однако существует большая вероятность получить отказ в доступе к файлу. Операционная система, в зависимости от настроек, может выдать сообщение об ошибке сервера в вашем приложении вследствие отказа в доступе к вашему тек­стовому файлу. То есть можем получить запрет на запись файла на диск сервера. В этом сообщении об ошибке указано, что следует на вкладке Безопасность свойств текстового файла разрешить чтение/запись. Однако весьма вероятна ситуация, ко­гда, щелкнув правой кнопкой мыши на изображении файла txt.txt и выбрав коман­ду Свойства, мы получим свойства файла в таком виде, как показано на рис. 14.2.




Рис. 14.2. Вкладки окна свойств файла

Как видно, в окне свойств файла txt.txt отсутствует вкладка Безопасность. Что­бы ее получить, следует в Проводнике выбрать пункт меню Сервис | Свойства папки и в появившемся окне на вкладке Вид снять флажок Использовать простой общий доступ к файлам. Далее— щелчок на кнопках Применить и ОК (рис. 14.3).



Рис. 14.3. Вкладки окна свойств папки



Рис. 14.4. Вкладка Безопасность окна свойств файла

Теперь опять перейдем к свойствам файла txt.txt. Вкладка Безопасность, как видно, уже появилась. На ней нажмем кнопку Добавить, перейдя таким образом в окно Выбор. Далее нажмем кнопки Дополнительно, Поиск и, выбрав в появившемся списке имя пользователя ASP.NET, щелкнем на кнопке ОК. Теперь на вкладке Свойства в строках Чтение и Запись установим флажок разрешения и нажмем кнопки Применить и ОК (рис. 14.4).

Теперь еще раз запустим Web-приложение и убедимся в его корректной работе. На рис. 14.5 показан фрагмент работы созданной Web-страницы.

Используя инструмент чтения/записи текстового файла, можно обмениваться данными между страницами Web-приложения, организовать форум на Web-сайте, гостевую книгу, счетчик посещений и проч.



Рис. 14.5. Фрагмент работы Web-страницы, осуществляющей чтение/запись текстового файла

Убедиться в работоспособности Web-страницы можно, открыв соответствую, решение в папке RW_txt.

Пример 103. Программирование счетчика посещений сайта с использованием базы данных и объекта Session

Поставим задачу создать счетчик посещения вашего сайта. Каждое посещение будем фиксировать в виде записи в базе данных MS Access. Чтобы читатель мог реально повторить описываемые действия, подробно их рассмотрим. Запустим офисное приложение MS Access, далее в меню Файл выберем команду Создать I Новая база данных, файл — Web.mdb. Затем создадим "шапку" новой таблицы в ме конструктора. Имена полей и типы данных приведены на рис. 14.6.




Рис. 14.6. Проектирование полей таблицы базы данных

Как видно, автор не предусмотрел поля типа Счетчик, а ведь нам нужно считать именно количество посещений, т. е. количество записей. Сделано это сознательно, т. к. количество записей в базе данных выяснить очень просто, например, с помощью SQL-запроса:

SELECТ COUNT(*) FROM [Таблица посещений Web-страницы]

Tеперь запустим Visual Studio 2010, закажем новый проект из шаблона Empty NET Web Application C#, назовем его Counter. К текущему проекту добавим форму. Для этого в пункте меню Project выберем команду Add New Item и в появившемся окне дважды щелкнем по шаблону Web Form.

Здесь из раздела Standard панели Toolbox перенесем на Web-форму метку Label, куда будем выводить количество посещений данной страницы. Метку Label разместим пока в самом верху формы, но, в конце концов, ее следует расположить скромно где-нибудь в самом низу страницы.

Содержимое файла программной поддержки WebForm1.aspx.cs приведено в листинге 14.2.

Листинг 14.2. Счетчик посещений сайта

//Web-приложение, реализующее счетчик посещений сайта с использованием

// базы данных и объекта Session

using System;

// добавляем эту директиву для краткости выражений:

using ОлеДиБи = System.Data.OleDb;

//Другие директивы using удалены, поскольку они не используются в данной программе

namespace Counter

{

public partial class WebForm1 : System.Web.UI.Page

{

protected void Page_Load(object sender, EventArgs e)

{

Page.Title = "Счетчик посещений сайта";

if (Page.IsPostBack == true) return;

// При первой загрузке страницы выясняем IP-адрес посетителя сайта string IР_адрес = Request.UserHostAddress;

string URL_aдpec;

try

{ // Определение, с какой Web-страницы вы сюда пришли

URL_aflpec = Request.UrlReferrer. AbsoluteUri;

Response.Write("
Вы пришли на эту" + " страницу со страницы " + URL_адрес) ;

}

catch // (System.NullReferenceException Ситуация)

{ // Если пришли на эту страницу, набрав URL-адрес

//в адресной строке браузера

URL_адрес = "Адресная строка браузера";

Response.Write("
Вы пришли на эту " + "страницу набрав URL-адрес в адресной строке");

}

Response.Write("
Вы пришли на эту страницу " + "с IP-адреса " + 1Р_адрес);

// МАНИПУЛЯЦИИ С БД О ПОСЕЩЕНИИ ПОЛЬЗОВАТЕЛЯ.

// Строка подключения

string СтрокаПодкл = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Server.MapPathCWeb.mdb") ;

// Создание экземпляра объекта Connection

var Подключение = new ОлеДиБи.OIеDbСоnnection(СтрокаПодкл);


try

{ // Открытие подключения

Подключение.Open();

}

catch (Exception Ситуация)

{

Response.Write("
" + Ситуация.Message);

}

string SQL_3anpoc;

var Команда = new ОлеДиБи.OleDbCommand();

// ЕСЛИ ОБ ЭТОМ ПОСЕЩЕНИИ ЕЩЕ НЕТ ЗАПИСИ

if (Page.Session["ЕСТЬ ЛИ ЗАПИСЬ ОБ ЭТОМ ПОСЕЩЕНИИ?"] != "ДА")

{ // ДОБАВЛЕНИЕ ЗАПИСИ В БД О ПОСЕЩЕНИИ

string ДАТА = System.DateTime.Now.ToString();

// Строка SQL-запроса

SQL_3anpoc = "INSERT INTO [Таблица посещений Web-страницы] " +

"([Дата посещения], [IP-адрес посетителя], " + "[С какой страницы пришли]) VALUES ('" + ДАТА +

" ', ' " + IР_адрес + " ', " +URL_адрес + " ') ";

// Создание объекта Command с заданием SQL-запроса

Команда.CommandText = SQL_3anpoc;

// Для добавления записи эта команда обязательна

Команда.Connection = Подключение;

try

{ // Выполнение команды SQL, т. е/ ЗАПИСЬ В БД

Команда.ExecuteNonQuery ();

Response.Write( "
В таблицу БД посещений добавлена запись");

// ТЕПЕРЬ ПОЯВИЛАСЬ ЗАПИСЬ ОБ ЭТОМ ПОСЕЩЕНИИ

Page.Session["ЕСТЬ ЛИ ЗАПИСЬ ОБ ЭТОМ ПОСЕЩЕНИИ?"] = "ДА";

}

catch (Exception Ситуация)

{

Response.Write("
" + Ситуация.Message) ;

}

}

// ОПРЕДЕЛЕНИЕ КОЛИЧЕСТВА ЗАПИСЕЙ О ПОСЕЩЕНИИ.

// Новый SQL-запрос - это одна ячейка в новой таблице

SQL_3anpoc = "SELECT COUNT(*) FROM [Таб" + "лица посещений Web-страницы]";

Команда.CommandText = SQL_3anpoc;

Команда.Connection = Подключение;

// ExecuteScalar выполняет запрос и возвращает первую

// колонку первого ряда таблицы запроса

int КОЛ_ВО = 0;

try

{

КОЛ_ВО = (int)Команда.ExecuteScalar();

}

catch (Exception Ситуация)

{

Response. Write ("
" + Ситуация .Message) ;

}

Подключение.Close() ;

Label1.Text = "Количество посещений страницы = " + К0Л_В0;

}

}

}

Как видно из программного кода, программирование счетчика посещений реа­лизовано при обработке событий загрузки Web-страницы Page_Load, причем при ее первой загрузке, когда IsPostBack = false. Используя объект Request, выясняем IP-адрес посетителя данной Web-страницы. Далее с помощью этого же объекта Request в блоке try.. .catch определяем, с какой Web-страницы пользователь пе­решел на данную страницу. Если попытка (try) определить оказалась неудачной, то управление переходит на Exception и делается вывод, что пользователь оказался на данной странице, набрав URL-адрес в адресной строке своего браузера. Для вы­вода текста в форму использован метод Response .Write. Роль этой печати здесь вспомагательная, как бы отладочная. Читатель может ее закомментировать или во­все удалить.