Рефераты. Организация доступа к базам данных в Интернет p> 2.6.2. Описание алгоритма

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

А теперь более детально остановимся на алгоритме, ниже приведен формат одной отдельно взятой записи из базы данных в формате RUSMARC (см.
Приложение 1).
00878nam 22002537
4500001000000033005000330017245000500244260002940015300003090009650003180063
6500038
1004565300426002465300450001965300469001602000485001009100495000809200503001
7090005200008852005280022852005500011040005610014041005750008008005830041
BOOK00000876 BOOK00000001 -19981027165203.0 -00aАктуальные вопросы преподавания хореографического искусстваnВып. 7bМатериалы межвуз. науч.- метод. конф. "Современные технологии обучения в гуманитарном вузе"cСанкт-
Петербургский гуманитарный ун-т профсоюзов; Редкол. А.С.Запесоцкий и др. -0 aСПб.c1994 - a22с.- aВысшая школаxМетодика преподаванияxМатериалы конференции- aХореографическое искусствоxПреподавание- aТехнологии обучения- aФормы обучения- aКонференция- c2.100- aЩ32- a14.35.09a18- cЩ32- bч/зt2hЩ32iА437- bаб.t3- aВСГАКИ-10- arus-950614s1990 rur

00000 rus d-

А теперь этаже запись только уже с пояснениями:
00878nam 22002537 4500 – Маркер 24 символа
– словарь 12 символов 1) Метка поля – 3 символа полный список всех меток приведен в Приложении 1.

2) Начальная позиция относительна начала записи -5 символов

3) Размер поля – 4 символа
1 - 001 00000 0033
2 - 005 00033 0017
3 - 245 00050 0244
4 - 260 00294 0015
5 - 300 00309 0009
6 - 650 00318 0063
7 - 650 00381 0045
8 - 653 00426 0024
9 - 653 00450 0019
10- 653 00469 0016
11- 020 00485 0010
12- 091 00495 0008
13- 092 00503 0017
14- 090 00520 0008
15- 852 00528 0022
16- 852 00550 0011
17- 040 00561 0014
18- 041 00575 0008
19- 008 00583 0041
Поля с данными
1 - - BOOK00000876 BOOK00000001
2 - -19981027165203.0
3 - -00aАктуальные вопросы преподавания хореографического искусстваnВып.
7bМатериалы межвуз. науч.-метод. конф. "Современные технологии обучения в гуманитарном вузе"cСанкт-Петербургский гуманитарный ун-т профсоюзов;
Редкол. А.С.Запесоцкий и др.
4 - -0 aСПб.c1994
5 - - a22с.
6 - - aВысшая школаxМетодика преподаванияxМатериалы конференции
7 - - aХореографическое искусствоxПреподавание
8 - - aТехнологии обучения
9 - - aФормы обучения
10- - aКонференция
11- - c2.100
12- - aЩ32
13- - a14.35.09a18
14- - cЩ32
15- - bч/зt2hЩ32iА437
16- - bаб.t3
17- - aВСГАКИ-10
18- - arus
19- -950614s1990 rur 00000 rus d
-

Программа начинает работать после того когда от клиента приходит запрос на страницу по определенному URL (например: http://www.real.ulan-
.ude.ru/serv/SearchEngein), для выполнения запроса пользователя веб-сервер запускает JServ, который в свою очередь обрабатывает запрос и определяет какой именно сервлет требуется запустить и в какой зоне он находится.
Информацию о зонах размещения всех сервлетов Jserv считывает из файла настройки. Чтобы сервлет начал выполняться JServ предварительно запускает виртуальную Java машину и только после этого начинает работать сервлет это значит что запрос пользователя будет обработан и пользователь получит запрошенную страничку. Что же происходит на стороне сервера в этот момент когда пользователь ждет пока загрузится страница. А происходит вот что, управление по отображению всей информации в окне браучера переходит сервлету, программе написанной на Java. Рассмотрим это более детально.
Сервлет инициализируется и начинает передачу данных в формате HTML пользователю. Первое что увидит пользователь это будет поисковая форма
(см. рис. 6) .

[pic]

Рис. 6

Поисковая форма

Программный код поисковой формы выглядит так: out.println(""+
""+
" "+
" Запрос"+
" Каталог "+
" "+
""+
""+
" "+
""+
""+
" "+
""+
""+ConvertISO(getINIVar("KATALOG.Book"))+""+
""+ConvertISO(getINIVar("KATALOG.Stat"))+""+

""+ConvertISO(getINIVar("KATALOG.Periud"))+""+
""+ConvertISO(getINIVar("KATALOG.Podpis"))+""+
""+ConvertISO(getINIVar("KATALOG.Ucheb"))+"
"+
""+
""+
" "+
""+
""+
""+
""+
"");

Рассмотрим код более пристально.

В тэге присутствуют параметры metod и action.

1) метод (metod) говорит браузеру о том что данные(запрос) будет отправлены серверу;

2) действие (action) – в этом параметре находится путь к программе на старое сервера которая примет отправленный запрос для обработки.

Следующий интересующий нас неотъемлемый компонент это тэг , который тоже имеет несколько параметров type, name, value. Этот тэг является строкой ввода, рассмотрим его параметры.

1) тип (type) равный “text” говорит о том что это строка ввода;

2) имя (name) название запроса т.е. имя которое присваивается тексту введенному в строку ввода, в моей программе это Query;

3) значение (value) значение строки по умолчанию при начальной загрузке.

Еще один значимый тэг формы - это список для выбора базы в которой будет производится поиск. Данный тэг имеет свое имя которое указано в параметре name. Сам же список последовательно указан в тэге относящимся к тэгу . Каждая из строк начинающихся тэгом является элементом списка для выбора. У тэга есть параметр value в котором указан псевдоним выбранного пункта из списка – это нужно для определения какой пункт из списка выбран.

И наконец последний значимый тэг , в отличии от первого тэга у этого тэга параметр тип(type) равен “submit” - это значит что это кнопка отправки запроса обработчику который указан в тэге . У кнопки тоже есть имя (name) и значение (value) кнопка называется Start.
Последним тэгом, всегда является закрывающий тэг .

После того как пользователь ввел запрос и нажал на кнопку “Поиск” в адресная строка браузера приобретет примерно вид : http://localhost/serv/SearchEngein?Query=%E1%A8%E1%E2%A5%AC%A0&select=MARCFI
LE.Stat&Start=%8F%AE%A8%E1%AA

К ссылке на сервлет прибавилось три параметра отделенные от адреса сервлета вопросительным знаком первый параметр это Query (запрос), второй select говорящий сервлету в какой базе производить поиск.

Первое что делает программа - это считывает файл настройки db.ini – который находится в папке c:wwwdb. В данном файле находятся данные о место нахождении интересующей базы данных или говоря проще локальный путь к базе данных. Определив интересующую базу данных и установив ее место нахождения, программа начинает процесс поиска всех удовлетворяющих запросу данных (библиографических описаний).

Программа считывает всю запись в массив, после чего начинается определение места нахождения полей и их длинны. Разберем код процедуры. public void dbFileRead(String dbNamePath, PrintStream out, String query) {

Сперва производится инициализация всех переменных используемых при работе процедуры.

Первый блок. Переменные для занесения значений полей
String mAvtor = null; // 100
String msAvtor = null; // 700
String mName = null; // 245
String mPrinter = null; // 260
String mSize = null; // 300
String mKey = null; // 653
String mSeria = null; // 490
String mRubrika = null; // 650
String mBBK = null; // 91
String mKaIndex = null; // 90

Второй блок. Файловые переменные для перемещения по файлу long fPosMarker = 0, // Позиция относительно начала fPosData = 0; // Начальная позиция данных

boolean done = false;

Третий блок. Перемнный для работы с данными int mC =0, // Счетчик прочитанных записей mE =0; // Счетчик найденых соответствий byte Jumper[] = new byte[5]; // Размер запяси - символьный int JIndex = 0, // Размер запяси - числовой

JTemp = 0, // Размер данных + словарь

MIndex = 0, // Счетчик для массива

MTemp = 0; // Счетчик полей

Начало выполнени поика. Сперва проверяется имеет ли запрос query занчение неравное пусто, если условие выполняется и запрос имеет не нуливое занчение устанавливается связь с файлом данных. Начальная позиция чтения равна нулю. if (query != null){ try { RandomAccessFile dbfile = new RandomAccessFile(dbNamePath,"r");
// Цикл чтения файла по маркерам while (fPosMarker != dbfile.length()) { try { mC++; dbfile.seek(fPosMarker); dbfile.read(Jumper);

String jBuf = new String(Jumper);

JIndex = Integer.parseInt(jBuf,10); int b = 0;

Прочитав начальный блок из 5 символов говорящий о длине записи он преобразуется из символьного значенья в числовое. Затем определяется длинная словаря которая равна 12*n, где n – равно количеству заполненных полей в одной записи.
// Поиск конца словаря while ( b != MD){ dbfile.seek(fPosMarker+24+MIndex); b = dbfile.read();

MTemp++;

MIndex = MTemp;

}

MTemp= MTemp - 1;

Определив конечную позицию словаря производится считывание в массив блока состоящего из данных - метка поля; начальная позиция поля, относительно конца словаря; длинная поля и символах.
// чтение Словаря из файла в отдельный массив byte Dic[] = new byte[MTemp]; dbfile.seek(fPosMarker+24); dbfile.read(Dic);
// чтение полей данных из файла в массив fPosData = fPosMarker+24+MTemp;

String sDic = new String(Dic); int DI2 = 0,

DI3 = 0,

DI4 = 0,

DI5 = 0,

PNum = 0, // Номер поля числовой

PLength = 0, // Длинна поля числовая

PStart = 0; // Начальная позиция поля чиловая

Получив данные в результате преобразований, это строка, начинается последовательное вычитание метки поля, начальной позиции, размера поля.
// сканирование номеров полей while ( DI2 != MTemp){

DI3=DI2+3;

String DStr = sDic.substring(DI2,DI3);// Номер поля

DI4=DI3+5;

String DStr2 = sDic.substring(DI3,DI4);// Начальная позиция

DI5=DI4+4;

String DStr3 = sDic.substring(DI4,DI5);// Длинна поля

DI2=DI2+12;

PLength = Integer.parseInt(DStr3,10);// Узнаем длинну поля

PStart = Integer.parseInt(DStr2,10);// Узнаем начало поля

PNum = Integer.parseInt(DStr,10);// Код byte Pole[] = new byte[PLength];

Как только первая запись о первом поле разобрана на составляющие проверяется его метка , которая говорить относится или нет, поле к тому списку полей который нас интересует. Если да то производится считывание его из файла. После того как поле считано над значением поля производится ряд преобразований, таких как, вычитание из поля служебной информации относящейся к формату MARC.
// Чтение поля из файла switch (PNum) { case 100 : { dbfile.seek(fPosData+PStart); dbfile.read(Pole);

Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16



2012 © Все права защищены
При использовании материалов активная ссылка на источник обязательна.