Организация доступа к базам данных в Интернет
Рефераты >> Программирование и компьютеры >> Организация доступа к базам данных в Интернет

Рис. 6

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

Программный код поисковой формы выглядит так:

out.println("<form method=\"get\" action=\"/serv/SearchEngein\">"+

"<table width=\"461\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\">"+

"<tr bgcolor=\"#3399FF\"> "+

"<td width=\"266\" class=\"text\">&nbsp;&nbsp;&nbsp;Запрос</td>"+

"<td width=\"135\" class=\"text\">&nbsp;&nbsp;&nbsp;Каталог</td> "+

"<td width=\"207\">&nbsp;</td>"+

"</tr>"+

"<tr>"+

"<td width=\"266\" valign=\"top\"> "+

"<input type=\"text\" name=\"Query\" maxlength=\"100\" size=\"38\" value=\"\">"+

"</td>"+

"<td width=\"135\" valign=\"top\"> "+

"<select name=\"select\" size=\"1\">"+

"<option value=\"MARCFILE.Book\" selected>"+ConvertISO(getINIVar("KATALOG.Book"))+"</option>"+

"<option value=\"MARCFILE.Stat\">"+ConvertISO(getINIVar("KATALOG.Stat"))+"</option>"+

"<option value=\"MARCFILE.Periud\">"+ConvertISO(getINIVar("KATALOG.Periud"))+"</option>"+

"<option value=\"MARCFILE.Podpis\">"+ConvertISO(getINIVar("KATALOG.Podpis"))+"</option>"+

"<option value=\"MARCFILE.Ucheb\">"+ConvertISO(getINIVar("KATALOG.Ucheb"))+"</option>"+

"</select>"+

"</td>"+

"<td width=\"207\" valign=\"top\"> "+

"<input type=\"submit\" name=\"Start\" value=\"Поиск\">"+

"</td>"+

"</tr>"+

"</table>"+

"</form>");

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

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

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

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

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

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

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

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

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

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

После того как пользователь ввел запрос и нажал на кнопку “Поиск” в адресная строка браузера приобретет примерно вид :

http://localhost/serv/SearchEngein?Query=%E1%A8%E1%E2%A5%AC%A0&select=MARCFILE.Stat&Start=%8F%AE%A8%E1%AA

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

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

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

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);


Страница: