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

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

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

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

Добавлен: 11.01.2024

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

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

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
HTTP, при этом изображение не будет записываться на диск, но пользователь будет видеть его в браузере. Далее элементу управления Image1 указываем виртуальный путь к файлу изображения. Замечу, что физический путь не должен отправляться клиенту, поскольку он может использоваться злоумышлениками для получения сведений о приложении.

На рис. 14.13 показан фрагмент работы программы. Убедиться в работоспособности Web-страницы, рассмотренной в данном примере, можно, открыв соответствующее решение в папке TeкстHaклWeb.

Пример 107. Гостевая книга

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

В гостевой книге следует предусмотреть поля для ввода имени посетителя, адреса его электронной почты, а также поле для непосредственного сообщения. Все записи, оставленные посетителями сайта, будем сохранять в текстовом файле kniga.txt на винчестере сервера, предоставляющего Web-хостинг. Впрочем, вместо текстового файла можно воспользоваться какой-либо базой данных.



Рис. 14.14. Размещение элементов управления в конструкторе формы

Для программирования гостевой книги запустим Visual Studio 2010, в окне New Project выберем шаблон Empty ASP.NET Web Application, в поле Name укажем имя нового решения ГостеваяКнига и щелкнем на кнопке ОК. Теперь добавим к текущему проекту Web-форму. Для этого в пункте меню Project выберем команду Аdd New Item, в появившемся окне укажем шаблон Web Form и щелкнем на кнопке Add.

На вкладке конструктора формы в панели элементов раздела Standard нам понадобятся четыре метки Label, три текстовых поля TextBox, соответственно, для имени пользователя, его электронной почты и сообщения, одна командная кнопка Вutton с надписью "Добавить сообщение"'и сетка данных GridView из раздела Data для отображения всех вводимых записей. Кроме того, возле каждого текстового поля разместим валидатор RequiredFieldValidator (раздел Validation), проверяющий факт
заполнения текстовых полей. Правильность заполнения проверять не будем, поскольку в данной ситуации если мы будем слишком "принципиальничать" по поводу вводимых данных, то посетитель потеряет терпение и уйдет на другой ресурс (не наш!). Не забываем, что мы гораздо больше заинтересованы во всех новых сообщениях, чем посетители их написать. С другой стороны (другая крайность), если мы вовсе не будем контролировать заполнения текстовых полей, то у недобросовестного пользователя появится соблазн нажимать кнопку Добавить ообщение без заполнения полей и заполнять таблицу сетки данных пустыми строками, что будет вовсе дискредитацией замысла гостевой книги. В конструкторе формы разместим выбранные элементы управления так, как показано на рис. 14.14.

После размещения в конструкторе необходимых элементов управления переходим на вкладку программного кода. Текст программы представлен в листинге 14.9.

Листинг 14.9. Гостевая книга

//Данная Web-страница приглашает посетителя оставить какие-либо записи, которые могут прочитать другие

// посетители страницы. Записи сохраняются в текстовом файле kniga.txt. Записи отображаются на Web-странице

// с помощью сетки данных GridView

using System;

using System.Web.UI.WebControls;

// Добавляем эти две директивы для сокращения программного кода:

using System.Data; ing System. IO;

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

namespace ГостеваяКнига

{

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

{

DataTable Таблица = new DataTable();

StreamReader Читатель;

StreamWriter Писатель;

protected void Page_Load(object sender, EventArgs e)

{

Label1.Text = "ВЫ МОЖЕТЕ НАПИСАТЬ КАКОЕ-НИБУДЬ " + "СООБЩЕНИЕ В НАШЕЙ ГОСТЕВОЙ КНИГЕ";

Label2.Text = "Ваше имя:";

Label3.Text = "Ваш E-mail:";

Label4.Text = "Ваше сообщение:";

Button1.Text = "Добавить сообщение";

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

TextBox3.TextMode = TextBoxMode.MultiLine;

// Контролируем обязательность заполнения всех полей:

RequiredFieldValidator1.ErrorMessage = "* Следует заполнить это текстовое поле"; RequiredFieldValidator1.ControlToValidate = "TextBox1";

RequiredFieldValidator2.ErrorMessage = "* Следует заполнить это текстовое поле"; RequiredFieldValidator2.ControlToValidate = "TextBox2";

RequiredFieldValidator3.ErrorMessage = "* Следует заполнить это текстовое поле"; RequiredFieldValidator3.ControlToValidate = "TextBox3";

Таблица.Columns.Add("Дата"); Таблица.Columns.Add("Имя");

Таблица.Columns.Add("E-mail"); Таблица.Columns.Add("Сообщение");

GridView1.BorderWidth = Unit.Pixel(2);

GridView1.BorderColor = System.Drawing.Color.Gray;

// Расстояние между содержимым ячейки и ее границей:

GridView1.CellPadding = 3;

GridView1.Caption = "Записи гостевой книги";



GridView1.CaptionAlign = TableCaptionAlign.Right;

ЗaпoлнитьGridView();

}

public void ЗaпoлнитьGridView()

{ // Эта процедура читает файл kniga.txt (если его нет, то создает), разбивает каждую строку файла на четыре части // (дата, имя, e-mail и сообщение) и заполняет этими частями строки таблицы. Затем записывает эту таблицу в // // сетку данных GridView.
//

// Открываем файл kniga.txt, а если его нет, то его создаем:

var Открыватель = new FileStream(Request.PhysicalApplicationPath +"kniga.txt", FileMode.OpenOrCreate);

// Открываем поток для чтения всех записей из файла

Читатель = new StreamReader(Открыватель);

//В качестве разделителя частей строки файла выбираем Tab, поскольку Tab невозможно ввести в текстовое //поле. После нажатия клавиши <ТаЬ> происходит переход в следующее текстовое поле

char[] Разделитель = new char[] { '\t' }; // - массив

string[] Массив_частей_строки;

while (Читатель.EndOfStream == false)

{

string Одна_строка = Читатель.ReadLine();

// Функция Split делит строку на четыре части и присваивает каждую часть элементам массива

Массив_частей_строки = Одна_строка.Split(Разделитель);

// Загружаем, т. е. заполняем одну строку таблицы Таблица.LoadDataRow(Maccив_частей_строки, true);

}

GridView1.DataSource = Таблица;

// Обновление сетки данных:

GridView1.DataBind();

Таблица.Clear();

Читатель.Close(); Открыватель.Close();

}

protected void Button1_Click(object sender, EventArgs e)

{ // Щелчок на кнопке "Добавить".

// Открываем поток для добавления данных в конец файла

Писатель = new StreamWriter(Request.PhysicalApplicationPath + "kniga.txt", true);

// true означает разрешить добавление строк в файл.

// Записываем в файл новое сообщение, между полями - символ табуляции

Писатель.WriteLine("{0:D} \t{1} \t{2} \t{3}", DateTime.Now, TextBox1.Text, TextBox2.Text, TextBox3.Text);

// Очищаем поля и закрываем поток

TextBox1.Text = string.Empty; TextBox2.Text = string.Empty;
TextBox3.Text = string.Empty;
Писатель.Close();

ЗaпoлнитьGridView();

}

}

}

Как видно из программного кода, вначале создаем таблицу данных класса DataTable и два потока данных для чтения и записи файлов так, чтобы они были видны из всех процедур класса. При обработке события загрузки формы организу­ем контроль обязательности заполнения текстовых полей формы, задаем "шапку" таблицы (т. е. названия колонок таблицы), а последней командой вызываем процедуру ЗаполнитьGridView.

Эта процедура в цикле while читает строки текстового файла kniga.txt и заполняет ими строки таблицы данных методом LoadDataRow(). Далее заполненную таблицу данных указываем в качестве источника данных (DataSource) для сетки данных GridView1, предназначенной для визуализации (отображения) таблицы форме. После этого важно очистить таблицу данных методом
Сlear ().



Рис. 14.15. Интерфейс гостевой книги

При обработке события "щелчок на кнопке" открываем поток данных Писатель длядобавления данных в конец файла kniga.txt и записываем в этот файл текстовую строку, содержащую текущую дату, имя посетителя Web-страницы, его e-mail и непосредственно его сообщение. Причем в качестве разделителя между этими текстовыми строками мы используем управляющий символ Tab, поскольку его невозможно ввести в текстовое поле, т. к. после нажатия клавиши <ТаЬ> предусмотрен переход в следующее текстовое поле. После закрытия потока данных Писатель вызываем процедуру 3aполнитьGridView, которая как бы начинает опять "с чистого листа": снова открывает поток для чтения файла и опять заполняет таблицу данных, которая, как мы помним, была очищена от предыдущих данных. Именно поэтому строки (команды) процедуры 3aполнитьGridView были оформлены в отдель­ную процедуру, поскольку заполнение таблицы и ее визуализация происходят дважды: один раз при загрузке формы, а другой при добавлении новой записи.

Фрагмент работы гостевой книги представлен на рис. 14.15. Убедиться в работоспособности данной программы можно, открыв соответствующее решение в папке ГостеваяКнига.

Пример 108. Программирование капча

Слово Capcha —- это английская аббревиатура выражения "Completely Automated Public Turing test to tell Computers and Humans Apart", которое можно перевести, как "полностью автоматический публичный тест Тьюринга для разли­чия компьютеров и людей". Другими словами, это компьютерное тестирование, используемое в каком-либо пользовательском интерфейсе для того, чтобы опреде­лить, кем является пользователь системы: человеком или компьютером.

Процедура капча чаще всего используется при необходимости предотвратить вредоносное использование интернет-сервисов ботами (программами-роботами). В частности для предотвращения автоматических (без участия человека) отправок сообщений, регистрации, скачивании файлов, массовых рассылок, мошенничества, сетевых атак и т. п. Как вы понимаете, бот (или робот, или интернет-робот) — это специальная программа, выполняющая автоматически какие-либо действия через те же интерфейсы, что и обычный пользователь-человек.

Для противодействия таким автоматическим действиям интернет-роботов сейчас довольно-таки широко применяется обсуждаемая в данном разделе капча. Основной замысел тестирования с помощью капча в том, чтобы предложить пользователю та­кую задачу, которую очень легко тот может решить, но которую несоизмеримо сложно предоставить для решения компьютеру. В основном это задачи на
распознавание символов. Это весьма актуальная задача; автор заметил на сайте оффшорного программирования www.rentacoder.com (это сайт-посредник между работодателем и программистом), что имеет место спрос на процедуру капча.

Итак, для решения этой задачи запустим Visual Studio 2010, закажем новый про­ект из шаблона Empty ASP.NET Web Application, укажем в поле Name имя Капча и щелкнем на кнопке ОК. К текущему проекту добавим Web-форму. Для этого в меню Project выберем команду Add New Item и в появившемся окне дважды щелкнем на шаблоне Web Form. Теперь в конструкторе формы на вкладке WebForm1.aspx из раздела Standard панели Toolbox перенесем в форму элементы управления: изображение Image, текстовое поле TextBox, командную кнопку Button, метку Label и гиперссылку HyperLink. Расположим их в форме, как показано на рис. 14.16. На вкладке файла программной поддержки WebForm1.aspx.cs введем код, дставленный в листинге 14.10.

Листинг 14.10. Программирование капча

//Программа тестирует пользователя на "человечность", предлагает распознать искаженную строку символов

using System;

using System.Drawing;

using System. Drawing. Imaging;

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

namespace Капча

{

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

{

protected void Page_Load(object sender, EventArgs e)

{

Page.Title = "Капча";

// При повторной отправке данных оставляем все как есть:

if (Page.IsPostBack == true) return;

// Получить сгенерированный рисунок:

Bitmap РАСТР = Генерировать Рисунок();

// Сохранить сгенерированный рисунок:

// bmp.Save(Response.OutputStream, ImageFormat.Jpeg);

РАСТР.Save(Request.PhysicalApplicationPath + "risunok.jpg", ImageFormat.Jpeg);

РАСТР.Dispose();

// Указываем виртуальный путь к файлу изображения:

Image1.ImageUrl = Request.ApplicationPath + "risunok.jpg";

Label1.Text = "Введите символы, изображенные на картинке";

Button1.Text = "Регистрация";

TextBox1.Focus(); TextBox1.Font.Size = 18;

HyperLink1.Text = "Обновить картинку";

// При обновлении картинки отправляем на загрузку самой себя:

HyperLink1.NavigateUrl = "WebForm1.aspx";

}

private Bitmap ГенерироватьРисунок()

{ // Эта функция генерирует рисунок и возвращает его в формате Bitmap

Color ЦветПера = Color.Black;

Brush ЦветФона = Brushes.White, ЦветРисования = Brushes.Black;

// Генератор псевдослучайных чисел:

Random Случай = new Random();

// Выбор цвета случайным образом из двух вариантов:

ВыборЦвета(Случай, ref ЦветПера, ref ЦветФона, ref ЦветРисования);