ВУЗ: Нижегородский государственный технический университет
Категория: Решение задач
Дисциплина: Программирование
Добавлен: 15.02.2019
Просмотров: 374
Скачиваний: 7
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ
ВЫСШЕГО ОБРАЗОВАНИЯ
«НОВОСИБИРСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ»
Кафедра вычислительной техники
ОТЧЕТ
ПО ЛАБОРАТОРНОЙ РАБОТЕ №5
«CGI-скрипт»
ПО ДИСЦИПЛИНЕ «WEB-ПРОГРАММИРОВАНИЕ»
Факультет: АВТФ Преподаватель: Новицкая Ю.В.
Группа: АВТ-412
Студенты:
Евтушенко Никита Сергеевич
Лазаревич Михаил Михайлович
Новосибирск 2017г.
Цель работы:
Получить практические навыки в написании и отладке CGI-скрипта на языке программирования, имеющем средства для работы с интерфейсом CGI.
Задание:
Вариант 6:
Необходимо разработать CGI-скрипт, реализующий некоторый тест (проверка словарного запаса иностранного языка), и два счетчика выполнения теста — общий счетчик, значение которого хранится на серверной стороне, и счетчик конкретного посетителя, значение которого хранится на клиентской стороне в виде cookie.
Тест должен содержать не менее трех вопросов с не менее чем тремя вариантами ответа на каждый вопрос.
Данные, введенные пользователем, пересылаются на серверную сторону, обрабатываются CGI-скриптом, который «на лету» формирует документ с результатами прохождения теста и новыми значениями счетчиков прохождения теста.
CGI-скрипт следует написать так, чтобы он мог принимать данные, присланные как методом GET, так и методом POST.
Порядок выполнения лабораторной работы:
-
Для выполнения лабораторной работы установить и настроить web-сервер или воспользоваться программным комплексом Denwer (http://denwer.ru).
-
Создать html-документ с формой.
-
Написать CGI-скрипт в соответствии с заданным вариантом.
-
Протестировать созданный CGI-скрипт (при тестировании использовать методы передачи данных GET и POST).
html-разметка созданного документа:
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="utf-8" />
<title>Do you know English?</title>
<link rel="stylesheet" type="text/css" href="css/reset.css">
<link rel="stylesheet" type="text/css" href="css/main.css">
</head>
<body>
<div id="desk">
<h1 align="center">English test.</h1>
<form action=http://localhost/lab5/prog/Debug/prog.exe method=get>
<h3>I _____ a teacher.</h3>
<label><h3><input type="radio" name="question1" value="true" checked>am<Br></h3></label>
<label><h3><input type="radio" name="question1" value="false">are.<Br></h3></label>
<label><h3><input type="radio" name="question1" value="false">is<Br></h3></label>
<hr>
<h3>He _____ like basketball.</h3>
<label><h3><input type="radio" name="question2" value="false" checked>not<Br></h3></label>
<label><h3><input type="radio" name="question2" value="false">don't<Br></h3></label>
<label><h3><input type="radio" name="question2" value="true">doesn't<Br></h3></label>
<hr>
<h3>Переведите слово 'abrogate' на русский язык.</h3>
<label><h3><input type="radio" name="question3" value="false" checked>показывать слабость<Br></h3></label>
<label><h3><input type="radio" name="question3" value="true">отменять<Br></h3></label>
<label><h3><input type="radio" name="question3" value="false">ценить<Br></h3></label>
<h3><input type="submit" value="Let's do it!"></h3>
</form>
</div>
</body>
Документ сформированный CGI-скриптом:
#include "stdafx.h"
#include <fstream>
#include <iostream>
#include <string>
#include <stdlib.h>
int SaveServer() //Сохранение документа на стороне сервера.
{
std::string filename = "Hop_Servachok";
FILE *file = fopen(filename.c_str(), "rb+");
int counter = 1;
if (file == NULL)
{
file = fopen(filename.c_str(), "wb");
if (file == NULL)
{
return 0;
}
fwrite(&counter, sizeof(int), 1, file);
return counter;
}
fread(&counter, sizeof(int), 1, file);
fseek(file, 0, SEEK_SET);
counter++;
fwrite(&counter, sizeof(int), 1, file);
return counter;
}
int SaveCookie() //Сохранение документа на стороне клиента.
{
char *pt = getenv("HTTP_COOKIE");
int counter = 1;
if (pt)
{
std::string cookie = pt;
int k;
k = cookie.find("counter");
if (k >= 0)
{
k += 8;
std::string s = "";
while (k < cookie.length() && cookie[k] != ';'){
s.push_back(cookie[k]);
k++;
}
counter = stoi(s);
counter++;
}
}
std::cout << "Set-Cookie: counter=" << counter << ";\n";
return counter;
}
void main()
{
int result = 0; //Результат.
std::string s=""; //Строка.
int len = 0; //Длина строки.
int i = 0; //Номер символа.
int counter = SaveCookie();
std::cout << "Content-type: text/html\n\n";
std::string method = getenv("REQUEST_METHOD");
if (method[0] == 'G')
{
s = getenv("QUERY_STRING");
}
else
{
std::cin >> s;
}
len = s.length();
for (i = 0; s[i] != '='; i++) {}
if (s[i + 1] == 't') result++;
i++;
for (i; s[i] != '='; i++) {}
if (s[i + 1] == 't') result++;
i++;
for (i; s[i] != '='; i++) {}
if (s[i + 1] == 't') result++;
i++;
std::cout << "<!DOCTYPE html>" <<std::endl;
std::cout << "<html>" << std::endl;
std::cout << "<head>" << std::endl;
std::cout << "<title>Do you know English?</title>" << std::endl;
std::cout << "<link rel = \"stylesheet\" type = \"text/css\" href = \"css/reset.css\">" << std::endl;
std::cout << "<link rel = \"stylesheet\" type = \"text/css\" href = \"css/main.css\">" << std::endl;
std::cout << "</head>" << std::endl;
std::cout << "<body>" << std::endl;
std::cout << "<div id = \"desk\">" << std::endl;
std::cout << "<h1>Your result: " << result << "/3!</h1>" << std::endl;
std::cout << "<h1>Total Users: " << SaveServer() << ".</h1>" << std::endl;
std::cout << "<h1>Number of Passages: " << counter << ".</h1>" << std::endl;
if (result == 3)
{
std::cout << "<h4 align=\"center\">A++</h4>" << std::endl;
std::cout << "<h3 align=\"center\">Very good!</h3>" << std::endl;
}
else if (result == 2)
{
std::cout << "<h4 align=\"center\">B</h4>" << std::endl;
std::cout << "<h3 align=\"center\">Good!</h3>" << std::endl;
}
else if (result == 1)
{
std::cout << "<h4 align=\"center\">C</h4>" << std::endl;
std::cout << "<h3 align=\"center\">Normal!</h3>" << std::endl;
}
else if (result == 0)
{
std::cout << "<h4 align=\"center\">F</h4>" << std::endl;
std::cout << "<h3 align=\"center\">Very bad!</h3>" << std::endl;
}
std::cout << "</div>" << std::endl;
std::cout << "</body>" << std::endl;
}
Скриншоты html-документа для различных браузеров:
Скриншот исходного документа:
Скриншот документа, сформированный CGI-скриптом:
Выводы по работе:
Были изучены основы CGI, а также его возможности.