Веб-разработка 101: Часть 5, Использование данных (окончание)


23.12.2011

Примечание автора: Для данной статьи пришлось сделать 17 иллюстраций, так что урок получился просто чудовищно длинным. При сохранении на одной странице всей статьи целиком она загружается весьма неторопливо, а поиск нужного материала требует усилий. К сожалению, разбить материал на более мелкие уроки не получается возможным – темы довольно объёмны и требуют соответствующего освещения. В первой половине этого урока мы уделили основное внимание системным настройкам WebMatrix и могло создаться впечатление, что это простой продукт для тех, кто только «тыкает кнопочки». Однако в окончании статьи я намерен развеять это заблуждение и привести несколько примеров кода, который может понадобиться при работе с данными.

Создание страницы, которая использует данные.

В предыдущей статье вы видели, что ваш сайт использует слой, чтобы создать HTML <head>, стиль, тело и все остальное. Если вы прочитаете дальше, то столкнетесь с уже установленными _siteLayout.cshtml и _PageStart.cshtml. Если вы не сделаете этого, то остальная часть этого кода не заработает, и вам необходимо будет вернуться к статье 3.

Хорошо бы использовать слои.Теперь вы должны написать определенный код для определенной страницы, используя @RenderBody () (так называеется шаблон). Вставьте его во всю страницу.

С его помощью создайте новую страницу CSTHML и назовите ее datamovies.cshtml.

Замените весь код этой страницы на статический HTML, который использовали ранее:

<div id="movieslist"> <ol> <li><a href="#">It's a wonderful life</a></li>

<li><a href="#">Lord of the Rings</a></li> <li><a href="#">The Fourth World</a></li>

<li><a href="#">The Lion King</a></li> </ol> </div>

Когда вы повнимательнее его рассмотрите, то увидете <div>, который определяет список <ol>.

У статического списка есть 4 элемента. Если мы захотим добавить 5-ый элемент, мы добавляем новую запись в <li></li>.

При получении данных по запросу из базы данных страница не знает, сколько элементов находится в базе данных, таким образом, она должна произвести «n-элементов» в <li></li>, где «n» - число записей в базе данных. Это идеально для циклического выполнения кода, и через мгновение вы точно запишете этот цикл.

Но прежде, чем вы сделаете это, сначала давайте сообщим странице о базе данных. Вверху datamovies.cshtml введите следующий код:

@{ var db= Database.Open("Movies"); var sqlQ = "SELECT * FROM Favorites";

var data = db.Query(sqlQ); }

Вы, наверняка, помните символ «@» из последней статьи, который использовался, чтобы сообщить серверу, что следующий код, который необходимо выполнить, является кодом Razor. В этом случае у нас есть много строк кода, таким образом, вместо того, чтобы помещать перед каждым этот символ, мы можем использовать символ «{« и затем писать весь наш код, заканчивая блок кода символом «}».

Если программировали на Java, C++, C, или C#, то, вероятно, узнаете эти символы, которые называют «фигурными скобками».

Давайте разберем этот код построчно:

var db= Database.Open("Movies");

Достаточно задать тип «var» для переменной и это уже адресуемый элемент, содержащий данные. Данный код сообщает серверу, что необходимо открыть базу данных под названием «Фильмы», и сохранить ссылку на нее в переменной под названием «db».

var sqlQ = "SELECT * FROM Favorites";

Данная строка кода создает sqlQ с типом var, и хранит SELECT * FROM.

При использовании баз данных язык под названием «Язык структурированных запросов» (SQL) обычно используется, чтобы найти данные, которые вы хотите. Фактически SQL используется не только для запросов данных,но и может использоваться, чтобы вставлять новые данные. С этим вы познакомитесь в следующей статье, а пока мы используем SQL для получения данных.

При получении данных из базы данных обычно используется команда «SELECT». Синтаксис: SELECT <что получить> FROM <откуда получить> WHERE <условие>

<Что получить> может быть списком полей или подстановочным знаком (*) - символ, который означает «все». Мы не установили условие, поэтому чтобы получить все столбцы и все записи из таблицы «Избранное» необходим следующий запрос: SELECT * FROM Favorites.

var data = db.Query(sqlQ);

Это рабочая лошадка страницы. Ранее вы открывали базу данных и использовали переменную «db», чтобы обратиться к ней. WebMatrix понимал, то, что вы открываете, является базой данных. У объекта базы данных в WebMatrix есть несколько функций (обычно их называют «методы»), с помощью которых вы можете обратиться к БД. Один из таких методов называется «Query», он выполняет команду SQL. Вы передаете эту команду, как строку, и база данных выполняет ее, возвращая ряд записей. Такой набор записей загружается в переменную, называемую «данные». Теперь, когда у нас есть данные, с их помощью мы можем создавать интересные вещи.

В данный момент ваша страница должна быть похожа на:

@{ var db= Database.Open("Movies"); var sqlQ = "SELECT * FROM Favorites";

var data = db.Query(sqlQ); } <div id="movieslist"> <ol>

<li><a href="#">It's a wonderful life</a></li> <li><a href="#">Lord of the Rings</a></li>

<li><a href="#">The Fourth World</a></li> <li><a href="#">The Lion King</a></li> </ol> </div>

Мы получили данные из базы данных, но мы ничего еще не сделали с ними. У нас все еще присутствует статический HTML-код на странице. Давайте изменим это.

Во-первых, удалите весь код, кроме одной части, включающую поля <li> так, чтобы <ol> стал похож на это:

<ol> <li><a href="#">It's a wonderful life</a></li> </ol>

Как вы помните, ранее, когда мы расказывали, что, если у нас есть n-ое количество полей в базе данных, то у нас должно быть n-ое количество записей в списке. Это достижимое использование цикла, которое позволяет написать цикл.

Используя «Razor», добавляете в свой код символ @, таким образом, цикл станет похож на:

<ol> @foreach(var row in data) { <li><a href="#">It's a wonderful life</a></li> } </ol>

Код говорит, что серверу необходимо считать число строк в данных и для каждой из них выписывать тег <li>.

Результат этого, конечно, «It’s a wonderful life», выписанный 4 раза, поскольку в моей базе данных 4 записи.

Веб-разработка 101: Часть 5, Использование данных

Сервер понимает, что ему говорят сделать, и код говорит ему выписывать название фильма для каждой строки в базе данных.

Давайте будем поумнее. То, что мы действительно хотим сделать для каждой строки в базе данных, это выписать имя фильма. Другими словами, замените текст «It’s a wonderful life» именем фильма в строке, на которой в настоящий момент остановился цикл.

Когда вы создавали базу данных, вы назвали столбец, который содержит имя фильма «Имя», и уже знаете, что текущую запись называют «строкой», таким образом, вы можете вывести строку значения. Столбец «Имя» будет содержать имя фильма.

Измените свой код на этот:

<ol> @foreach(var row in data) { <li><a href="#">@row.Name</a></li> } </ol>

Теперь вы сообщаете серверу, что для каждой строки в базе данных, необходимо выписать поле «Имя» из строки с элементом <li>. Давайте посмотрим, как это выглядит. Запустите свою страницу из файла datamovies.cshtml:

Веб-разработка 101: Часть 5, Использование данных

Вы увидите, что у нас опять есть все фильмы!

Теперь, когда страница стала динамической, и загруженные фильмы основаны на данных в базе, давайте добавим другой фильм к базе, и посмотрим, что произойдет.

Просто вернитесь к редактору базы данных, откройте таблицу «Избранное», и добавьте новую строку данных, как показано здесь:

Веб-разработка 101: Часть 5, Использование данных

Затем запустите свою страницу. Появится новый фильм в списке, не написанный в HTML.

Веб-разработка 101: Часть 5, Использование данных

Если вы писали код на встроенных языках, как это делали раньше, то, возможно, заметили, что WebMatrix находит контент, когда он помещен внутрь тегов <li>. Я не должен был писать @row.Name или что-либо подобное этому, так как пишу @row.Name в том месте, где необходимо. Это делает редактирование и поддержку файлов CSHTML намного легче, чем в таких языках, как PHP, где я использовал бы <?php echo(row.Name);>, или что-то подобное.

Это также позволяет мне легко смешивать динамический и статический контент. Например, если я изменяю код на этот:

<div id="movieslist"> <ol> @foreach(var row in data){

<li><a href="#">@row.Name, @row.Genre, @row.ReleaseYear</a></li> } </ol> </div>

Результат – это интеграция статического HTML-кода в динамический управляемый базой данных контент (поля), который похож на:

Веб-разработка 101: Часть 5, Использование данных

Вы создали свою первую управляемую данными динамическую веб-страницу. Лучше один раз увидеть, чем десять раз услышать!

Заключение

В этой статье вы взяли список фильмов, который создали до этого и превратили его в динамический управляемый данными веб-сайт. Вы создали SQL-серверную компактную базу данных с таблицей, которая содержит ваши любимые фильмы, и затем посмотрели, как написать код, чтобы найти фильмы в базе данных и выписать их описание HTML в браузере. Вместе с функционалом слоев из статьи 3, вы узнали, как создавать простую и полезную для продвижения бизнеса страницу CSHTML.

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

В следующей части вы узнаете, как создавать веб-страницу, которая позволит вашим пользователям добавлять данные к вашему сайту.

23 декабря 2011 г.

Здаойный А.В.


автоматы Вулкан Удачи

Веб-разработка 101: Часть 5, Использование данных (окончание)

<p style="text-align: justify; "><i>Примечание автора: Для данной статьи пришлось сделать 17 иллюстраций, так что урок получился просто чудовищно длинным. При сохранении на одной странице всей статьи целиком она загружается весьма неторопливо, а поиск нужного материала требует усилий. К сожалению, разбить материал на более мелкие уроки не получается возможным – темы довольно объёмны и требуют соответствующего освещения.</i> <i>В <a href="/information/veb_razrabotka_101_chast_5_ispolzovanie_dannykh_nachalo/" >первой половине этого урока</a> мы уделили основное внимание системным настройкам </i><i>WebMatrix и могло создаться впечатление, что это простой продукт для тех, кто только «тыкает кнопочки». Однако в окончании статьи я намерен развеять это заблуждение и привести несколько примеров кода, который может понадобиться при работе с данными.</i></p> <h2 style="text-align: center; ">Создание страницы, которая использует данные.</h2> <p style="text-align: justify; ">В предыдущей статье вы видели, что ваш сайт использует слой, чтобы создать HTML &lt;head&gt;, стиль, тело и все остальное. Если вы прочитаете дальше, то столкнетесь с уже установленными _siteLayout.cshtml и _PageStart.cshtml. Если вы не сделаете этого, то остальная часть этого кода не заработает, и вам необходимо будет вернуться к статье 3.</p> <p style="text-align: justify; ">Хорошо бы использовать слои.Теперь вы должны написать определенный код для определенной страницы, используя @RenderBody () (так называеется шаблон). Вставьте его во всю страницу.</p> <p style="text-align: justify; ">С его помощью создайте новую страницу CSTHML и назовите ее datamovies.cshtml.</p> <p style="text-align: justify; ">Замените весь код этой страницы на статический HTML, который использовали ранее:</p> <p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> &lt;div id=&quot;movieslist&quot;&gt; &lt;ol&gt; &lt;li&gt;&lt;a href=&quot;#&quot;&gt;It's a wonderful life&lt;/a&gt;&lt;/li&gt; </span></p> <p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> &lt;li&gt;&lt;a href=&quot;#&quot;&gt;Lord of the Rings&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href=&quot;#&quot;&gt;The Fourth World&lt;/a&gt;&lt;/li&gt; </span></p> <p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> &lt;li&gt;&lt;a href=&quot;#&quot;&gt;The Lion King&lt;/a&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; </span></p> <p style="text-align: justify; ">Когда вы повнимательнее его рассмотрите, то увидете &lt;div&gt;, который определяет список &lt;ol&gt;.</p> <p style="text-align: justify; ">У статического списка есть 4 элемента. Если мы захотим добавить 5-ый элемент, мы добавляем новую запись в &lt;li&gt;&lt;/li&gt;.</p> <p style="text-align: justify; ">При получении данных по запросу из базы данных страница не знает, сколько элементов находится в базе данных, таким образом, она должна произвести «n-элементов» в &lt;li&gt;&lt;/li&gt;, где «n» - число записей в базе данных. Это идеально для циклического выполнения кода, и через мгновение вы точно запишете этот цикл.</p> <p style="text-align: justify; ">Но прежде, чем вы сделаете это, сначала давайте сообщим странице о базе данных. Вверху datamovies.cshtml введите следующий код: </p> <p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> @{ var db= Database.Open(&quot;Movies&quot;); var sqlQ = &quot;SELECT * FROM Favorites&quot;; </span></p> <p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> var data = db.Query(sqlQ); } </span></p> <p style="text-align: justify; ">Вы, наверняка, помните символ «@» из последней статьи, который использовался, чтобы сообщить серверу, что следующий код, который необходимо выполнить, является кодом Razor. В этом случае у нас есть много строк кода, таким образом, вместо того, чтобы помещать перед каждым этот символ, мы можем использовать символ «{« и затем писать весь наш код, заканчивая блок кода символом «}».</p> <p style="text-align: justify; ">Если программировали на Java, C++, C, или C#, то, вероятно, узнаете эти символы, которые называют «фигурными скобками».</p> <p style="text-align: justify; ">Давайте разберем этот код построчно:</p> <p><span style="background-color: rgb(225, 225, 225); ">var db= Database.Open(&quot;Movies&quot;); </span></p> <p style="text-align: justify; ">Достаточно задать тип «var» для переменной и это уже адресуемый элемент, содержащий данные. Данный код сообщает серверу, что необходимо открыть базу данных под названием «Фильмы», и сохранить ссылку на нее в переменной под названием «db».</p> <p><span style="background-color: rgb(225, 225, 225); ">var sqlQ = &quot;SELECT * FROM Favorites&quot;; </span></p> <p style="text-align: justify; ">Данная строка кода создает sqlQ с типом var, и хранит SELECT * FROM.</p> <p style="text-align: justify; ">При использовании баз данных язык под названием «Язык структурированных запросов» (SQL) обычно используется, чтобы найти данные, которые вы хотите. Фактически SQL используется не только для запросов данных,но и может использоваться, чтобы вставлять новые данные. С этим вы познакомитесь в следующей статье, а пока мы используем SQL для получения данных.</p> <p style="text-align: justify; ">При получении данных из базы данных обычно используется команда «SELECT». Синтаксис: SELECT &lt;что получить&gt; FROM &lt;откуда получить&gt; WHERE &lt;условие&gt;</p> <p style="text-align: justify; ">&lt;Что получить&gt; может быть списком полей или подстановочным знаком (*) - символ, который означает «все». Мы не установили условие, поэтому чтобы получить все столбцы и все записи из таблицы «Избранное» необходим следующий запрос: SELECT * FROM Favorites.</p> <p><span style="background-color: rgb(225, 225, 225); ">var data = db.Query(sqlQ); </span></p> <p style="text-align: justify; ">Это рабочая лошадка страницы. Ранее вы открывали базу данных и использовали переменную «db», чтобы обратиться к ней. WebMatrix понимал, то, что вы открываете, является базой данных. У объекта базы данных в WebMatrix есть несколько функций (обычно их называют «методы»), с помощью которых вы можете обратиться к БД. Один из таких методов называется «Query», он выполняет команду SQL. Вы передаете эту команду, как строку, и база данных выполняет ее, возвращая ряд записей. Такой набор записей загружается в переменную, называемую «данные». Теперь, когда у нас есть данные, с их помощью мы можем создавать интересные вещи.</p> <p style="text-align: justify; ">В данный момент ваша страница должна быть похожа на:</p> <p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> @{ var db= Database.Open(&quot;Movies&quot;); var sqlQ = &quot;SELECT * FROM Favorites&quot;; </span></p> <p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> var data = db.Query(sqlQ); } &lt;div id=&quot;movieslist&quot;&gt; &lt;ol&gt; </span></p> <p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> &lt;li&gt;&lt;a href=&quot;#&quot;&gt;It's a wonderful life&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href=&quot;#&quot;&gt;Lord of the Rings&lt;/a&gt;&lt;/li&gt; </span></p> <p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> &lt;li&gt;&lt;a href=&quot;#&quot;&gt;The Fourth World&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href=&quot;#&quot;&gt;The Lion King&lt;/a&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; </span></p> <p style="text-align: justify; ">Мы получили данные из базы данных, но мы ничего еще не сделали с ними. У нас все еще присутствует статический HTML-код на странице. Давайте изменим это.</p> <p style="text-align: justify; ">Во-первых, удалите весь код, кроме одной части, включающую поля &lt;li&gt; так, чтобы &lt;ol&gt; стал похож на это:</p> <p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> &lt;ol&gt; &lt;li&gt;&lt;a href=&quot;#&quot;&gt;It's a wonderful life&lt;/a&gt;&lt;/li&gt; &lt;/ol&gt; </span></p> <p style="text-align: justify; ">Как вы помните, ранее, когда мы расказывали, что, если у нас есть n-ое количество полей в базе данных, то у нас должно быть n-ое количество записей в списке. Это достижимое использование цикла, которое позволяет написать цикл.</p> <p style="text-align: justify; ">Используя «Razor», добавляете в свой код символ @, таким образом, цикл станет похож на:</p> <p><span style="background-color: rgb(225, 225, 225); "> &lt;ol&gt; @foreach(var row in data) { &lt;li&gt;&lt;a href=&quot;#&quot;&gt;It's a wonderful life&lt;/a&gt;&lt;/li&gt; } &lt;/ol&gt; </span></p> <p style="text-align: justify; ">Код говорит, что серверу необходимо считать число строк в данных и для каждой из них выписывать тег &lt;li&gt;.</p> <p style="text-align: justify; ">Результат этого, конечно, «It’s a wonderful life», выписанный 4 раза, поскольку в моей базе данных 4 записи.</p> <p><img src="/upload/medialibrary/c02/c026e15a9a9b741e28aa2a2c4b3d4677.PNG" title="Веб-разработка 101: Часть 5, Использование данных" border="0" alt="Веб-разработка 101: Часть 5, Использование данных" width="700" height="403" /></p> <p style="text-align: justify; ">Сервер понимает, что ему говорят сделать, и код говорит ему выписывать название фильма для каждой строки в базе данных.</p> <p style="text-align: justify; ">Давайте будем поумнее. То, что мы действительно хотим сделать для каждой строки в базе данных, это выписать имя фильма. Другими словами, замените текст «It’s a wonderful life» именем фильма в строке, на которой в настоящий момент остановился цикл.</p> <p style="text-align: justify; ">Когда вы создавали базу данных, вы назвали столбец, который содержит имя фильма «Имя», и уже знаете, что текущую запись называют «строкой», таким образом, вы можете вывести строку значения. Столбец «Имя» будет содержать имя фильма.</p> <p style="text-align: justify; ">Измените свой код на этот:</p> <p><span style="background-color: rgb(225, 225, 225); "> &lt;ol&gt; @foreach(var row in data) { &lt;li&gt;&lt;a href=&quot;#&quot;&gt;@row.Name&lt;/a&gt;&lt;/li&gt; } &lt;/ol&gt; </span></p> <p style="text-align: justify; ">Теперь вы сообщаете серверу, что для каждой строки в базе данных, необходимо выписать поле «Имя» из строки с элементом &lt;li&gt;. Давайте посмотрим, как это выглядит. Запустите свою страницу из файла datamovies.cshtml:</p> <p><img src="/upload/medialibrary/7e2/7e2daea3f4382c3fc2feddd9b2ce163e.PNG" title="Веб-разработка 101: Часть 5, Использование данных" border="0" alt="Веб-разработка 101: Часть 5, Использование данных" width="700" height="403" /></p> <p style="text-align: justify; ">Вы увидите, что у нас опять есть все фильмы!</p> <p style="text-align: justify; ">Теперь, когда страница стала динамической, и загруженные фильмы основаны на данных в базе, давайте добавим другой фильм к базе, и посмотрим, что произойдет.</p> <p style="text-align: justify; ">Просто вернитесь к редактору базы данных, откройте таблицу «Избранное», и добавьте новую строку данных, как показано здесь:</p> <p><img src="/upload/medialibrary/227/227a84bd7f01b7af0baf121e2c936854.PNG" title="Веб-разработка 101: Часть 5, Использование данных" border="0" alt="Веб-разработка 101: Часть 5, Использование данных" width="469" height="236" /></p> <p style="text-align: justify; ">Затем запустите свою страницу. Появится новый фильм в списке, не написанный в HTML.</p> <p><img src="/upload/medialibrary/c9f/c9f823da8e34161df2662c041b8389e4.PNG" title="Веб-разработка 101: Часть 5, Использование данных" border="0" alt="Веб-разработка 101: Часть 5, Использование данных" width="700" height="403" /></p> <p style="text-align: justify; ">Если вы писали код на встроенных языках, как это делали раньше, то, возможно, заметили, что WebMatrix находит контент, когда он помещен внутрь тегов &lt;li&gt;. Я не должен был писать @row.Name или что-либо подобное этому, так как пишу @row.Name в том месте, где необходимо. Это делает редактирование и поддержку файлов CSHTML намного легче, чем в таких языках, как PHP, где я использовал бы &lt;?php echo(row.Name);&gt;, или что-то подобное.</p> <p style="text-align: justify; ">Это также позволяет мне легко смешивать динамический и статический контент. Например, если я изменяю код на этот:</p> <p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> &lt;div id=&quot;movieslist&quot;&gt; &lt;ol&gt; @foreach(var row in data){ </span></p> <p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> &lt;li&gt;&lt;a href=&quot;#&quot;&gt;@row.Name, @row.Genre, @row.ReleaseYear&lt;/a&gt;&lt;/li&gt; } &lt;/ol&gt; &lt;/div&gt; </span></p> <p style="text-align: justify; ">Результат – это интеграция статического HTML-кода в динамический управляемый базой данных контент (поля), который похож на:</p> <p><img src="/upload/medialibrary/154/1543fb69d4c7e241d57ff831b4362203.PNG" title="Веб-разработка 101: Часть 5, Использование данных" border="0" alt="Веб-разработка 101: Часть 5, Использование данных" width="700" height="403" /></p> <p style="text-align: justify; ">Вы создали свою первую управляемую данными динамическую веб-страницу. Лучше один раз увидеть, чем десять раз услышать!</p> <h2>Заключение</h2> <p style="text-align: justify; ">В этой статье вы взяли список фильмов, который создали до этого и превратили его в динамический управляемый данными веб-сайт. Вы создали SQL-серверную компактную базу данных с таблицей, которая содержит ваши любимые фильмы, и затем посмотрели, как написать код, чтобы найти фильмы в базе данных и выписать их описание HTML в браузере. Вместе с функционалом слоев из статьи 3, вы узнали, как создавать простую и полезную для продвижения бизнеса страницу CSHTML.</p> <p style="text-align: justify; ">В следующей статье вы сделаете следующий шаг и увидете, что происходит, если вы позволяете своим пользователям добавлять фильмы к базе данных, если у них нет доступа к исходному коду WebMatrix. Вы увидете, как создать веб-интерфейс, который позволяет пользователям использовать свой браузер, чтобы изменять детали и код, который вы написали, загрузить эти детали в базу данных. После чего сайт сразу необходимо обновить, чтобы просмотреть получившиеся изменения!</p> <p style="text-align: justify; ">В следующей части вы узнаете, как создавать веб-страницу, которая позволит вашим пользователям добавлять данные к вашему сайту.</p> <p> </p> <p> </p> <p> </p> <p style="text-align: right; ">23 декабря 2011 г.</p> <p style="text-align: right; ">Здаойный А.В.</p>

Возврат к списку

Яндекс.Метрика