Вопрос: На 8 слайде мы тоже что-то делали через JNDI. — КиберПедия 

Общие условия выбора системы дренажа: Система дренажа выбирается в зависимости от характера защищаемого...

Таксономические единицы (категории) растений: Каждая система классификации состоит из определённых соподчиненных друг другу...

Вопрос: На 8 слайде мы тоже что-то делали через JNDI.

2022-10-10 47
Вопрос: На 8 слайде мы тоже что-то делали через JNDI. 0.00 из 5.00 0 оценок
Заказать работу

Ответ: Там не всё. Там не хватает некоторых объектов, которые есть более подробно на 16 слайде.

1. Созданиеконтекста: Hashtableenv = newHashtable(); env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.fscontext.RefFSContextFactory"); env.put(Context.PROVIDER_URL, "file:" + directoryName); Contextcontext = newInitialContext(env); 2. Создание DataSource:    SQLServerDataSource ds = new SQLServerDataSource(); ds.setUser(user);    ds.setPassword(password); ds.setDatabaseName(databaseName);    ds.setServerName(serverName);    ds.setPortNumber(portNumber); 3. Регистрация context.bind("sql1", ds);

Нам нужен первый пункт, который называется «Создание контекста». Потому что нам нужно, чтобы наш объект (DataSourse), кто-то сохранил. Кто? Оснастка JDNI. Пункт 1 – это и есть использование того JNDIпростого ручного варианта реализации, который мы нашли, скопировали и всегда используем.

Итак! Что у нас получается?

Hashtableenv = newHashtable(); - у нас есть хэш-таблица.

Затем, в эту таблицу мы кладем какие-то замечательные строки. Это достаточно интересный код, если вы раньше с таким не сталкивались. Это интересный прием. Представьте себе, что вы создаете сложный объект и у него порядка двадцати настроек. Но все двадцать настроек вам одновременно никогда не нужны. Вам нужно всего несколько. Как написать конструктор в классе, чтобы можно было создать объект, у которого 20 настроек, но, чтобы могла быть совершенно любая комбинация этих настроек? Вы скажете: «Ну давайте сейчас возьмем число сочетаний из 20…». Сразу неправильно! Пишется один конструктор, который перед вами. Вот он! Пишется один конструктор и у него в качестве параметра хэш-таблица. А у хэш-таблицы помещается имя параметра и значение. И всё. Вам нужно 5 параметров? Невопрос. Имя-Значение; Имя-Значение; и т.д. А конструктор берет хэш-таблицу, читает ключи, в ключах лежат значения. Он их сверяет со стандартными, видит их и использует значения. И получается один конструктор, и абсолютно произвольное создание. Идея понятна? А иначе вам придется написать 20 конструкторов, потом вы будете их постоянно модифицировать.

env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.fscontext.RefFSContextFactory"); env.put(Context.PROVIDER_URL, "file:" + directoryName); Contextcontext = newInitialContext(env);

Первое, что мы должны сделать, это нажать на библиотеке правой кнопкой, добавить файл jar, и выбрать оставшиеся 2, которые были у нас в этой папочке library.

Всё. Теперь подключены все необходимые библиотеки для работы с этим командным вариантом JNDI. А вот теперь после того как вы подключили библиотеки вы можете нажимать на лампочку.

Нажимаете на лампочку. Она спрашивает: «Добавить оператор HashTable?». Конечно!

Далее у нас идет Context. Вот тут будьте очень аккуратны, потому что Context’ов этих очень много. Мы выбираем первый вариант: javax.naming.Context.

Еще у нас подсвечен InitialContext. Находим javax.naming.InitialContext

Теперь давайте внимательно смотреть, что за значение мы кладем в эту хэш-таблицу? «com.sun.jndi.fscontext.RefFSContextFactory». Что это? Это кто будет обслуживать данную JNDI. Вот этот класс. А второй параметр – обязательный. Куда он будет сохранять? И здесь в качестве directoryNameя обычно пишу «C://». В корень пусть кладет свою регистрацию, которую он для вас делает. Всё.

Вопрос: Этот объект Context кто будет регистрировать - Contextcontext = newInitialContext(env)?

Ответ: «context.bind("sql1", ds);». Вот под таким именем вся регистрация и сохранится – «sql1».

И осталось только теперь аккуратно вместо вот этих вот имен подставить те значения, которые мы собираемся сохранить. Ну и сам объект DataSourceнужно тоже подключить. Вот он, видите? «SQLServerDataSource». Левой кнопочкой добавить оператор импорта для SQLServerDataSource.

И дальше поехали. userменяем на «sa», пароль меняем на «1234»? название базы данных у нас «AdventureWorks»,

Вариант преподавателя – у него была MSSQL
SQLServerDataSource ds = new SQLServerDataSource();   ds.setUser("sa"); ds.setPassword("1234"); ds.setDatabaseName("AdventureWorks"); ds.setServerName("10.10.110.21"); ds.setPortNumber(1433);
Мой вариант – у меня MySQL

Видите? Вся информация в этом объекте. А потом я вызываю context.bind("sql1", ds); и информация сохранена. И это делается один раз. Или делается ответственным человеком на сервере в контейнере-приложений.

Итого:

Запускаю F6. А теперь давайте посмотрим в корень диска C://. Внизу появился файлик со странным именем.

Его можно открыть, т.к. это обычный текстовый файл.

Вот наша регистрация. Видите sql1?

Кстати, если еще раз попытаться запустить программу, то она говорит: «дружок, sql1-то у меня уже есть». Т.е. случайно никто регистрацию не сотрет. Изменить – да, а стереть – нет.

Считайте так, что на конкретном сервере приложений данная регистрация выполняется, все это выполняется, информация хранится, и ее никто пальцем не трогает. И ее меняют только ответственные люди.

Понятно, как оно происходит? DataSource–заполнили – и под каким-то замечательным именем сохранили.

А теперь код, относящийся к DataSourceзакомментируем.

Вопрос: Зачем я этот код закомментировал?

Ответ: Последней строчкой после которой мы можем пойти на честно заработанный чай – мы должны сделать клиентскую сторону сделать, которая работает через Context. Вы должны понимать, что это «рукопашная» реализация. Этот объект Contextотсутствует, а он является частью серверной оснастки, т.е. на сервере контейнере-приложений он существует. Поэтому его не надо было создавать ни в первом случае, ни во втором. Но у нас здесь его нет. Так что Contextнам нужен, т.к. без него никуда. В рукопашную мы его создали. А дальше мы из этого объекта Contextставим точку и говорим «lookup». Мы говорим: «Поищи нам, пожалуйста, «sql1»!»

DataSource ds = (DataSource)context.lookup("sql1"); ds.getConnection();

Что вернет lookup()? Какой у него тип возвращаемого значения? Object. Какой слабый тип возвращаемого значения! Все дело в том, что тот, который мы объявляем DataSource–это интерфейс. Может быть его не было, когда делали первую версию.

Ответ из зала: Ну там же не только DataSourceможет быть, а много чего еще можно положить.

Ответ препода: Понял. Если имеется ввиду, что там будет регистрация не только БД, а чего угодно, то тогда согласен. На сервере-приложений в контексте лежит регистрация других классов, чтобы я не писал newи имя_класса. Тогда совершенно верно. Это общая идеология.

DataSourceмного! Поэтому если вы ошибетесь и выберете из списка не, то имя, то у вас ничего хорошего не выйдет.Нам нужен javax.sql.DataSource.

Нажимаю F6 и я нормально подключаюсь к БД. У препода все работает, однако у меня нет.

Поиск в интернете дал следующий результат: надо настроить права пользователя (GRANTPRIVILEDGES)

Это позволяет писать достаточно гибкий и легко модифицированный администратором код. Так подключаются все объекты на сервере. Любой сторонний объект, который вам нужен для работы он подключается через JNDI.

Проект закрываем. Идем дальше.

А вот эту схему мы должны изучить. И пойдем мы снизу-вверх. DriverManager у нас есть – он выдается вместе с библиотекой. И у нас первый объект, который мы должны изучать по этому слайду – это объект Connection. Я сказал «объект», хотя вы помните, что я говорил «интерфейс». Все, что в рамочки на этой схеме обведено – это интерфейсы. Почему? Это правильно. Я вообще не хочу знать, как какая-то фирма назовет свой объект, который отвечает за связь или еще за что-нибудь. Для этого существует стандарт. Делай как хочешь. Только ты реализуй интерфейс с его 50 методами. Все. Я получаю ссылку на твой объект и вызываю те методы, которые задокументированы.

Давайте мы откроем библиотеку. Она нам тоже пригодится.

Помните мы говорили про современный стиль написания освобождения ресурса? tryс ресурсами. Видите, какой интерфейс autoclosableреализован у этого объекта Connection. Его можно вставить в tryс ресурсом и сам компилятор вам сгенерирует блок finally, в котором вызовет метод close() из этого интерфейса и все ресурсы, которые этот объект занимал, будут освобождены. В нашем случае Connectionбудет разорван, но в случае наличия пула - объект вернется в пул.


Поделиться с друзьями:

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

История развития пистолетов-пулеметов: Предпосылкой для возникновения пистолетов-пулеметов послужила давняя тенденция тяготения винтовок...

Состав сооружений: решетки и песколовки: Решетки – это первое устройство в схеме очистных сооружений. Они представляют...

Историки об Елизавете Петровне: Елизавета попала между двумя встречными культурными течениями, воспитывалась среди новых европейских веяний и преданий...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.022 с.