Организация доступа к базам данных в ИнтернетРефераты >> Программирование и компьютеры >> Организация доступа к базам данных в Интернет
Рис. 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\"> Запрос</td>"+
"<td width=\"135\" class=\"text\"> Каталог</td> "+
"<td width=\"207\"> </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);