![]() |
|
|
Реферат: Организация доступа к базам данных в Интернет/* это многострочный комментарий */ (или можно посреди строки /* кусок программки */ при отладке так вот закомментировать) /** это особый комментарий */ для создания документации при помощи утилиты javadoc. Она кое-что понимает и создает документацию в виде HTML-страницы. Например комментарий относится к введенной следом переменной в программке. Тогда в HTML-странице будет мой комментарий и следом - та самая переменная указана. Посмотрите в Документацию Java! Полезно документацией уметь пользоваться. Ее очень много и все запомнить нереально. (и, как уже было сказано, в печатаных книгах за Sun не поспевают.. Реплика из зала: есть книжка, морально старая, но хорошо написанная - 2 тома - P.Norton "программирование на Java". П2.2.1. Типы данных:Простые типы данныхцелочисленные = для хранения целых чисел byte (8 bit) : -128 - +127 short = 2 byte : -32768 .. +32767 int = 4 byte : -... +2147483647 long = 8 byte : много-много ( 10**19 степени) Много разных типов? Это сделано для экономии места в оперативной памяти. Если есть куча *небольших* чисел, то мне незачем отводить на них *большие* куски памяти. На использование int рассчитаны все функции. Если переполняется предусмотренная под тот или иной тип ячейка памяти - данные просто теряются. Но такие ошибки надо предусматривать и перехватывать механизмом перехвата исключительных ситуаций. Вещественные числа (с плав. точкой):float : 4 byte : min=+/-1,4*10**-45 max=+/-3,4*10**+38 double : 8 byte : max=+/-2*10**-308 max=+/-1.7*10**+308 Символьные char : 2 byte (чтобы туда влазила кодировка unicode - см www.unicode.org - 65 000 символов на всех языках и еще место осталось). В Win окне или в DOS-окне не сработает, но в бродилках все ОК Логические-булевскиеboolean : thrue/false (нельзя как в других языках понимать это как 0 или 1) Что такое "простые типы" ? Это значит отвели память и никак ее не структурировали. А еще существуют сложные типы данных - объекты. Об них позднее. Теперь о них упоминаю, чтоб вас не пугало отсутствие строкового типа string. Объекты - это современно и здорово. Это нужно освоить. Это несложно и удобно... Но пока закончим разговор про простые типы. int a; // мы сделали переменную имя а для хранения целого числа. // в конце оператора ставят ; и пробелов, табуляций.. может // быть много (не то что в Бейсике) Память не только выделилась, но и заполнилась. В других языках надо инициализировать переменную - назначить ей некоторое значение, "ноль" например, иначе там будет вредный мусор. А в java переменная сама собой заполняется нулями. Вещественная переменная заполнилась бы 0,0 ; Символьная заполнится нулевым символом кодировки unicode (т.е. 0000 ), boolean - false ; (хотя лучше все же инициализировать явно, по старинке) Вводить переменные можно в любом месте до их использования. А не только в начале. Имена как и в других языках - состоят из букв, цифр (но с цифры имя нельзя чтоб начиналось), символа подчеркивания. (это правило полезно использовать и в именах файлов) a = 5 ; // в объявленную ранее переменную занесли 5 Можно эти операции объединить вот так: int a = 5 ; Примеры для переменных других простых типов: float c = 7.2 ; boolean d = true ; char e = 'M' ; // только в одинарные кавычки Спецсимволы - как и в C - например: \n enter=newline \t = tab \r = enter \f = newpagetoprint \b backspace Использование числовых значений кодировки unicode: \u0037 = это то же самое, что символ '7' (цифры десятичные) Расшифровка символов есть на сайте Unicode и на розданном CD есть расшифровка для русского языка. Чтобы спецсимвол не работал как спецсимвол, ставят косую черту: char c = '\'' ; // тут в "c" поместили символ "одиночная кавычка" Экзотика: Можно использовать и 8 и 16-ричную форму записи, например так: a = 0x7B // записано 16-ричное число 7B a = 0175 // записано 8-ричное число 175 --- Какие преобразования типов данных возможны?: int x; // 4 byte длиной byte y; // 1 byte длиной x=y; // более короткое число "y 1 byte длиной" положили в место // для длинного "x 4 byte длиной" Наоборот тоже возможно, но компилятор будет ругаться. Еще можно явно преобразовывать типы: y=(byte)x; // сделать из 4-байтового числа "x" 1-байтовое Аналогичные штуки работают для вещественных чисел. double z = 7.8; Превратим вещ. z в целое x=(int)z; // сработает, но пропадет хвостик 0.8 А если попытаться написать x=z; то компилирование не произойдет и байт-код не получиться. Наоборот, преобразование с удлинением места в памяти не обязательно указывать во что преобразовываем. То есть при таком безопасном преобразовании можно применить неявную форму записи преобразования. То есть в примере выше можно написать z=x; П2.2.2. Математические операцииВсе обычные операции(кто не знает что такое % - это есть вычисление остатка от целочисленного деления, например 10 % 3 -> получится 1 , 10,2 % 3 -> тоже 1) увеличить на число и результат положить в ту же ячейку-переменную, откуда брали. Сокращают запись: а=а+5; то же самое что а+=5; Аналогично пишут для - % * / Инкремент, например а=а+1; ++а = сначала увеличиваем переменную, потом можем воспользоваться хранящимся в ней значением. а++ = наоборот, сначала можем воспользоваться хранящимся в переменной значением, потом увеличиваем ее на единицу; Пример: int a=5, b; b=++a; // это значит в b попала шестерка // (сначала к 5 прибавилась 1, потом ее // использовали для занесения в ячейку "6") Аналогично есть "декремент" --а или а-- (это все не сложно, нужно лишь привыкнуть и запомнить разные разности) Сравнение(результат будет булевского типа) < > =< >= == != не равно Пример int a = 5; int b = 6; boolean c c = а == b // в "с" будет-запишется false Логические операции|| или ! не && и исчерпывающие примеры true && true = true true && false = false false && true = false false && false = false true || true = true true || false = true false || true = true false || false = false !true = false !false = true Зачем это нужно? Для написания всяких сложных условий типа "если переменная А меньше того-то, но больше сего-то , тогда П2.2.3. Исключительные ситуации (exeptions)Прежде чем погибнуть по причине ошибки, программа создает "исключения". Это объекты - экземпляры какого-нибудь класса из подклассов java.lang.Throwable Класс Throwable содержит строку сообщения String. Много стандартных классов-наследников у Throwable. Их (объекты-"исключения") можно перехватывать и обрабатывать, не давая совершиться чему-то страшному. Например вводим буквы вместо цифр в калькулятор. "Обработать искл.сит.", - значит понять что случилось, остановить программу и выдать сообщение, "не цифра!" например. Применяется конструкция try{ тут кусок программы способный привести к ошибкам }catch(Exception e){ тут кусок программы "что делать" когда ошибка произошла }finally{ что делать дальше независимо от результатов обработки в catch надеюсь далее будет пример } Имя "Exception" означает на самом деле ту самую искл. сит., которая произошла в классе, который мы вызвали из раздела Try{"тут кусок программы способный привести к ошибкам"}. Компилятор помнит, откуда был сделан вызов метода, далее в том же блоке try-catch приведшего к исключению, поэтому собственное имя искл.сит. не требуется, вполне годится общестандартное имя "Exception". Экземпляр класса Exception будет создан. Исключительные ситуации можно создавать и искусственно. Для проверки неких условий. (оператор throw new "имя_Exception" <-[внутри try - catch]). Тут уже Исключ.сит. - это некий объект некоего нами названного класса (наследника класса "Exception"). И тут уже он (объект нашего класса-наследника) имеет собственное имя! П2.3 Языковые конструкции JavaП2.3.1. Циклыс предусловием while (condition) { do-some-actions; // if condition=false, ни разу действие не сделается } с после условием do{ do-some-actions; // at least it'll be done once } while (condition a verifier); с перечислением for (intitialisation; condition; modification){ do-some-actions; } Пример: for (int i = 0; i < 7; i++){ можно на самом деле инициализировать одну переменную, а наращивать другую и проверять третью, а можно и вообще какое-то условие пропустить (но обязательно его указать пустым местом, то есть поставить соответствующую ему точку с запятой!. Как вы помните, i++ означает i=i+1 Еще можно перечислять несколько переменных в каждом разделе for оператор break можно использовать во всех этих циклах (его пишут предварив его if(условие) тогда break Еще есть оператор continue - пропускает текущую итерацию и продолжает цикл. Пример Пример: for (int i=-3; i<3; i++){ if (i==0) continue; // нельзя делить на ноль float a = 5/i; // вообще-то если в Java делить на ноль, } // получиться спец_значение inf (некая константа // равная самому большому числу из возможных // вещественных чисел Тут i живет только внутри цикла, а вот а - видна снаружи и после завершения цикла не пропадает. Пример однако глупый, потому что промежуточные значения а нигде не останутся.. но это только пример на циклы. П2.3.2. Условный переходВсе программерство стоит на условных переходах вроде такого "если условие верно, то делай это, если нет - делай то" Короче говоря "Если.. то.." Или по иностранному (все как в языке C) if (условие) { действие; // действие м/б одно или куча ... // если действие одно, фигурные скобки можно не писать действие; } Если действие одно-единственное, фигурные скобки можно не писать. if (проверяемое условие или логическая переменная){ действие; ... действие; }else{ действие; ... действие; // вместо действия могут быть вложенные if } Конструкция switch - выбор значений переменной из списка вариантов switch (value){ case value1 : do_this; break; // срочный выход из цикла case value2 : do_this; case value3 : разные операторы; default : еще операторы ; } П2.3.3. МассивыЭто тоже объекты. В отличие от других типов, в библиотеке явно нет стандартного класса от Sun, из которых они создаются. Но оператор new используется и все делается похоже на создание других объектов. 1) Указывается тип данных которые будут храниться в ячейках массива и в ячейках можно будет хранить данные только одного этого типа. int a[]; int[] a; 2) выделить память и указать сколько ячеек в массиве: a=new int[5] ; Все ячейки пронумерованы начиная с нуля. Обращаться к каждой можно используя квадратные скобки. А что тут объектного? Вот что: у объекта "массив" есть одно-единственное свойство length - длина массива в ячейках. Ее читают соответствующим методом-функцией. Длина обозначена числом типа int (long нельзя). Массивы только одномерные. Подобие многомерности получается путем создания массива из массивов. В ячейке массива сидит массив (причем они разномерные и более того..) Все массивы "динамические". Значит ли это, что они могут менять свою длину в процессе работы? НЕТ! Массив после создания можно только уничтожить (длина станет null). Слово "динамический" означает, что память под массив можно выделить в любом месте программы (а не заранее!) и память только в том месте программы - на том этапе работы программы - и выделится. Удобно вообще-то: если у вас огромный массив, то память он начнет загромождать не заранее, а только когда он понадобится. Как еще можно создавать массивы? Можно сразу ему присвоить начальное значение. Длина будет такая, сколько значений указали: int a[] = {7, 21, 85}; // слово new тут не нужнО Многомерные массивы : Объявим "массив с цифрами float в ячейках" float a[][]; Инициализируем его: float a[][] = new float [4][2]; // матрица 4 х 2 Разномерный массив: float a[][] = new float [4][]; Не сказано какой длины будут висеть наборы ячеек из каждой из 4-х ячеек "первого" массива (массива массивов). Это первое new не выделяет память, а только создает некие указатели. Далее нужно написать для выделения памяти : a[0] = new float[3]; - в первую ячейку положили массив длиной "три"... Про массивы все. Очень нехарактерно для Java то, что в классе массив есть всего один метод. Есть еще класс Вектор, там методов полно, но есть и расплата - вектор медленно работает. Обычно в классах по не одному десятку методов. П2.3.4. ПодпрограммыВсе. Зачем все вышеназванное нужно? Все оно используется не само по себе, а внутри функций. ФУНКЦИЯ - группа операторов под общим ИМЕНЕМ. Обращаясь к ней по имени мы их все вызываем к работе. Может понятнее было бы назвать ПОДПРОГРАММОЙ. Отработав, операторы дают некий результат своей работы - его "функция" возвращает. Чтобы вернуть результат, нужно указать заранее его тип. Итак функции пишут так: data_type FunctionName (тип_арг1 имя_арг1, тип_арг2 имя_арг2, ... тип_аргN имя_аргN){ перечень действий-операторов, составляющих; подпрограмму-функцию; return(результат); // спец_оператор для возврата результата работы функции-подпрограммы // return результат; - еще вариант записи оператора "возврат результата" // этот оператор еще по совместительству завершает функцию (работу подпрограммы) } Результатов возвращаются не более одного. Бывает, что функция не должна ничего возвращать. Тогда используют специальный тип - void ; Перед типом результата иногда пишут так наз. описание доступа (спецификатор доступа) - указывают кто может использовать данную. функцию. Об этом позже. ПРИМЕР - некая функция для суммирования целых чисел. int Sum(int x, int y){ return (x+y); } Аргументы простых типов передаются "по значению". Это значит, что внутри подпрограммы создаются копии переданных туда в качестве аргументов переменных, а сами эти переменные не изменяются. (((Если бы внутри функции использовались указатели - это было бы "по ссылке" .. На самом деле передача внутрь функции объектов производится "по ссылке" - об этом позднее. Еще раз: Объекты передаются по ссылке! (нужно внутрь некоторого объекта, в его функцию, передать посторонний объект со всеми его переменными=полями и их значениями... Передается лишь ссылка на этот объект. Внутри области нашего первого объекта НЕ выделяется память, не создается в ней копия постороннего передаваемого объекта.))) Внутри функции-подпрограммы можно объявлять переменные - они есть "локальные". Когда функция начала работать, этим переменным отведется место в памяти компутера, но как только она перестанет работать (завершится), то эта переменная из памяти уничтожится. И вне функции она будет не видна все время работы функции. В обычном программировании вы еще слышали "глобальную" переменную. Тут этого термина нет, но считайте что все переменные объявленные вне функции - "глобальные". Они называются на самом деле "полями" - об этом позднее! int Sum(int x, int y){ int rez; // локальная rez = x + y; return (rez); } ПЕРЕГРУЗКА функции Это просто. В программе можно объявить несколько функций с одинаковыми именами, различающиеся только списком аргументов. Этот список должен быть разным обязательно. Разница м/б как в количестве, так и в их типе. Очень популярный механизм. Буквально каждая функция имеет несколько однофамильцев. Например мы хотим суммировать не только целые, но и вещественные числа. А язык-то жестко типизированный. Вот и пригодится перегрузка: float Sum(float x, float y){ return (x+y); } Если при вызове функции я указал вещественное, то вызовется Sum-вещественная, а если целые - Sum-цел. float a=Sum(5, 6); a = Sum(5,2, 6); Пример не ахти какой, так как возможно безопасное преобразование типов... Но идея ясна. Очень это распространено, среди матем. библ. функций.. Функции не живут сами по себе в java-программировании. Они живут внутри КЛАССОВ. П2.4. Объектно-ориентированное программирование (ООП).Зачем нужно? Чтобы экономит силы и использовать объектный код, сочиненный другими людьми. Сама Java -программа - это некий объект. Главное понятие в ООП - понятие класса. Это структура (сложный тип данных), объединяющая переменные и функции для работы с ними. Класс "мыша" Mouse{ x // переменные внутри класса - "поля" или y // "свойства" draw() // функция внутри класса = "метод" } Формальное описание синтаксиса класса: class Name { int x, y; тело класса; int Sum (int a, int b){} // описание функций float z; // в любом порядке описание переменных и функций.. // хотя для читабельности все лучше по порядку } Класс не похож на функцию, не возвращает никакого значения. Тут используют описания доступа к переменным (полям то есть) класса и к его функциям (методам то есть). По умолчанию переменные и функции доступны для своего класса и всех его соседей в той же папке. По сути класс - что это? Это сложная структура в памяти. Выделяем 4 байта для целого, 4 байта для вещественного, и описываем структуру функции для работы с ними. Но это лишь описание - реально память не выделена. Память выделяется реально - создается объект. То есть конкретный экземпляр класса. Я месяца три после процедурного программирования не мог привыкнуть к терминологии и не мог понять, зачем же это нужно! Попытаюсь вам объяснить все же побыстрее :-) Класс "люди" голова руки метод_думать (увеличивает значение голова на 1) метод хватать (увеличивает значение рук на 1) все Мы все - объекты=экземпляры этого класса. Нам выделено место на земле чтобы жить, хватать и думать. Внутри класса помимо всего прочего существует специальная функция - "конструктор" - называется функция тем же именем, что и класс (в этом примере - "люди"). Она может существовать или не существовать. Она не возвращает никакого результата и void к конструктору не надо приписывать. Она - функция-конструктор - нужна для некоторых начальных (инициализирующих) действий при создании объекта. Какие действия? Разные.. В нашем примере: конструктор присвоит головам и рукам значение "десять". Это я придумываю сам. Пусть будет так. Или пример с мышой: пусть мыша будет при инициализации располагаться в центре экрана. Кто-то должен вычислить координаты центра экрана и вызвать функцию рисования чтобы там мыша была нарисована. Когда объект создается (человек рождается), то вызывается один-единственный раз конструктор. Если я не описал спец. конструктор, то что по умолчанию? Обычно ничего. Но если и ничего, все же по умолчанию конструктор есть. Хотя по умолчанию он ничего не совершает, ничего не возвращает, никаких аргументов не получает. Вернемся к примеру Люди: создаем объект Миша класса Люди - 1) объявили переменную сложного типа "Люди" (так как мы писали int a; при объявлении переменной простого типа) Люди Миша; // никакая память не выделилась, переменной // спец_типа Люди - нет, ее "значение" - null // в отличие от случая простой переменной - она то // "инициализируется" автоматически 2) выделили оперативную память для объекта Миша: Миша=new Люди(); Теперь возник кусок выделенной памяти - конструктор там создал структуру для хранения переменных руки, голова, функций-методов. Разница с обычным программированием: функция делается менее универсальной. Она может работать только над данными данного объекта! Нельзя заставить функцию-метод объекта взять переменную другого объекта. (можно ей передать извне эти переменные-поля как аргументы). Зато (выигрыш) все это дело увязано в одну взаимосвязанную структуру. Еще раз: даже если метод-функцию вызвать снаружи, она чужие данные не сможет взять. А как же передают данные внутрь переменных-полей объекта? Прямой записью в поле или передачей данных внутрь через функцию-метод, ему эти данные дают в качестве аргумента. Уничтожение объектов. В отличие от Си++ в Java нет Деструктора. Я пишу Миша = null; Объект "Миша" не сразу убивается-освобождает память. Он просто лежит тут, ненужный Миша. А потом, в момент регулярной чистки памяти, его уберут. Java -машина чистит память регулярно. Приложение 3 Листинг программы – SearchEngein.java import javax.servlet.*; import javax.servlet.http.*; import java.io.*; import java.net.*; import java.util.*; import java.lang.*; // Класс Интерфейс public class SearchEngein extends HttpServlet { // Объявление глобальных переменных Properties INIProperties = new Properties(); String query = null, // Запрос value = null; // Запрос в нужной кодировке String dbname, // Имя базы dbpath; // Путь к базе String dbselect; // byte MD = 30, // Код разделителя MD2 = 31; // Код разделителя String RusDos = new String("Cp866"); // Кодировка дос String RusWin = new String("windows-1251"); // Кодировка Виндовс String iso = new String("8859_1"); // Кодировка Сервлета String RusIso = new String("8859-5"); // Кодировка Исо // конвертор кодировки из ИСО В Виндовс private String ConvertISO(String Str) { try { Str = new String( Str.getBytes(iso),RusWin);} catch( java.io.UnsupportedEncodingException e ) { return Str;} return Str; } public String getServletInfo() { return "Поиск в базе данных "; } private String RemoveTrash(String str){ return new String(str); } // преобразование в нижний регистр public String toLow(String str){ char old[] = str.toCharArray(); char news[] = new char[str.length()]; char c; for (int i =0; i<str.length(); i++){ c = old[i]; switch (c) { case 'А' : {c = 'а';break;} case 'Б' : {c = 'б';break;} case 'В' : {c = 'в';break;} case 'Г' : {c = 'г';break;} case 'Д' : {c = 'д';break;} case 'Е' : {c = 'е';break;} case 'Ё' : {c = 'ё';break;} case 'Ж' : {c = 'ж';break;} case 'З' : {c = 'з';break;} case 'И' : {c = 'и';break;} case 'Й' : {c = 'й';break;} case 'К' : {c = 'к';break;} case 'Л' : {c = 'л';break;} case 'М' : {c = 'м';break;} case 'Н' : {c = 'н';break;} case 'О' : {c = 'о';break;} case 'П' : {c = 'п';break;} case 'Р' : {c = 'р';break;} case 'С' : {c = 'с';break;} case 'Т' : {c = 'т';break;} case 'У' : {c = 'у';break;} case 'Ф' : {c = 'ф';break;} case 'Х' : {c = 'х';break;} case 'Ц' : {c = 'ц';break;} case 'Ч' : {c = 'ч';break;} case 'Ш' : {c = 'ш';break;} case 'Щ' : {c = 'щ';break;} case 'Ъ' : {c = 'ъ';break;} case 'Ы' : {c = 'ы';break;} case 'Ь' : {c = 'ь';break;} case 'Э' : {c = 'э';break;} case 'Ю' : {c = 'ю';break;} case 'Я' : {c = 'я';break;} default : {news[i]=c;} }// switch news[i] = c; } return new String(news); } // private String TagRemove(String s){ boolean inTag = false; boolean tag = false; int sn = 0; char c; int m = s.length(); char[] cd = new char[m]; char[] old = s.toCharArray(); char cMD = (char) MD2; for (int i=0; i<m; i++) {c=old[i]; if (tag) { c=' '; tag = false; } else if ( c == cMD ) { c=' '; tag = true;} cd[i] = c; } return new String(cd); } // 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 mBBK = null; // 91 String mKaIndex = null; // 90
long fPosMarker = 0, // Позиция относительно начала fPosData = 0; // boolean done = false, Avtor = false; int mC =0, mE =0; // Счетчик byte Jumper[] = new byte[5]; // Размер запяси - символьный int JIndex = 0, // Размер запяси - числовой JTemp = 0, // Размер данных + словарь MIndex = 0, // Счетчик для массива MTemp = 0; // Счетчик полей 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; // Поиск конца словаря 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); byte MarcRec[] = new byte[JIndex-24-MTemp]; dbfile.seek(fPosData); dbfile.read(MarcRec); 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]; // Чтение поля из файла for (int PIndex = 0; PIndex < PLength; PIndex++) { Pole[PIndex] = MarcRec[PStart+PIndex]; } String Pol = new String(Pole); if (Pol == null) Pol=" "; switch (PNum) { case 100 : { mAvtor = TagRemove(Pol.substring(5));break;} case 700 : { msAvtor = TagRemove(Pol.substring(5));break;} case 245 : { mName = TagRemove(Pol.substring(5));break;} case 490 : { mSeria = TagRemove(Pol.substring(5));break;} case 91 : { mBBK = TagRemove(Pol.substring(5));break;} case 90 : { mKaIndex = TagRemove(Pol.substring(5));break;} case 260 : { mPrinter = TagRemove(Pol.substring(5));break;} case 300 : { mSize = TagRemove(Pol.substring(5));break;} case 653 : { mKey = TagRemove(Pol.substring(5));break;} default : {} }// switch }// конец проверки полей if ( mAvtor == null) mAvtor=" "; if ( msAvtor == null) msAvtor=" "; if ( mName == null) mName=" "; if ( mPrinter == null) mPrinter=" "; if ( mSize == null) mSize=" "; if ( mKey == null) mKey=" "; MarcRecord Rec = new MarcRecord( mAvtor, msAvtor, mName, mPrinter, mSize, mKey, mSeria, mBBK, mKaIndex); if ( Rec.rAvtor.indexOf(query) != -1 || Rec.rsAvtor.indexOf(query) != -1 || Rec.rName.indexOf(query) != -1 || Rec.rKey.indexOf(query) != -1) { mE++; out.println("<table width=\"461\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\">"+ "<tr bgcolor=\"#3399FF\">"+ "<td colspan=\"3\" class=\"text\"> Автор: "+ "<font color=\"#000000\">"+ Rec.rAvtor+" "+ Rec.rsAvtor+ "</font></td></tr><tr>"+ "<td colspan=\"3\" valign=\"top\" class=\"bodytext\">"+mE+". "+mC+ " <b>Название:</b> "+ Rec.rName+"<br>"+ Rec.rPrinter+" "+ Rec.rSize+"<br>"+ Rec.rBBK+" "+ Rec.rKaIndex+" "+ Rec.rSeria+ "</td></tr></table>"); } fPosMarker = fPosMarker+JIndex; MTemp = 0; MIndex = 0; } catch (IOException e) { out.println("Ошибка!!!"+"<br>"); done=true; } } } catch (IOException e) { out.println("Ошибка доступа к "+dbNamePath); } if (mE == 0) { out.println("Запос: "+query+" не найден"); } } // end If } // Ридер файла настройки public void INIFile(String filename, String directory, PrintStream out) { DataInputStream inifile = null; String path = null, iniRecord = null, section = null, vname = null, vvalue = null; boolean done = false; int equalIndex = 0; // if (filename.length() == 0) { out.println("IOError "); System.exit(0); } if (directory.length() == 0) { directory = new String("c:\\www\\db"); } if (filename.indexOf(".") < 0) { filename = new String(filename+".ini"); } path = new String(directory+System.getProperty("file.separator")+filename); // открытие файла try { inifile = new DataInputStream(new FileInputStream(path)); } catch(FileNotFoundException e) { out.println(filename+"not found"); System.exit(0); } // чтение файла try { iniRecord = inifile.readLine(); } catch (IOException e) { done=true; } while (!done && iniRecord != null) { if (iniRecord.startsWith("[")) { section = iniRecord.substring(1,iniRecord.lastIndexOf("]"));} else if (!iniRecord.startsWith(";")) { equalIndex = iniRecord.indexOf("="); if (equalIndex > 0) { //Имя ключа => Раздел.ключ vname = new String(section+"."+iniRecord.substring(0,equalIndex)); vvalue = new String(iniRecord.substring(equalIndex+1)); INIProperties.put(vname, vvalue);
} } try { iniRecord = inifile.readLine(); } catch (IOException e) { done=true; } } } // извлечь значение public String getINIVar(String key, String defValue) { return INIProperties.getProperty(key, defValue); } // извлечь значение public String getINIVar(String key) { return INIProperties.getProperty(key); } public void init(ServletConfig conf) throws ServletException { super.init(conf); } public void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { PrintStream out; out = new PrintStream(res.getOutputStream()); res.setContentType("text/html; charset=Cp866"); // Печать заголовка printPageHeader(out); INIFile("db.ini","c:\\www\\db",out); // Определяем кодировку String requestEnc = req.getCharacterEncoding(); String clientEnc = requestEnc; if ( requestEnc==null ) requestEnc=iso; requestEnc=iso; // Тело out.println("<body bgcolor=\"#FFFFFF\">"); out.println("<form method=\"get\" action=\"/serv/SearchEngein\">"); out.println(" <table width=\"461\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\">"); out.println(" <tr bgcolor=\"#3399FF\"> "); out.println(" <td width=\"266\" class=\"text\"> Запрос</td>"); out.println(" <td width=\"135\" class=\"text\"> Каталог</td> "); out.println(" <td width=\"207\"> </td>"); out.println(" </tr>"); out.println(" <tr>"); out.println(" <td width=\"266\" valign=\"top\"> "); out.println(" <input type=\"text\" name=\"Query\" maxlength=\"100\" size=\"38\" value=\"\">"); out.println(" </td>"); out.println(" <td width=\"135\" valign=\"top\"> "); out.println(" <select name=\"select\" size=\"1\">"); out.println(" <option value=\"MARCFILE.Book\" selected>"+ConvertISO(getINIVar("KATALOG.Book"))+"</option>"); out.println(" <option value=\"MARCFILE.Stat\">"+ConvertISO(getINIVar("KATALOG.Stat"))+"</option>"); out.println(" <option value=\"MARCFILE.Periud\">"+ConvertISO(getINIVar("KATALOG.Periud"))+"</option>"); out.println(" <option value=\"MARCFILE.Podpis\">"+ConvertISO(getINIVar("KATALOG.Podpis"))+"</option>"); out.println(" <option value=\"MARCFILE.Ucheb\">"+ConvertISO(getINIVar("KATALOG.Ucheb"))+"</option>"); out.println(" </select>"); out.println(" </td>"); out.println(" <td width=\"207\" valign=\"top\"> "); out.println(" <input type=\"submit\" name=\"Start\" value=\"Поиск\">"); out.println(" </td>"); out.println(" </tr>"); out.println(" </table>"); out.println(" </form>"); // Конец тела // Взять текст из строки query = req.getParameter("Query"); if (query == null || query.length()<1) { printPageFooter(out); return; } dbselect = req.getParameter("select"); value = new String(ConvertISO(query)); // Чтение файла dbFileRead(getINIVar(dbselect), out, value); // Распечатка результата printPageFooter(out); query = null; value = null; } // Вывод заголовка документа private void printPageHeader(PrintStream out) { out.println("<html>"); out.println("<head>"); out.println("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=Cp866\">"); out.println("<style type=\"text/css\">"); out.println("<!--"); out.println(".text { font: bold 12px Arial, Helvetica, sans-serif; color: #0000FF; text-decoration: none; text-align: left; }"); out.println(".bodytext { font: 12px Arial, Helvetica, sans-serif; color: #000000; text-decoration: none; text-align: left; }"); out.println("-->"); out.println("</style>"); out.println("</head>"); } private void printPageFooter(PrintStream out) { out.println("</body>"); out.println("</html>"); out.flush(); } } // Класс Запясь для хранения данных считаных из запяси class MarcRecord { protected String rAvtor; // Поле автор protected String rsAvtor; // Поле соавтор protected String rName; // Поле название произведения protected String rPrinter; // Поле издатель protected String rSize; // Поле Объем издания protected String rKey; // Поле ключевые слова protected String rSeria; protected String rBBK; protected String rKaIndex; MarcRecord( String r1, String r2, String r3, String r4, String r5, String r6, String r8, String r11, String r12) { rAvtor = r1; rsAvtor = r2; rName = r3; rPrinter = r4; rSize = r5; rKey = r6; rSeria = r8; rBBK = r11; rKaIndex = r12; } } Приложение 4 Результаты тестирования программы Тестирование программы проводилось на 4 массивах данных размером 1000, 5000, 8366, 10000 записей. Метод тестирования заключался в поиске последней записи массива по уникальному названию, чтобы определить время поиска по всему массиву. Полученные данные приведены в таблице и на основе данных построен график (см. график). График |
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
![]() |
||
НОВОСТИ | ![]() |
![]() |
||
ВХОД | ![]() |
|
Рефераты бесплатно, реферат бесплатно, курсовые работы, реферат, доклады, рефераты, рефераты скачать, рефераты на тему, сочинения, курсовые, дипломы, научные работы и многое другое. |
||
При использовании материалов - ссылка на сайт обязательна. |