Добавлен: 28.06.2023
Просмотров: 182
Скачиваний: 3
СОДЕРЖАНИЕ
Глава 1. Обзор и анализ проблемы, методов и средств ее решения
1.1. Обзор архитектуры «клиент-сервер»
1.1.2 Клиенты и серверы локальных сетей
1.1.3 Системная архитектура «клиент-сервер»
1.1.5 Принципы взаимодействия между клиентскими и серверными частями
1.1.6.Преимущества протоколов удаленного вызова процедур
1.1.7 Типовое разделение функций между клиентами и серверами
1.1.8 Архитектуры процессора базы данных
1.2. Архитектура с несколькими процессами
Глава 2 Intranet и архитектура «клиент-сервер»
2.1. Двухуровневая архитектура «клиент-сервер»
2.2 Трехуровневая архитектура «клиент-сервер»
2.3. Программы расширения серверной части
3.1 Технологический цикл обработки JAVA-программ
3.3 Типы данных, которые поддерживает JAVA-машина
3.7 Система команд JAVA-машины
3.2.1. Взаимодействие с серверами баз данных - JDBC
3.2.3 Принципы использования JDBC
3.2.4.Нетривиальные возможности JDBC
Глава 2 Intranet и архитектура «клиент-сервер»
2.1. Двухуровневая архитектура «клиент-сервер»
Web-браузер Источник данных
Web-сервер
NOS (Network Operation System)
Рисунок 6. Двухуровневая архитектура «клиент-сервер»
Разграничение функций между Web-браузером и Web-сервером является четким. Web-сервер предоставляет HTML-страницы, браузер отображает страницы путем интерпретации тегов HTML.
2.2 Трехуровневая архитектура «клиент-сервер»
Web-браузер Источник данных
Третий уровень
Программа расширения
сервера
HTML
Web-сервер
NOS
Рисунок 7. Трехуровневая архитектура «клиент-сервер»
Клиентский уровень занимает браузер, на уровне сервера находится сервер БД, а на промежуточном - Web-сервер и программа расширения сервера. Архитектурное решение позволяет уменьшить сетевой трафик и делает компоненты взаимозаменяемыми, повышает уровень безопасности. Данная архитектура затрудняет обработку транзакций БД через природу протокола HTTP, который не запоминает состояние (протокол используется для передачи данных между браузером и сервером БД).
Браузер посылает Web-серверу запросы на доставку Web-страниц (данных). Web-сервер обслуживает заявки на Web-страницы, запросы отправляет программе-расширению серверной части. Последняя принимает передаваемые запросы, преобразует их в форму, понятную серверу БД, и передает их серверу БД. Сервер БД выполняет работу по обслуживанию запроса и возвращает результат программе-расширению серверной части. Он превратит результаты в формат, приемлемый для браузера, передаст их Web-серверу, а тот - браузеру.
2.3. Программы расширения серверной части
Одной из главных причин использования программ-расширений серверной части на промежуточном уровне является возможность использовать стандарты, которые существуют для двух крайних уровней, путем осуществления трансляции между ними. Другие применения расширений серверной части состоят в поддержании соединений между БД с целью уменьшить в сети трафик и в поддержке резерва соединений между БД для уменьшения затрат ресурсов на открытие / закрытие БД. Расширение серверной части также поддерживают взаимозаменяемость в своих стандартных интерфейсах. Поэтому Web-серверы и серверы БД сравнительно легко наращивать или заменять. Существует 3 категории расширений серверной части: с обычным CGI, с гибридным CGI и с API.
Глава 3. Технология JAVA
3.1 Технологический цикл обработки JAVA-программ
Технологический цикл подготовки, трансляции, редактирование внешних связей, тестирование, отладки и выполнения Java-программ такие же, что и для других языков программирования, они интерпретируются, но с одним отличием - при редактировании внешних связей необходимые компоненты могут доставляться по сети. Java-приложения могут появляться в двух ипостасях - самостоятельное приложение и как апплет, т.е. совокупность объектов, выполняемых в среде браузера. С точки зрения программиста, апплет и приложение отличаются местами входа и жизненным циклом.Приложение как место входа имеет метод:
public static void main (String args[]);
Метод должен быть определен в том public-классе, который находится в файле, выполняется виртуальной Java-машиной. В параметр args передается массив строк - параметров командной строки. Так, программа, печатает аргументы:
public class myTop {
public static void main (String args[]) {
int argc = args.length;
for (int i = 0; i < argc; i++)
System.out.println (argc[i]);
}
}
Апплет выполняется в контексте браузера и его жизненный цикл определяется следующими методами класса Applet:
• public void init () - вызывается браузером при загрузке апплета;
• public void start () - вызывается браузером при показе страницы;
• public void stop () - вызывается браузером, когда тот идет с Web-страницы;
• public void destroy () - метод предназначен для освобождения ресурсов; аналог деструктора, но не вызывается автоматически; всегда вызывает stop () и вызывается при выходе из браузера и при перезагрузке апплета.
Пример: апплета
1. import java.awt.Graphics;
2. import java.applet.Applet;
3. class SimpleApplet extends Applet {
4. public void paint (Graphics g) {
5. g.drawString (10, 10, «Hello world!»);
6. }
7. }
Апплет выглядит так.
Метод paint (строки 4-6) определяет, как апплет перерисовывает себя, когда оконный менеджер посылает браузеру запрос на перерисовку.
Включение апплета в WWW-страницу производится так: В языке HTML 2.0 предусмотрены специальные конструкции <applet> и <PARAM>. Первая задает имя класса, загружает и размеры области в окне броузера, выделенного апплета. Конструкция <PARAM> служит для передачи информации с WWW-страницы в ту среду, в которой будет выполняться апплет.
<applet code=SimpleApplet.class width=200 height=100>
<PARAM NAME=font VALUE=«TimesRoman»>
<PARAM NAME=size VALUE=«12»>
<h3>Если вы видите этот текст,
то ваш новигатор не поддерживает Java </h3>
</applet>
Данный фрагмент содержит пример включения апплета в WWW-странице. Браузеры игнорируют неизвестные конструкции, в навигаторе не поддерживает Java, то будет текст «Если вы видите этот текст, то ваш навигатор не поддерживает Java».
Получить значения, передаваемые с помощью конструкции <PARAM>, можно так:
public void init () {
String fontname = getParameter («name»);
String fontSizestring = getParameter («size»);
int theSize = Int.parseInt (fontSizeString);
. . .
}
3.2 JAVA-машина
Java-компилятор транслирует исходные тексты Java-программ в коды Java-машины. Вообще говоря, Java-машина - виртуальна в том смысле, что она не существует в виде реальных микросхем и других устройств, а представляет собой программный эмулятор, выполняется на какой-либо традиционной аппаратной платформе.
Идея языковых процессоров не нова. Известны попытки внедрить так называемый P-код в качестве стандарта на результат работы Паскаль-компиляторов; в свое время много писали о языке и машину Форт; была выполнена аппаратная реализация РЕФАЛ-машины и пр.
В контексте проекта Java спецификация виртуальной машины - часть комплекса мер, которые направлены на стандартизацию Java-среды на обеспечение ее независимости от аппаратно-программной платформы. Учтем при этом специфическую среду, в которой должны готовиться и работать Java-приложения. Если Web-страница содержит Java-аплеты, эти аплеты будут передаваться по сети. Получается, нужно, чтобы Java-код был более компактным; в противном случае время загрузки страницы рискует стать большим. Архитектура и система команд Java-машины проектировались так, чтобы способствовать компактности кода. С другой стороны, формат команд Java-машины прост (команды не имеют операндов и занимают один байт), поэтому возможно ее эффективная эмуляция. По этой причине программы, которые подготовлены для выполнения на Java-машине, часто называют байтами-кодами.
3.3 Типы данных, которые поддерживает JAVA-машина
Java-машина поддерживает следующие стандартные типы данных:
• byte - однобайтовые целые числа;
• short - двухбайтовые целые числа;
• int - четырехбайтовые целые числа;
• long - восьмибайтовые целые числа;
• float - четырехбайтовые действительные числа в формате IEEE-754;
• double – восьмибайтовые действительные числа;
• char - двухбайтовые беззнаковые символы в кодировке Unicode.
Поскольку Java-компилятор в состоянии проверить типы данных во время трансляции, при выполнении нет нужды ассоциировать дополнительную информацию со значениями стандартных типов. Вместо этого генерируются команды, рассчитанные на обработку данных определенных типов. Так, для добавления целых чисел будет сгенерирована команда iadd, а для добавления действительных чисел двойной точности - команда dadd.
Значение типа boolean представляются однобайтных целыми числами и обрабатываются с помощью соответствующих команд.
Есть еще 2 стандартных типа данных:
• object - четырехбайтовые ссылки на объект (массивы трактуются как объекты)
• returnAddress - четырехбайтовое адресов возврата из метода.
Спецификации Java-машины не описывают внутренней структуры объектов. В реализации Sun Microsystems значение типа object указывает на указатель, что сохраняет две ссылки - на таблицу методов и на данные объекта. Возможны и другие представления. Java-машина является 32-битной. Более длинные значения (long, double) представляются как пары четырехбайтовое величин. Не оговаривается, в каком порядке располагаются элементы пары; более того, верификатор байт-кодов обязан выявлять и отвергать программы, пытающиеся «вручную» установить длинные значения.
3.4 Регистры
В Java-машине должны поддерживаться следующие регистры:
• pc - счетчик команд указывает на код операции для команды, которая будет выполняться следующей.
• vars - базовый регистр для доступа к локальным переменным текущего метода.
• optop - указатель на вершину стека операндов. Java-машина является стеков, поэтому основная часть команд берет операнды из стека и туда помещает результат.
• frame - указатель на структуру, содержащую окружение времени выполнения.
В свою очередь, согласно времени выполнения используется для реализации 3-х целей: динамической загрузки, возврата из методов обработки исключительных ситуаций. Для обеспечения динамической загрузки, окружение времени выполнения содержит ссылки на таблицу символов текущего метода и текущего класса. Перед выполнением метода производится редактирование его внешних связей (настройка ссылок на внешние методы и внешние данные). Подобное настройки ссылок делает сгенерированный код устойчивым относительно изменений во внешних классах. Для обеспечения нормального возвращения из методов выполняется восстановление регистрового окружения метода.
Для обработки исключительных ситуаций Java-машина выполняет проход по стеку вызовов методов и ищет внутреннюю конструкцию catch, обрабатывающее исключительное событие. Окружение выполнения может содержать и дополнительную информацию, нужную для отладки, но в спецификациях Java-машины.
3.5 Указатели
В языке Java нет указателей. Считалось, что работать с указателями трудно, а их применение приведет к ошибкам, выявляющих трудности. Поэтому разработчики Java отказались от использования этих указателей.
Если нужно передать ссылку на переменную базового типа, такого, например, как int или long, то ничего не получится - переменные базовых типов передаются по значению, а не по ссылке. Поэтому нельзя прямо создать на языке Java эквивалент следующей программы, составленной на языке С:
// Некоторая переменная
int nSomeValue;
// Функция, которая меняет значение переменной,
// заданной своим адресом
void StoreValue(int *pVar, int nNewValue)
{
pVar->nNewValue;
}
. . .
StoreValue(&nSomeValue, 10);
Язык Java позволяет использовать вместо указателей ссылки на объекты. Пользуясь этими ссылками, можно адресовать объекты по имени, вызывая методы и изменяя значение данных объектов. Что касается данных базовых типов, если надо передавать на них ссылки, но надо заменить базовые типы на соответствующие классы. ТАк, вместо типа int использовать класс Integer, вместо типа long - класс Long и т.д.
Инициализация объектов должна выполняться с помощью конструктора:
Integer nSomeValue;
nSomeValue = new Integer(10);
Первая строка создает неинициализированную ссылку nSomeValue и типом Integer. При попытке использования ссылки возникнет исключение. Вторую строчку создает объект класса Integer, вызывая конструктор. Конструктор определяет начальное значение. После выполнения оператора присваивания ссылки nSomeValue будет ссылаться на реальный объект класса Integer и ее можно использовать. Имя объекта nSomeValue типа Integer можно передавать функциям в качестве параметра, причем это будет ссылкой на объект.
Создавая программы на языке С, использовались указатели для адресации элементов массивов, созданных в оперативной памяти динамически или статически. Зная начальный адрес такого массива и тип элементов, хранящихся в нем, можно адресоваться к отдельным элементам массива. В языке Java осуществлен механизм массивов, исключающий необходимость использования указателей.