Пользовательский интерфейс (уровень представления) - 11 Февраля 2010 - Лекции
Вторник, 06.12.2016, 19:00
Приветствую Вас Гость | RSS

Лекции

Меню сайта
Форма входа
Категории раздела
ТАУ (Теория автоматического управления) [31]
лекции по ТАУ
Экология [151]
учебник
Бухгалтерский учет и налогообложение в строительстве [56]
Дементьев А.Ю. - Практическое пособие
Психология [104]
Пип
информатика [80]
с# Карли Ватсон
современные стулья [0]
новинки
Поиск
Главная » 2010 » Февраль » 11 » Пользовательский интерфейс (уровень представления)
00:58
Пользовательский интерфейс (уровень представления)
Пользовательский интерфейс (уровень представления)
Завершив создание уровня данных
и уровня бизнес-логики и поэксперимен-
тировав с консольным приложением на
уровне представления, можно перейти
к созданию web-интерфейса для опроса
с использованием ASP.NET. Прежде все-
го необходимо добавить проект ASP.NET
в наше решение в Visual Studio.NET.
Назовем его Poiiw (сокращение от Poll
Web), как показано на рисунке слева.
Заметьте, что при создании нового
web-приложения Visual Studio.NET авто-
матически генерирует несколько файлов,
ВКЛЮЧая файл WebForml. aspx — началь-
ную страницу ASP.NET. Переименуем ее
В default.aspx С тем, чтобы МОЖНО было
*"^Л' " ~С***'*
Project Types:
j l ' ----- С* Projects
CJ Seiyp -and Deployment Prefects
*" LJ Other Projects window
Application Windows
:i Шш
Щ
МС library
ASPJNE T Web w«b Ox*
_rJ
Location;
Project vM be created at hltp://locdhost/PofiW.
ссылаться на приложение следующим образом: https/ziocalhost/Pollw. У файла
default.aspx имеется привязанный к нему файл defauit.aspx.es с кодом под-
держки. Мы скоро приступим к работе с ним. Совершенно очевидно, что если
web-сервер выполняется не на вашей локальной машине, то необходимо указать
имя вашего сервера, а не использовать слово locaihost.
Но прежде необходимо подумать об одном важном моменте. Использование
ASP.NET позволяет создать фантастическую систему для построения web-форм,
которая во многом напоминает Visual Basic, поскольку в Visual Studio.NET можно
переносить управляющие элементы с помощью мыши и использовать программи-
рование, основанное на работе с событиями. Однако существует одна загвоздка —
при использовании ASP.NET можно использовать только одну форму на стороне
766 Практический пример
Г http://iocafhost/pollw/ - Micro
; File gdt View Favorites Tools Help
./ро?И
пользователя для каждой конкретной страницы. При создании web-сайта для про-
ведения опросов представляется логичным воспользоваться на стороне сервера
формой, которая будет обладать, например, одним переключателем для каждого
ответа и кнопкой Vote для регистрации сделанного выбора. Если остановиться на
таком подходе, то страница, на которой будет проводиться опрос, не сможет содер-
жать никаких других форм на стороне сервера, а если включить опрос на несколь-
ко страниц web-сайта, где впоследствии потребуется добавить еще какие-либо
формы (например, второй опрос или управляющий элемент поиска), то этого сде-
лать будет нельзя. Чтобы избежать проблем подобного рода, а заодно получить
возможность познакомиться с некоторыми не столь широко известными методами
.NET, нужно воспользоваться такой моделью web-сайта для проведения опросов,
в которой не будет использовано никаких форм на стороне сервера, т. е. перейти
не более низкий уровень возможностей ASP.NET, который может оказаться зна-
комым тем, программирует на ASP 3.0. И хотя использование этих возможностей
в ASP.NET является несколько необычным, все равно будет полезно познакомить-
ся с тем, как они работают в подобных ситуациях — когда использование формы
на стороне сервера оказывается неприемлемым.
Обычно в простой, отсылаемой назад форме достаточно ограничиться одной
страницей и воспользоваться событием Onclick для кнопки отправки (кнопки
Vote), которая позволяет зарегистрировать выбор посетителя. Однако, чтобы
избежать использования форм на стороне
сервера, мы собираемся использовать две
страницы. На первой из них будет выво-
диться вопрос и перечень возможных отве-
тов, а рядом с каждым ответом — ссылка
Vote (Голосую за). Эта ссылка позволяет
передать в качестве параметра номер вы-
бранного ответа второй странице, которая
использует переданное ей значение для ре-
гистрации голоса, после чего выводит на
экран текущие результаты голосования.
Как должна выглядеть первая страни-
ца—default.aspx, показано на рисунке
слева.
I [gPersonatBar ^Search
Какой язык программирования вы, в основном, используете?
Голосую за С#
Голосую за C++
Голосую за Java
Голосую за JavaScript
Голосую за Visual Basic
"ГГТ
А вот как должна выглядеть вторая стра-
ница — vote.aspx, представлено на рисунке
справа.
Первая страница — default.aspx — пред-
ставляет опрос, и когда мы выбираем первый
из возможных ответов с помощью ссылки
Vote, то видим, что странице vote.aspx
в строке URL передается единица. Данный
параметр используется для регистрации го-
лоса. После этого vote.aspx выводит все ва-
рианты ответов со счетчиками голосов для
каждого из них.
? :1££\'<
Fib E<& Vim
Address {:
т„•: - :• ^
У •$Search Qj
Голосование oo вопросу "Какой язык программировании
вы, в основном, используете?"
С# 15 голосов
О+ 2 голоса
Java 35 голосов
JavaScript 12 голосов
Visual Basic 42 голоса
£|~ Local intiane* /X
Практический пример 1 — юеЪ-сайт для проведения опросов 767
Начнем с файла ASP.NET default.aspx, созданного Visual Studio.NET. Эта
страница является стандартной и в ней содержится несколько тегов, в частности,
внешние HTML-теги, а также теги <head> и <body>:
<%@ Page Ianguuge="c#" Codebehind="Default.aspx.cs" AutoEventWireup="false"
Inherits=PollW.WebForml" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
<HEAD>
. ; > ; / : <meta name = "GENERATOR" Content="Microsoft Visual Studio 7.0">
</HEAD>
<BODY> • .
<form id="Default" method-"post" runat=nserver">
•• , .::. ••• .' V •' :• . j '• :' v' . < / f o r m > . ' " : , • . ' ' ' , .' • . • " ' ' ' • ' ' : •' : •• . " .. • • '
</BODY>
</HTML>
Обратите внимание на то, что в код также включен тег серверной формы
(<form runat="server•>). Первое, что нужно сделать,— удалить его; это послужит
напоминанием того, что нами не используются формы на стороне сервера. В то же
время мы включим пару управляющих элементов Label на стороне сервера; это
будет сделано в том месте, где происходит вывод вопроса для опроса и перечня
возможных ответов:
<%@ Page 1апдиаде=ис#" Codebehind="Default.aspx.сs" AutoEventWireup="false"
Inherits=PollW.WebForml" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 T r a n s i t i o n a l / / E N " >
<HTML> /
<HEAD>
<meta name ="GENERATOR" Content="Microsoft Visual Studio 7.0">
</HEAD>
<BODY>
<asp:Label id="QuestionLabel" runat="server"></asp:Label>
<asp:Label id="AnswerLabel" runat="server"></asp:Label>
</BODY>
</HTML>
Теперь есть чистая страница ASP.NET с управляющим элементом Label, куда
мы можем вывести наш вопрос. Под вопросом мы выведем возможные ответы, од-
нако вместо того, чтобы делать это непосредственно в .aspx-файле, мы использу-
ем ДЛЯ ЭТИХ целей файл С КОДОМ ПОДДерЖКИ — default, aspx. cs.
Здесь используется стандартный код, передаваемый Visual Studio.NET в файл
default.aspx.cs, который осуществляет основную обработку событий, а также
содержит стандартные методы для инициализации и загрузки страницы. Обратите
внимание на то, как Visual Studio.NET генерирует обработчик событий для метода
Page_init(); именно так объект Page вызывает метод Page_init{) после его со-
здания:
using Polling;
using System;
using System.Collections;
using System.ComponentModel; . :
: using System.Data; : : :
using System.Drawing; . : .
using Syset.Web;
using System.Web,SeesionState;
using System.Web.UI;
using System.Web.Ul.WebControls;
using SYstem.Web.UI.HtmlControls;
768 Практический пример
Namespace Pol1W ,
/// <summary> :
///Общее описание для WebForml.
///</summary >
public class webFormi : System.Web.UI.Page
{
public WebForm ()
§0A-:: . { ;'• •
Page Init += new System.EventHandler (Page_Init);
}
private void Page_Load (object sender, System.EventArgs e)
// Ввод кода пользователя для инициализации страницы
> ' ' :•• : •
private void Page_Init (object sender, EventArgs e)
{
• •'• ' : • • . • • : • . . . • • • : • : . • • • / / '... •'.[,' • " ; ; ^ ;•:. ; • ; V • , ' x : \ - •.' •. • - . : . ^ . ; ':•• , ' • : . .: ; ' " ' : ; ; : : ' - - :
// Генерация кода: Этот запрос требуется ASP.NET
//
InitializeComponent ();
•illlll Ь У : - ;. ;
#region Web Form Designer geenrated code
/// <summary>
/// Необходимый метод для поддержки Design - не модифицировать
/// содержание этого метода с помощью редактора кода.
/ ,:. ••',:": • .' . /// < / s u m m a r y > .', ;.;•••'' /_; .'.':': .''.,:-..' :'• '-:: / : .':'•• '•'•:-V-:;'-' :": ' У •
private void InitializeComponent ();
{
: .. . this load += new System.EventHandler (this.Page_Load) ;
Первое изменение, которое необходимо внести, заключается в добавлении объ-
явлений ДОЯ QuestionLabel И AnswerLabel, ЧТО ПОЗВОЛИТ ИСПОЛЬЗОВаТЬ ИХ ИЗ КОДа
поддержки страницы. Если вы используете Visual Studio.NET и переносили управ-
ляющие элементы Label мышью, а не добавляли их вручную, то все уже сделано
за вас. В самом верху класса WebForml, непосредственно перед конструктором
должны появиться следующие строки:
public class WebForml : System.Web.UI.Page :
{ , : . ^
protected System.Web.Ul.WebControls.Label QuestionLabel;
protected System.Web.Ul.WebControls.Label AnswerLabel;
Основное внимание мы уделим методу Page__Load (), который вызывается в тот
момент, когда страница запрашивается браузером. Внутрь этого метода мы помес-
тим код, отвечающий за вывод текста вопроса, и добавим управляющие элементы
HTML для каждого из возможных ответов. Давайте пройдем по данному методу
шаг за шагом и разберем новый код. Сначала мы создаем объект класса poll
и инициализируем его используя статический метод Current ():
private void Page__Load(object sender, System.EventArgs e)
{ :;• •
Poll aPoll = Poll.Current();
Практический пример 1 — web-caum для проведения опросов 769
Использование объекта Poll начинается в следующей строке; он используется
для выполнения присваивания значения свойству Text управляющего элемента
Label (QuestionLabel):
QuestionLabel.Text = aPoll.Question;
Несколько последующих строк предназначаются для организации цикла, кото-
рый проходит по всем возможным ответам и выводит для каждого из них некото-
рый HTML. Обратите внимание на то, что для задания числа повторений цикла
for используется свойство Poii.AnswerCount. Мы также создаем строковую пере-
менную, в которой будет храниться создаваемый нами HTML, и вставляем в нее
два тега, ответственных за переход на новую строку:
string HtmlLink = "<br /xbr />*'•;
for(int i=l;i<=aPoll.AnswerCount;i
Для каждого из ответов требуется вывести текстовую ссылку с текстом "Vote"
("Голосую за"), а также текст самого ответа. Нужно внимательно следить за тем,
чтобы ссылка действительно указывала на vote.aspx, а в значение URL включа-
лось число, которое соответствует номеру выбранного ответа (например, при вы-
боре ответа "С#" — это 1). HTML-код будет выглядеть следующим образом:
<а href="vote.aspx?id=l">Vote</a>&nbsp;C#<br />
Обратите также внимание на использование в конце строки тега <br />, кото-
рый отвечает за то, чтобы каждый ответ на экране располагался на отдельной
строке. Для того чтобы более аккуратно отформатировать вывод, можно бы вос-
пользоваться таблицей, но пока мы не будем ничего усложнять.
Запись *&nbsp; * расшифровывается как non-breaking space (неудаляемый про-
бел). Она заставляет браузер вставить пробел между текстом "Vote" и текстом
самого ответа (например, С#), т. е. эти две записи при выводе будут разделены
строго одним пробелом. Для создания соответствующего HTML-кода нужно исполь-
зовать некоторую строку (с именем HtmlLink), а также переменную i и свойство
с массивом Answers объекта Poll, для того чтобы вставить значение id и текст
ответа. Код разбивается на две строки, поэтому он умещается на экране (обычно,
если создаваемая текстовая строка занимает несколько строк на экране, следует
воспользоваться классом StringBuilder):
HtmlLink += *<а href=\*vote.aspx?id=h +i +l! \ ">Vote</a>" ;
HtmlLink += "&nbsp;" + aPollAnswers [i] + *<br />"-,
Теперь есть строковая переменная — HtmlLink, которая содержит HTML-код
для одного из ответов. Далее следует перейти к очередной итерации цикла и доба-
вить HTML-текст для следующего ответа, а потом присвоить текст второму управ-
ляющему элементу Label с помощью HTML-кода:
• } '
AnswerLabel.Text = HtmlLink; I
}
Если теперь загрузить default.aspx в браузер, то можно увидеть созданный
нами опрос, с выведенным в самом верху вопросом, под которым располагается
перечень ответов (но не забудьте, что ссылки Vote пока не работают).
Теперь нужно перейти к странице vote.aspx. Для ее создания VS следует вос-
пользоваться пунктом Add Web Form меню Project в Visual Studio.NET. Убедившись,
770 Практический пример
Web Service Class
Component Ddta Form Data Set
Class Wizard
Web User HTML Page Ftemeset
£«•«#»
Open Help
что в окне диалога выбран пункт Web
Form, введем vote.aspx в поле Name
(см. рис. слева).
Visual Studio.NET сгенерирует оба
файла—vote.aspx И vote.aspx.cs
(файл с кодом поддержки), а также
откроет файл vote.aspx для редакти-
рования. Файл vote.aspx практически
идентичен default.aspx; он представ-
ляет собой чистую страницу, содер-
жащую управляющий элемент Label,
в который будет помещен текст,
представляющий данную страницу.
Обратите внимание на то, что теги
форм серверной стороны были удале-
ны вручную за ненадобностью:
<%@ Page language""c#" Codebehind="vote.aspx.cs" AutoEventWireup="false"
Inherits=PollW.vote" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN» >
<HTML>
<HEAD>
<meta name =иGENERATOR" Content^"Microsoft Visual Studio 7.0">
<meta name = "CODELJJANGUAGE" Content="C#!l>
<meta name = "vs__defaultClientScript" content="JavaScript (ECMAScript)">
<meta name ="vs_targetSchema11
content="http://schemas.microsoft.com/intellisense/ie5- •>•
</KSAD> • • ':: ••• : '
<BODY>
<asp:Label id=lltitleLabelH runat="server"></asp:Label>
<br />
<br />
<asp: Panel id=Hresul.tsPaneln runat=" server "></asp:Panel>
</BODY>
</HTML>
Точно так же, как и для default.aspx, необходимо добавить для управляющих
элементов следующие объявления:
public class vote : Systern.Web,UI.Page
{ ''
protected System,Web.Ul.WebControls.Label titleLabel;
protected System.Web.UI.WebControls.Panel resultsPanel;
Теперь следует приступить к рассмотрению метода Page_Load(). Он должен
вставить название страницы, которая будет выполнять повторный просмотр вопро-
са текущего опроса, а затем выводить все ответы с указанием числа голосов, кото-
рые удалось собрать каждому из них. Сначала мы создаем экземпляр объекта Poll
посредством метода Current о , в результате чего получается объект, в котором со-
держатся данные, касающиеся активного в настоящий момент опроса, взятые из
XML-файла:
private void Page__Load (object sender, System. E vent Args e)
Poll aPoll = Poll.Current(};
Практический пример 1 — web-сайт для проведения опросов 771
В следующей строке мы используем объект Request класса Page (от которого
наследуется данная страница) и с помощью семейства Querystring получаем до-
ступ к параметрам, хранящимся в 4URL в строке запроса:
string parameter = Request.QueryString["id"];
Далее нужно произвести проверку того, не равно ли значение id нулю. Если
это значение не нуль, то следует делать попытку зарегистрировать поданный голос;
после чего в любом случае перейти к выводу на экран текущих результатов опро-
са. Обратите внимание на то, как мы опять используем метод Parse о класса int
для преобразования строки в целое значение. Этот метод завершится неудачей,
если ему будет передана строка, которая не может быть преобразована в целое
значение, однако в данном случае уровень контроля за тем, что именно передается
странице, очень высок, поэтому едва ли имеет смысл пытаться перехватывать та-
кую ошибку:
; if (parameter != null)
{
aPoll.Vote(int.Parse(parameter));
} ' •
В следующей строке программы осуществляется присваивание свойства Text
управляющему элементу Label для осуществления перехода к странице, где содер-
жится вводный текст данной страницы, в котором вопрос задается повторно. Об-
ратите внимание на то, как в строке используются обратные слэши (*V)> чтобы
включить в состав текста символы "кавычки" "":
titleLabel.Text = "Votes for \"n + aPoll.Question + "\n";
Оставшаяся в методе Page_Load() часть кода предназначается для вывода на
экран результатов опроса, при этом каждый из вариантов ответа выводится на
своем обычном месте, а рядом с ним выводится число голосов, которое он собрал.
Сначала в нем создается экземпляр объекта Table (который представляет собой
HTML-таблицу с результатами голосования), затем используется цикл for, в кото-
ром просматриваются все ответы, а в качестве ограничителя используется значе-
ние свойства AnswerCount:
Table myTable = new Table О ;
for(int i=l;i<=aPoll.AnswerCount;i++)
{ •-:•:.- • •
После этого следует свести воедино HTML-таблицу (с помощью myTable) и ин-
формацию, хранящуюся в объекта aPoll. Мы создаем новую строку и добавляем
ее в таблицу:
TableRow myTableRow = new TableRowO ;
myTable«Controls.Add(myRow);
Затем нужно создать новую ячейку таблицы, в которой свойство Text будет со-
держать результат опроса, и добавить эту ячейку в таблицу:
TableCell iayAnswer-Cell - new TableCell()?
myAnswerCell.Text = aPoll.Answers[i]; ,:
V myRow.Controls.Add(myAnswerCell);
После следует осуществить те же действия для счетчика голосов, для чего со-
здать новую ячейку таблицы, присвоить ее свойству Text значение счетчика голо-
сов (присоединяя в конец строки текст -votes*), и добавляя эту ячейку в строку
таблицы:
772 Практический пример
TableCell myVotesCell = new TableCelK) ;
myVotesCell.Text = aPoll.Votes [i] .ToStringO + H votes"
myRow.Controls.Add(myVotesCell);
Голосование по вопросу "Какой язык программирования
вы, в основном, используете?'*
С# 15 голосов
О+ 2 голоса
Java 35 голосов
JavaScript 12 голосов
Visual Basic 42 полоса
После завершения цикла таблица добавля-
ется в семейство управляющих элементов, хра-
нящихся в серверном управляющем элементе
resuitsPanei, следующим образом:
resultsPanel.Controls.Add(myTable);
В результат этой операции проиллюстриро-
ван на рисунке слева.
Оценка версии 1
На настоящий момент мы являемся обладателями небольшого трехзвенного
приложения, которое собирает ответы, полученные при проведении опроса, при
этом мьГимеем возможность обращаться к бизнес-объекту как из приложения
ASP.NET, так и из консольного приложения. Наше приложение реализовано толь-
ко в самых общих чертах, и поэтому представляется важным понимать присущие
ему ограничения:
• Многократное голосование. Это, вероятно, является одним из самых
существенных недостатков; каждый может зайти на сайт и многократно
голосовать, отвечая на один и тот же вопрос опроса. Если результаты
опроса являются значимыми для какой-либо третьей стороны, то вряд ли
ее представители смогут устоять перед искушением добавить пару-тройку
лишних голосов к тому или иному ответу.
• Возможность повторного использования. Хотя разработанная программа
является самодостаточной, и при попытке ее повторного использования
не должно возникать никаких трудностей, ее интерфейс оказывается
распределенным между двумя файлами — с расширениями .aspx и ,cs
(файл с кодом поддержки). Каждый раз, когда возникает необходимость
включить новый опрос, приходится объединять эти два файла
с .aspx-файлом и .cs-файлом страницы, на которой предполагается
проведение этого опроса. Было бы желательно иметь более простой
способ включения опроса в страницу, и в ASP.NET такая возможность
предусмотрена.
• Редактирование опроса. Несмотря на то, что XML-файл обладает весьма
простой структурой, всегда существует определенная вероятность того,
что в какой-то момент человек, занимающийся его редактированием,
забудет какой-либо жизненно важный символ, и в выводе web-сайта
начнут появляться ошибки. Справиться с такой ситуацией можно
несколькими способами. Можно изящно обойти такую проблему и вывести
сообщение типа "Извините, данный опрос в настоящий момент недоступен".
Но более правильным решением будет предоставление менеджеру
сайта интерфейса, с помощью которого он сможет выполнять
редактирование опроса. Такой интерфейс мог бы быть реализован
Практический пример 1 — web-caum для проведения опросов 773
с помощью целого ряда технологий, однако наиболее подходящими
представляются либо ASP.NET (web-интерфейс, предназначенный
для редактирования опроса), либо интерфейс Windows Forms.
• Слежение за ходом опроса. В том виде приложения, в котором оно
существует на данный момент, не предусмотрено никакого простого
способа, с помощью которого менеджер сайта мог бы ознакомиться
с текущим состоянием опроса. Если собираемые данные представляют
определенную важность, то было бы полезно иметь возможность
наблюдать за распределением голосов в режиме реального времени.
Для решения этой проблемы целесообразно создать дополнительный
управляющий интерфейс. Такой интерфейс можно построить
с использованием ASP.NET или — в качестве варианта — расширить
уровень представления и создать интерфейс Windows Forms.
• Управление данными. Поскольку все данные хранятся в XML-файле,
необходимо иметь возможность контролировать состояние этого файла.
Поэтому при дублировании web-сервера XML-файл также должен
дублироваться. Хотя выполнить это совсем несложно, дублирование
требует дополнительных административных усилий, направленных
на сопровождение web-сайта, особенно если часть данных хранится
в других местах (например, в БД или в каких-либо других файлах).
Серьезные проблемы возникают также, если когда-либо в будущем
встанет задача расширить web-сайт, с тем чтобы он мог выполняться
более, чем на одном сервере; в этом случае можно было бы хранить
файл с данными на одном сервере, к которому имеют доступ оба
web-сервера, однако это простая проблема быстро становится сложнее,
чем в идеальном случае. Поэтому, если принимать во внимание
все проблемы, связанные с сопровождением, может оказаться
целесообразным сложить все яйца в одну корзину и воспользоваться
централизованным хранением всех данных в одной базе данных,
вместо того чтобы хранить их в XML-файле.
• Повторяющийся код. В методе Current () есть участок кода, отвечающий
за загрузку XML-файла в объект DataSet; это код затем дублируется
в методе vote (). В реальной программе такой участок кода должен быть
оформлен в виде отдельного частного метода, которым смогут пользоваться
И метод Current (), И метод Vote () ДЛЯ получения объекта DataSet
из XML-файла. Избегайте повторяющихся участков кода любой ценой —
и ваша жизнь как программиста станет существенно проще.
• Множественные опросы. Данная модель предназначена для проведения
только одного опроса. В реальной ситуации можно предположить, что
каждый из опросов со временем будет заменяться на некоторый новый,
т. е. менеджеру сайта потребуется редактировать XML-файл для замены
опроса. При необходимости может быть поставлена задача сохранения
копии предыдущего опроса в архиве опросов. Объем ручного труда,
который потребуется для решения всех этих задач, оказывается
достаточно большим, и в реальной жизни потребуется усовершенствовать
модель, чтобы все опросы автоматически заносились в архив
в используемом хранилище данных, а у менеджера web-сайта имелся
в распоряжении интерфейс, позволяющий ему добавлять новые опросы.
При наличии нескольких опросов возникает также необходимость
устанавливать, какой из них является в настоящий момент активным.
774 Практический пример
• Одновременное обращение. Для хранения данных опроса используется
единственный XML-файл, и в этом случае возникает возможность того,
что определенная часть голосов не будет зарегистрирована, поскольку
некоторые попытки осуществить доступ к файлу могут производиться
в момент регистрации другого голоса. Маловероятно, что такая проблема
возникнет для сайта с низкой интенсивностью посещений, но, если
придется регистрировать большое количество голосов, может потребоваться
внести соответствующие изменения, которые позволят справляться
' с высокой интенсивностью голосования. Наиболее логичным способом
решения этой проблемы является переход на использование сервера БД,
например SQL Server или Oracle, устойчивых к одновременным
обращениям такого рода.
• Внешний вид. Для обеих страниц опроса — default.aspx
и vote.aspx — не разработано никакого внешнего представления.
Для любого web-сайта необходимо прорабатывать внешний вид.
В данном примере первостепенное внимание уделяется процессу
разработки и используемым для этого технологиям, поэтому придание
web-сайту надлежащего внешнего вида мы оставляем полностью
на ваше усмотрение!
• Обработка ошибок. В существующем на настоящий момент виде данное
приложение обладает определенными функциональными возможностями,
однако в нем предусмотрены только самые основные возможности
обработки ошибок. Проблема заключается в том, что если происходит
что-либо непредвиденное, то приложение генерирует сообщения
об ошибках, которые совершенно не следует выводить пользователям.
Например, если XML-файл оказывается недоступен, то возникает
исключительная ситуация. Прежде чем приложение может быть
передано для коммерческого использования, оно должно быть расширено,
чтобы защищать себя и пользователей от возможных проблем.
Теперь, когда у нас имеется представление о некоторых из тех областей, в ко-
торых мы можем усовершенствовать и улучшить приложение для проведения
опросов, давайте приступим к созданию второй версии, в которую будут включены
некоторые дополнительные функциональные возможности и преодолены два из
перечисленных выше ограничений. Мы рассмотрим только две проблемы из пере-
. численных, однако и об остальных проблемах не следует забывать, если вы когда-
либо соберетесь создавать аналогичную систему проведения опросов.
Версия 2
Программы не создаются, они вырастают. По мере того как ведется работа
с некоторой версией какого-либо ПО, постоянно возникают планы по расширению
и изменению этого программного обеспечения. Существует целый ряд усовершен-
ствований, которые могут быть внесены в наше приложение. Во второй версии мы
собираемся решить проблему двух ограничений и продолжить совершенствование
уже созданного кода, уделяя пристальное внимание тому, куда вносятся изменения,
в частности, касается ли это уровня представления, уровня бизнес-логики или
уровня данных.
Практический пример 1 - юеЪ-сайт для проведения опросов
Дополнительные требования
Ниже представлены требования ко второй версии web-сайта для проведения
опросов, которыми мы будем руководствоваться:
• Инструмент для просмотра результатов опроса. Менеджеру сайта
необходима некоторая утилита, которую он мог бы запускать на своей
рабочей машине и которая позволяла бы непрерывно выводить текущее
состояние счетчиков голосов. Это приложение должно быть приложением
Windows и устанавливать соединение с web-сайтом посредством TCP/IP.
Этот инструмент должен выводить вопрос, все ответы, счетчик голосов
для каждого из ответов и его долю в процентном отношении, а также
суммарное количество голосов.
• Один человек — один голос. Посетители сайта должны иметь
возможность проголосовать только один раз по каждому опросу.
• Управляющий элемент для проведения опросов. Должна быть
предусмотрена возможность несложного добавления опроса на любую
страницу ASP.NET просто за счет обеспечения доступа к бизнес-объекту
и добавления в .aspx-файл нескольких простых операторов.
Инструнент для просмотра результатов опроса
Интерфейс
Из трех новых требований к приложению для начала выбираем самое большое.
Оно предполагает создание настольного приложения Windows, построенного с ис-
пользованием Windows Forms. К нему не предъявляется никаких особых требова-
ний в смысле вывода информации об опросе, хотя представляется разумным
предположить, что это будет происходить в рамках одной формы.
Модель, которой мы собираемся воспользоваться, состоит из нескольких над-
писей, располагающихся вверху, в которых содержится вопрос и суммарное коли-
чество проголосовавших. Под указанными надписями располагается группа строк,
в каждой из которых содержится текст ответа и количество набранных голосов
(вместе с процентным отношением),
а также линейка, представляющая
счетчик количества голосов в графиче-
ском режиме (см. рис. слева).
Все очень просто, за исключением
одной маленькой загвоздки, которая
заключается в том, что на момент раз-
работки формы нам не известно общее
Doyouthmk&iciosoffc.NET will succeedhtheт&Ы?
Y e s 1040 (52^j
No 398 (2G^j 1
Not sure • E i i i i
Poll Results Too!
бы воспользоваться окном со списком
либо каким-либо другим управляющим
элементом, который в состоянии дина-
мически изменять свои размеры, однако
для того чтобы наш инструмент выгля-
дел красиво, а также для того, чтобы
продемонстрировать некоторые воз-
можности Windows Forms, мы будем
формировать каждую строку данных в
динамическом режиме (см. рис. справа).
количество голосующих. Можно было
What development language do you primarily use
Total vote*: 108
JavaScnpt
Visual Bbuz
776 Практический пример
< &Ш
Это означает, что если в опросе оказывается большее количество ответов, то
будет выведено большее количество строк и для их вывода форма изменит свои
размеры.
Web-служба для проведения опроса
Для реального сценария использования данного приложения представляется
маловероятным, чтобы инструмент для просмотра результатов использовался на
той же машине, на которой находится web-сайт. Напротив, с уверенностью можно
утверждать, что он будет располагаться на другой машине, однако мы предполага-
ем, что соединение между этими двумя машинами поддерживает TCP/IP. Для того
чтобы объекты могли взаимодействовать по каналу TCP/IP с использованием
HTTP (что обычно предполагает работу в Интернете, поскольку интранет-прило-
жения обычно используют работу с удаленными объектами), следует воспользо-
ваться web-службами. Web-службы — это способ производить удаленные вызовы
по различным сетям, включая Интернет, а также использовать SOAP- и XML-
стандарты для управления соединением. При использовании .NET, в особенности
Visual Studio.NET, реализовать web-службу не составляет никакого труда. При
этом многое из происходящего будет скрыто от наших глаз, но само построение
web-службы оказывается относительно простым.
Первое, что мы собираемся сделать,— это создать web-службу для проведения
опросов; она будет создана в приложении ASP.NET PollW, поскольку обращения
к этой web-службе будут происходить из страниц нашего web-сайта. В web-службе
будут предусмотрены три web-метода, доступ к которым может осуществляться
через Интернет:
• Answers (). Возвращает массив строк, в котором содержится
текст всех ответов.
• votes (). Возвращает массив целых, в котором содержатся
счетчики голосов для каждого из ответов.
• QuestionO. Возвращает строку, содержащую вопрос текущего опроса.
Теоретически можно сделать эти методы доступными через web, описав их
в классе Poll, однако, чтобы не смешивать методы, доступ к которым осуществля-
ется через Интернет, с нашим бизнес-объектом, мы создадим новый класс, где бу-
дут находиться эти web-методы, которые, в свою очередь, используют методы,
описанные в уже существующем классе Poll. В подходе, обеспечивающем полный
контроль над интерфейсом web-служб, ко-
торый не зависит от бизнес-логики класса
более низкого уровня, имеются определен-
ные преимущества.
Все, что требуется для создания Web-
службы в Visual Studio.NET,— это восполь-
зоваться пунктом Add Web Service меню
Project, позволяющим добавить web-службу
в проект Poiiw (web-приложение). Далее
следует ввести имя файла web-службы; это
та страница, которая будет предоставлять
наши методы. Web-службами используются
файлы с расширением .asmx, хотя их струк-
тура и содержание почти не отличаются от
файлов с расширением .aspx (см. рис. слева).
•<*t
'HI
Web Fern
Class
Практический пример 1 — web-сайт для проведения опросов 777
После того создания файла с расширением .asmx можно обнаружить, что кро-
ме него создан еще один файл results.asmx.cs с кодом поддержки. Именно
в нем будет храниться код, реализующий web-методы. Если вы прокрутите файл
results.asmx.cs вниз, то ближе к его концу вы обнаружите образец web-метода
с комментариями:
// ОБРАЗЕЦ WEB-СЛУЖБЫ
// Образец службы HelloWorldO осуществляет возврат строки Hello World
// Для создания web-службы уберите знаки комментария из следующих строк,
// затем сохраните проект и постройте его
//Для тестирования web-службы нажмите F5 :
. ; - • , . . • ' : ;. / / .• ; •••:• . . ' • • •. ••• . • . • • '• . . - : • • • • • • : • . ; ' . ;. ' ' . '
// [Webmethod]
// public string HelloWorldO
// {
// return "Hello World";
// }
Из приведенного выше примера видно, что все, что требуется для создания
web-метода,— это включить атрибут "[webmethod]" непосредственно перед описа-
нием самого метода. Далее приводится код web-метода Question*):
[Webmethod {Description^11 Return the poll question")]
/ описание: возвращает вопрос опроса /
public string Question{)
{
Poll aPoll = Poll.Current () ;
return aPoll.Question;
}
Обратите внимание на то, что атрибуту [webmethod] передается некоторый па-
раметр, в котором содержится краткое описание web-метода. В теле самого метода
используется класс Poll точно таким же образом, каким он использовался в на-
шем консольном приложении и в web-приложении. Он создает экземпляр объекта
Класса Poll С ПОМОЩЬЮ метода Current () И возвращает Значение СВОЙСТВа Question.
Весь код, необходимый для реализации возможности обращения к этому методу
через Интернет, скрыт от нас.
Web-методы для счетчиков голосов и для ответов абсолютно аналогичны:
[Webmethod<Description=JIReturn the results for the poll")]
. , .. . / описание: возвращает результаты проведения опроса /
public int[] VotesO
{ •
Poll aPoll = Poll.Current();
return aPoll.Votes;
• : : [ y [ : - У : ; У : ; : ' • Г У ' : . , : . - • - ' : • ; . ; ' . ; / • . • Y • ' ; . • . • : : • • • • : • . • • . • . • • • , ; , • • • . . . • • • ; : • : • . . • , , . • . • . . • . • • . • . • • ; • • • • . • . : . ; • . . : • ; • • . . у Ш \;.-. • .. • . : - , • • • . . , ; . . . • . ; . . ' • . • • • •
[Webmethod(Description^1 Return the answers in the poll") ]
• / описание: возвращает возможные ответы опроса /
public string[] Answers() :
v Poll aPoll = Poll.Current();
return aPoll.Answers;
> . Ш Н Ш 1 ш ш Ш • : • I • ' W-
Для каждого из методов мы включили краткое описание; все эти методы исполь-
зуют класс Poll для предоставления требуемых данных. Именно в этом заключает-
ся все изящество централизованных бизнес-объектов; создав объекты, обладающие
основными функциональными возможностями, мы затем можем легко использо-
вать их в различных местах.
778 Практический пример
' - ... ' . . . . . Г . : .4 :
- - • •
m p » ( H t » < > . f m « f o
T h i s w e f e s e r v i c e H M s i o Q W t p : / / t e t « m w H . o f 4 3 / a s I t s d e f a u l t n
Recommendation: Chinee the default памтрайв b«jfftrt* the e b s e r v i c e I s m a d e p u b l i c .
Остальная часть страницы содержит
рекомендации, каким образом следует
сконфигурировать web-службу, перед
тем, как передать ее для коммерческого
использования. Если выбрать web-метод
Question, то можно увидеть страницу
(см. рис. справа) с информацией о вы-
бранном web-методе и о том, как его
следует использовать.
На странице web-метода Question
расположена кнопка с текстом invoke
(вызов), которая может быть использо-
вана для тестирования web-службы.
Если щелкнуть на кнопке, то можно бу-
дет увидеть выходной поток web-метода
QuestionO, представленный на рисунке
в виде SOAP/XML:
ЕСЛИ теперь Открыть файл results.asmx
в браузере через HTTP, то можно увидеть
то, что изображено на рисунке слева. Обра-
тите внимание на то, что при перечислении
всех методов указывается не только его
имя, но и краткое описание. Эта информа-
ция существенно облегчает понимание того,
какие действия выполняет каждый из web-
методов.
Эта страница в удобном для чтения виде
автоматически генерируется системой .NET
и позволяет проверить работу web-службы.
На ней отображаются все три web-метода.
**8*Л ^ ^ . ,0 2} $ Q-PCM^S* 4**en _IjF.v.^«
Results
Click fcecE fo^1» complete l«t of о^еслйол*.
! Question
Reiwm the poll question
Test
To lest, dick the 'InvakQ' button.
SOAP
With actual values.
POST / S № l l v / c e : s u i r , 3 . i i : ; } - 7w H T T P / l . i
H o s t : l c c c » i h O 3 t ' .. • ,. ' ' . . . • :
C6»tr?riv- 'Гу|:.:_: ic.y.r,/y.i.«l; tnftS»et"4CJ-0
OrL-ri. -I.-/rr.j";ht Icnrjth
older* *KUV
. в
i
•f-iSS'loci^rW* ^
3 й lwlies -.ii

<string K m l n s ^ S ! h t t p : / / t e i n p u n \ o r g / l'>What d e v e l o p m e n t l a n g u a g e do y o u p r i m a r i l y use?</stnng>
;:Г
Заметьте, насколько проста строка URL, позволяющая обратиться к этому ме-
тоду, а также на то, что результат работы метода — вопрос нашего опроса — воз-
вращается в виде простого XML-документа.
В выходном потоке web-метода votes о мы увидим нечто похожее (см. рис. на
стр. 779, верхний), но здесь стоит обратить внимание на то, как просто .NET
и web-служба работают с массивом целых значений. Объем работы, выполняемый
.NET за кулисами, огромен, однако нам нет никакой необходимости знать о нем
что-либо, что позволяет нам выполнять свою работу намного более эффективно.
Практический пример 1 — web-сайт, для проведения опросов 779
: : •> - . •
51* &Й v;«w rgvctRes Tods :1*?? ; Address J
id Й
- < in t > 0
<№t>16
encoding»*utf-8" ?>
p://vvwvv-vv3
.w3.org/2001/XMLSchema" K
<int>34</int>
<int>12</int>
<int>44</int>
</ArrayOflnt>
] Done
zl
• J ;- л * is!
Project T
*LJl Visual C^" Proj.-jc^-
LJ Setup and Deptoyment Projects
• ;.„_Л Other Projects
Приложение Windows
Создать web-методы и организовать доступ к ним посредством HTTP оказыва-
ется очень легко, но возникает вопрос: каким образом web-методы могут быть ис-
пользованы? Как можно преобразовать получаемый XML во что-либо полезное?
Нам не придется этим заниматься, за нас это все также сделает система .NET.
Мы обладаем функционирующей
web-службой, у которой имеются
web-методы, обеспечивающие до-
ступ к данным опроса. Теперь пере-
ключим' внимание на приложение
Windows Forms. Мы воспользуемся
пунктом Add Project меню File, за-
тем выберем Windows Application
и введем имя PoiiD (сокращение от
названия приложения Poll Desktop),
как показано на рисунке справа.
В результате Visual Studio.NET
СОЗДаСТ ОДИН файл Forml.cs С ОПИ-
санием класса и откроет форму в
окне разработки, в котором можно
непосредственно производить ре-
дактирование. Хотя мы планируем
ASP.MET Web ASP.NET Web Web Cootf<
Service library
vah a V 'i
zl
ШжС^х
I OK I Cancoi J Help
J Total votes: •• DO
L ;
• о
создавать большую часть управляющих
элементов формы посредством исполь-
зования кода, три расположенных в са-
мом верху управляющих элемента можно
включить, воспользовавшись окн
Категория: информатика | Просмотров: 1149 | Добавил: basic | Рейтинг: 0.0/0
Всего комментариев: 0
Имя *:
Email *:
Код *:
Календарь
«  Февраль 2010  »
ПнВтСрЧтПтСбВс
1234567
891011121314
15161718192021
22232425262728
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0

krutoto.ucoz.ru
Бесплатный конструктор сайтов - uCoz