Встраивание отчетов Crystal Reports в веб-приложения с помощью приложения Rational Application Developer, часть 4. Вставка динамических данных в отчеты Crystal Reports

 

Это 4 часть в серии из 5 статей, которая должна дать практические навыки по внедрению отчетов Crystal Reports в веб-приложения с помощью приложения IBM Rational Application Developer. В предыдущих частях данной серии статей отчеты Crystal Reports были предварительно разработаны и внедрены в страницы JavaServer или с помощью компонента Report Page Viewer, или программно, с помощью программного кода Java Reporting Component (JRC). Что особенно важно, отчеты проектировались с фактическими данными, для чего требовалось подключение конструктора отчета Crystal Report к таблице базы данных во время проектирования. В данной статье описывается совершенно другой подход, при котором отчет Crystal Report создается на основе выборки фактических данных, но без фактического подключения к базе данных во время проектирования отчета. Затем составляется программный код JRC для создания источника фактических данных, которые вставляются в отчет во время выполнения. Преимущество проектирования отчетов с помощью выборочных данных заключается в том, что можно использовать этот метод как обходной прием, если нельзя подключиться к базе данных с помощью внедренного конструктора отчетов Crystal Report, или по причине неправильной конфигурации среды, или из-за того, что внедренным конструктором отчетов не поддерживается прямое подключение Java Database Connectivity API (JDBC) к платформе базы данных.

Образец сценария разработки

В данной статье описываются основные шаги, необходимые для использования приложения IBM Rational Application Developer для вставки динамических данных в отчеты Crystal Reports в веб-приложениях.

1.      Извлечение данных с помощью инструментария обработки данных приложения Rational Application Developer.

2.      Создание нового веб-проекта с помощью технологии JavaServer Page (JSP) с включением отчетов Crystal Reports.

3.      Программная вставка динамических данных в отчеты Crystal Reports в странице JSP с помощью кода Java Reporting Component (JRC) приложения Rational Application Developer с последующим ее выполнением на сервере.

4.      Переключение на использование интерфейса Java Naming and Directory Interface (JNDI) вместо интерфейса Java Database Connectivity API (JDBC™) для вставки динамических данных в отчет Crystal Report.

В рассматриваемом примере используется приложение Rational Application Developer Version 6.0.1.1 с установленными по умолчанию функциями приложения Crystal Reports V XI. Большинство читателей, включая пользователей пробной версии Rational Application Developer, имеют доступ к среде тестирования IBM WebSphere Version 6. Поэтому в данной статье образец веб-приложения настраивается для выполнения в среде тестирования WebSphere V6.0.2.5, а не V5.1. В нем также используется приложение IBM DB2® Universal Database v8.1, содержащее базу данных SAMPLE, используемую для создания отчетов.

Дополнительную информацию о сценариях на основе отчетов Crystal Reports можно найти в справке приложения Application Developer (Help > Help Contents > Developing Web Applications > Crystal Reports > Creating Reports). Выяснить, где можно загрузить пробные версии данных продуктов, можно в подразделе IBM trial software в конце данной статьи в разделе Resources. Можно воспользоваться ссылкой Crystal Reports FAQs на странице поддержки Rational Application Developer Support (см. также Resources), чтобы найти ответы на любые вопросы по лицензированию, обновлению или по другим темам, относящимся к инструментарию Crystal Reports в приложении Rational Application Developer.

Шаг 1. Извлечение выборочных данных с помощью инструментария обработки данных приложения Rational Application Developer

На данном шаге используется инструментарий базы данных для создания подключения к серверной базе данных. Для проектирования отчета Crystal Report используется, в качестве примера, содержимое таблицы в шаге 2.

1.    В рабочей области Rational Application Developer перейдите к области Data (Window > Open Perspective > Data).

2.    Щелкните правой кнопкой мыши в области Database Explorer и выберите затем New Connection.

3.    Выберите Choose a Database Manager and JDBC Driver (см. рис. 1).

Рис. 1.Диалоговоеокно New Database Connection

 

4.    Щелкните Next.

5.    В диалоговом окне New Database Connection введите значения, показанные на рис. 2, затем щелкните Test Connection.

Рис. 2. Диалоговое окно указания параметров соединения

 

6.    Если тестовое соединение успешно, щелкните OK (рис. 3).

Рис. 3. Успешное тестовое соединение

 

7.    Щелкните Finish в диалоговом окне New Database Connection, чтобы завершить соединение с базой данных. Программой-мастером это соединение будет затем показано как Con1 в области Database Explorer.

8.    Щелкните правой кнопкой мыши таблицу Department в области Database Explorer, а затем щелкните Sample Contents, как показано на рис. 4.

Рис. 4.Область Database Explorer

 

9.    При правильной настройке базы данных в области DB Output на вкладке Results будет показано выборочное содержимое таблицы Department (рис. 5).

 

10.  Далее перейдите к окну Web (Window > Open Perspective > Web). В окне Web откройте область DB Output (Window > Show View > Other > Data > DB Output), чтобы можно было ссылаться на выборочное содержимое таблицы Department при создании отчета Crystal Report.

Шаг 2. Создание нового веб-проекта с помощью технологии JavaServer Page с включением отчетов Crystal Reports

На данном шаге создается новый веб-проект со страницей JSP. Затем будет создан новый отчет Crystal Report без фактического подключения к какой-либо базе данных, потому что этот отчет Crystal Report будет основан на файле описания данных. Этот файл определения данных представляет собой текстовый файл с разделителями табуляции и с расширением .ttx (TTX), структура которого соответствует структуре таблицы. Каждая строка в файле TTX содержит имя поля, тип данных, длину (если тип данных - строка) и одну порцию выборочных данных. Все это можно обеспечить на основе выборочного содержимого, показанного в области DB Output (рис. 5) на предыдущем шаге.

Для создания нового веб-проекта выполните следующие шаги.

1.    В рабочей области приложения Rational Application Developer создайте новый динамический веб-проект, выбрав File > New > Dynamic Web Project.

2.    В окне мастера New Dynamic Web Project, в диалоговом Dynamic Web Project введите значения, показанные на рис. 6.

Примечание.
Для данного примера необходимо выбрать для параметра Servlet version значение 2.4 и указать IBM® WebSphereIBM® Application Server V6.0 как значение для параметра Target Server, как показано на рис. 6.

Рис. 6.Диалоговоеокно New Dynamic Web Project

 

3.    Щелкните Next, а затем выберите Crystal Reports features в диалоговом окне Features, показанном на рис. 7.

Рис. 7.Диалоговоеокно Web Project features

 

4.    Щелкните Finish.

5.    В своем веб-проекте щелкните правой кнопкой мыши папку WebContent и затем выберите New > Crystal Report.

6.    В окне New Crystal Report Wizard введите значения, показанные на рис. 8.


Рис. 8.Окно New Crystal Report Wizard

 

7.    Щелкните Finish.

8.    В диалоговом окне Crystal Reports Gallery выберите параметр Report Wizard (рис. 9).


Рис. 9.Диалоговоеокно Crystal Reports Gallery

 

9.    Щелкните OK.

10.  В диалоговом окне Standard Report Creation Wizard щелкните Create New Connection > Field Definitions Only (см. рис. 10).


Рис. 10.Окно Standard Report Creation Wizard

 

11.  В диалоговом окне Field Definitions Only (рис. 11) щелкните Create File, чтобы начать создание нового файла определения данных. В качестве альтернативы можно щелкнуть кнопку с меткой ..., чтобы перейти к своей файловой системе для выбора существующего файла определения данных. Для данного примера, однако, создайте новый файл определения данных, щелкнув Create File.

Рис. 11.Диалоговоеокно Field Definitions Only

 

12.  Вернитесь к рис. 5 на шаге 1 и введите данные из первого столбца (DeptNo) в диалоговое окно Database Definition Tool (как показано на рис. 12), а затем щелкните Add, чтобы добавить это поле к новому файлу определения данных.

Рис. 12. Диалоговоеокно Database Definition Tool

 

13.    Затем, аналогично предыдущему шагу, обратитесь к таблице 1 ниже, и поочередно введите данные из всех столбцов, которые необходимо добавить.

14.  Затем щелкните Add в диалоговом окне Database Definition Tool.

 

Таблица 1. Поля, которые необходимо добавить в отчет Crystal Report

Field Name

Field Type

Length

Sample Data

DeptName

String

30

Spiffy Computer Service Div.

MgrNo

String

6

000010

AdmrDept

String

3

A00

 

15.  После добавления всех столбцов в диалоговом окне Database Definition Tool отобразятся записи, показанные на рис. 13.

Рис. 13. Диалоговое окно Database Definition Tool с записями всех столбцов

 

16.  Щелкните кнопку с крестиком вверху справа диалогового окна Database Definition Tool, чтобы закрыть его.

17.  Затем щелкните Yes в диалоговом окне (рис. 14), чтобы сохранить свои изменения в файле Department_dataDefinition.ttx в своей папке WebContent (рис. 15).

Рис. 14. Диалоговое окно для сохранения изменений в файле определения данных

 

Рис. 15. Сохранение изменений в папке WebContent

 

18.  После нажатия кнопки Save в предыдущем диалоговом окне управление возвращается диалоговому окну Field Definitions Only с полным путем к файлу определения данных Department_dataDefinition.ttx, указанным в текстовом окне Field Definition File (рис. 16). Затем щелкните Finish.

Рис. 16.Диалоговоеокно Field Definition File

 

19.  В диалоговом окне Data окна Standard Report Creation Wizard выберите вновь созданный файл определения данных из-под узла Field Definitions Only, а затем щелкните кнопку с меткой >, чтобы поместить свой файл определения данных в раздел Selected Tables (рис. 17).

20.  Затем щелкните Next.

 

21.  В диалоговом окне Fields (рис. 18) выберите все поля, которые необходимо отобразить в отчете Crystal Report, а затем щелкните Next.


Рис. 18.
Диалоговое окно Fields

 

22.  В следующих двух диалоговых окнах, Grouping и Record Selection (рис. 19 и рис. 20), оставив предварительно установленные значения по умолчанию, щелкните Next.

23.  Оставьте также значения по умолчанию, уже установленные в диалоговом окне Report Style (рис. 21), а затем щелкните Finish.

Рис. 19. Диалоговое окно Grouping

 

Рис. 20.Диалоговоеокно Record Selection

Рис. 21. Диалоговое окно Report Style

 

24.  Затем щелкните правой кнопкой мыши папку WebContent и щелкните Refresh. В результате в области Package Explorer под папкой WebContent появится файл Department_dataDefinition.ttx.

25.  Дополнительно можно дважды щелкнуть файл Department_dataDefinition.ttx, чтобы открыть его и удостовериться, что его содержимое аналогично показанному на рис. 22.

Рис. 22.Содержимоефайла Department_dataDefinition.ttx

 

Шаг 3. Программное создание объекта ResultSet с данными и его вставка в отчеты Crystal Reports во время выполнения

На данном шаге записывается программный код Java Reporting Component (JRC) для создания объекта ResultSet с данными и его вставки в отчет Crystal Report во время выполнения.

1.    Чтобы ознакомиться с полной распечаткой программного кода, необходимо загрузить файл SampleWebApplication.zip из раздела Download и извлечь его содержимое в свою локальную файловую систему для просмотра одного из двух файлов:

·         SampleWebEAR.ear. Здесь содержатся все файлы, необходимые для данной статьи (JSP, Crystal Report, файл определения данных и так далее). Можно импортировать его в рабочее пространство приложения Rational Application Developer по пути File > Import > EAR file и затем изменить код, чтобы указать настройки для своей среды.

·         jrc_set_resultset_datasource.jsp. Если уже успешно выполнены два предыдущих шага, то, скорее всего, нет необходимости изменять файл SampleWebEAR.ear. Файл jrc_set_resultset_datasource.jsp содержит только соответствующий исходный код JRC из шага 3 данной статьи, и можно использовать его отдельно, если остальные объекты уже установлены.

2.    Теперь измените файл jrc_set_resultset_datasource.jsp, чтобы он работал с отчетом Crystal Report (setResultsetDatasource.rpt), созданным в шаге 2.

3.    Измените значение переменной reportName, чтобы указать на отчет Crystal Report. Так как файл setResultsetDatasource.rpt был создан в папке WebContent, значение переменной reportName должно быть setResultsetDatasource.rpt, как показано в отрывке программного кода Распечатка 1.


Распечатка 1.
Изменение значения переменной reportName

               

final String reportName = "setResultsetDatasource.rpt";

4.    Измените значение переменной WebProjectName , чтобы указать на имя своего веб-проекта, как показано в распечатке 2


Распечатка 2. Изменение значения переменной WebProjectName для указания на имя своего веб-проекта.

               

final String WebProjectName = "SampleWeb";

5.    В отрывке программного кода в распечатке 3 из файла jrc_set_resultset_datasource.jsp используется интерфейс API приложения BusinessObjects Java Reporting Component для создания объекта reportClientDocument с последующим указанием для него файла setResultsetDatasource.rpt.


Распечатка 3.
Программный код, которым создается объект reportClientDocument

               

//---------- Создание объекта ReportClientDocument -------------

ReportClientDocument reportClientDocument = new ReportClientDocument();

//---------- Указание пути к местоположению источника отчета -------------

//Открытие отчета.

reportClientDocument.open(reportName, 0);

6.    В отрывке кода в распечатке 4 показан запрос SQL, используемый как основа для создания объекта ResultSet.


Распечатка 4.
Запрос SQL

               

//Запрос SQL, который можно использовать, можно получить в начале создания отчета

непосредственно из необходимого источника данных, а затем

//в отчетах Crystal Reports, пройдя по пути Database > Show SQL Query, чтобы просмотреть

запрос SQL, созданный для отчета. 

String query= "SELECT DEPTNO, DEPTNAME, MGRNO, ADMRDEPT FROM DEPARTMENT ";

7.    Вызов функции getResultSetFromJDBC(...) для получения объекта ResultSet, который содержит данные (см. распечатку 5).


Распечатка 5.
Получение объекта ResultSet, содержащего данные

               

//Вызов простой служебной функции для получения набора Java Result, который будет

//вставлен в отчет. 

ResultSet resultSet = getResultSetFromJDBC(query,

ResultSet.TYPE_SCROLL_INSENSITIVE);

8.    В распечатке 6 показан программный код функции getResultSetFromJDBC(...). По существу, это простой код JDBC для подключения к базе данных DB2 с последующим исполнением запроса к ней. Значения параметров (особенно jdbcurl and jdbcdriver ) для конкретного поставщика баз данных можно найти по ссылке JDBC Test в разделе Resources или в документации поставщика баз данных.


Распечатка 6. Программный код функции getResultSetFromJDBC(...)

               

private ResultSet getResultSetFromJDBC(String query, int scrollType)

throws SQLException, ClassNotFoundException {

//введите здесь свои имя пользователя и пароль

String username = "<Имя_пользователя_базы_данных>";

String password = "<Пароль>";

// драйвер jdbc и url-адрес jdbc для db2 версий 7.1 и 8.1

//измените jdbcurl=jdbc:db2:<Имя_базы_данных>, чтобы указать свою

базу данных

String jdbcdriver = "COM.ibm.db2.jdbc.app.DB2Driver";

String jdbcurl = "jdbc:db2:sample";

// загрузка класса jdbcdriver

Class.forName(jdbcdriver);

//Компоновка подключения к DSN.

java.sql.Connection connection = DriverManager.getConnection(jdbcurl,

username,password);

//извлечение предписания из объекта подключения

Statement statement = connection.createStatement(scrollType,

ResultSet.CONCUR_READ_ONLY);

//Выполнение запроса и возврат наборов результатов.

return statement.executeQuery(query);

}                                                           

                                                            

Выполнение образцов программного кода до следующего отрывка и что они представляют собой по отношению к следующему отрывку

Программный код в распечатке 7 извлекает таблицу базы данных, так как нее будут вставляться динамические данные. Затем код вставляет данные объекта java.sql.ResultSet в таблицу базы данных с помощью метода setDataSource() объекта DatabaseController.


Распечатка 7.Безподписи

               

String tableName = reportClientDocument.getDatabaseController().getDatabase().getTables()

.getTable(0).getName();

//Вставка в отчет объекта Java Resultset.  Затем он становится

//источником данных для отчета, когда создается сам отчет.

reportClientDocument.getDatabaseController().setDataSource(resultSet,

tableName , "resultTbl");

                                                            

Примечание.
Программным кодом отрывка в распечатке 7 вставляются данные в первую таблицу. Также предполагается, что объект java.sql.ResultSet, называемый resultSet, имеет структуру, соответствующую первой таблице.

Затем в отрывке программного кода в распечатке 8 из объекта reportClientDocument получается объект reportSource, который затем помещается в область сеанса.


Распечатка 8.
Без подписи

               

//Кеширование источника для отчета ReportClientDocument в сеансе.

session.setAttribute("reportSource", reportClientDocument.getReportSource());

                                                            

Наконец, в отрывке программного кода в распечатке 9 перенаправляется обозреватель на страницу просмотра (CrystalReportViewer_setResultSet.jsp).


Распечатка 9.Безподписи

               

request.getRequestDispatcher("/CrystalReportViewer_

setResultSet.jsp").forward(request,response);

                                                            

Выполнение программного кода setResultSet JSP

Рассмотрим теперь программный код файла CrystalReportViewer_setResultSet.jsp.

Программным кодом в распечатке 10 выполняются следующие действия:

·         извлечение из сеанса объекта reportSource;

·         создание экземпляра объекта CrystalReportViewer для создания объекта oCrystalReportViewer;

·         установка источника для отчета данного объекта oCrystalReportViewer для извлеченного из сеанса объекта reportSource.


Распечатка 10.
Без подписи

               

//Извлечение из сеанса объекта IReportSource и передача его программе просмотра

IReportSource reportSource = (IReportSource)session.getAttribute("reportSource");

//---------- Создание программы просмотра и отображение отчета -------------

//создание объекта CrystalReportViewer -------------

CrystalReportViewer oCrystalReportViewer =

new CrystalReportViewer();

//установка свойства reportsource для программы просмотра

oCrystalReportViewer.setReportSource(reportSource);

                                                            

В следующих трех отрывках программного кода устанавливаются атрибуты программы просмотра (объект oCrystalReportViewer).

1.    В первом, в распечатке 11, указывается, становится ли программа просмотра владельцем страницы. Установка для параметра setOwnPage значения true обеспечивает некоторые преимущества, позволяя программе просмотра полностью обрабатывать содержимое, включающее объекты HTML. Это уменьшает объем программного кода, который необходимо добавить в страницу JSP, и позволяет программе просмотра автоматически определять некоторые настройки.


Распечатка 11.
Без подписи

               

oCrystalReportViewer.setOwnPage(true);

                                                            

2.    В распечатке 12 указывается, становится ли программа просмотра владельцем формы. Если управление сервером является владельцем формы, можно извлекать и устанавливать значения для формы. В частности, если программа просмотра - владелец формы, то она может кешировать свое состояние на стороне клиента.


Распечатка 12.
Без подписи

               

oCrystalReportViewer.setOwnForm(true);

                                                            

3.    В отрывке программного кода в распечатке 13 указывается, использовать ли для печати режим печати PDF или ActiveX, когда пользователь нажимает кнопку печати. В режиме печати PDF отображается документ PDF, а затем пользователь может выбрать для него выполнение печати. В режиме печати ActiveX на компьютер клиента загружается элемент управления ActiveX для выполнения задания печати. Если режим печати ActiveX выбирается в системе, которая не поддерживает элементы управления ActiveX, по умолчанию устанавливается режим печати PDF.


Распечатка 13.
Без подписи

               

oCrystalReportViewer.setPrintMode(CrPrintMode.PDF);

// другим режимом печати является CrPrintMode.ACTIVEX

                                                            

Примечание.

·         Дополнительную информацию об упомянутых выше и других доступных атрибутах CrystalReportViewer можно найти в справке приложения Rational Application Developer (Help > Help Contents > Developing Web Applications > Crystal Reports > API Reference > Viewer Java Classes > Crystal Report Viewer).

·         В случае возникновения каких-либо проблем при печати или экспорте отчетов Crystal Reports (особенно показанного ниже исключения) необходимо просмотреть следующие ссылки в разделе Resources, чтобы получить справку по их разрешению.

o    WebSphere server throws runtime errors while exporting or printing the Crystal Reports

o    How to resolve the runtime errors while printing or exporting Crystal Reports


Распечатка 14.Безподписи

               

java.lang.IllegalStateException: SRVE0199E: OutputStream

already obtained

                                                            

Наконец, программным кодом в распечатке 15, обрабатывается и отображается отчет на веб-странице.


Распечатка 15.Безподписи

               

oCrystalReportViewer.processHttpRequest(request, response,

getServletConfig().getServletContext(), null);

                                                            

Чтобы выполнить страницу на сервере IBM WebSphere и просмотреть результаты.

1.    Щелкните правой кнопкой мыши страницу jrc_set_resultset_datasource.jsp в области Project Explorer и выберите Run > Run on Server.

2.    Вид в обозревателе страницы JSP, содержащей отчет Crystal Report, приведен на рис. 23.


Рис. 23. Просмотр в обозревателе страницы JSP, содержащей отчет Crystal Report

 

Совет:

·         Необходимо заметить, что функцией getResultSetFromJDBC() обеспечивается ввод имени пользователя и пароля для базы данных, поэтому в данном случае не выводится страница входа в базу данных (рис. 24).


Рис. 24. Страница входа в базу данных

 

Преимущества от направления, а не перенаправления обозревателя

·         В части 3 данной серии статей в конце файла jrc_begin_here.jsp использовался следующий программный код (распечатка 16) для перенаправления обозревателя на программу просмотра (CrystalReportViewer.jsp), которой затем отчет отображался в обозревателе.


Распечатка 16.
Без подписи

               

response.sendRedirect("CrystalReportViewer.jsp");

                                        

Однако в данном примере в конце файла jrc_set_resultset_datasource.jsp используется программный код, показанный в распечатке 17, для направления, а не перенаправления, обозревателя на программу просмотра (CrystalReportViewer_setResultSet.jsp).


Распечатка 17.Безподписи

               

request.getRequestDispatcher("/CrystalReportViewer_setResultSet.jsp")

.forward(request,response);

                                        

Причина этого изменения в том, что при попытке перенаправления обозревателя выводится сообщение об ошибке выполнения, показанное в распечатке 18.


Распечатка 18.
Без подписи

               

com.crystaldecisions.sdk.occa.report.lib.ReportSDKException: JDBC

Error: DSRA9110E: ResultSet is closed.---- Error code:-2147467259

Error code name:failed

at com.crystaldecisions.sdk.occa.report.lib.ReportSDKException.throw

ReportSDKException(Unknown Source)

                   

На рис. 25 показана соответствующая ошибка, отображаемая на веб-странице (вместо отчета Crystal Report).

Рис. 25. Ошибка выполнения при перенаправлении обозревателя на файл CrystalReportViewer_setResultSet.jsp

При таком подходе вызывается функция getResultSetFromJDBC(), в которой вводятся имя пользователя базы данных и пароль . Однако даже в таком случае, если источник отображаемой веб-страницы (которая содержит отчет Crystal Report) виден в обозревателе, создаваемый код HTML не содержит значения имени пользователя и пароля . Таким образом устраняется проблема безопасности, связанная с жестким программированием значений имени пользователя и пароля в отображаемой странице JavaServer Page. Однако, как и в части 3 данной серии, в качестве альтернативы функции getResultSetFromJDBC() можно использовать интерфейс JNDI. Подробное объяснение приводится в следующем разделе.

Шаг 4. Переключение на использование интерфейса JNDI вместо JDBC для вставки динамических данных в отчеты Crystal Reports

Если вместо использования подключения JDBC необходимо использовать интерфейс JNDI для просмотра предварительно сконфигурированного источника данных, чтобы извлечь набор ResultSet, можно заменить функцию, показанную в подшаге 9 шага 3 данной статьи, функцией getResultSetFromJNDI() (см. распечатку 19).


Распечатка 19.
Без подписи

               

private ResultSet getResultSetFromJNDI(String query, int scrollType)

throws SQLException, ClassNotFoundException {

//Код просмотра источника данных

Context ctx, env =null;

DataSource ds = null;

try{

ctx = new InitialContext();

ds = (DataSource) ctx.lookup("java:comp/env/robinDatasource");

}

catch(javax.naming.NamingException ne){

ne.printStackTrace();

}

Connection conn = ds.getConnection();

//Компоновка подключения к DSN.

//java.sql.Connection connection = DriverManager.getConnection

(jdbcurl,username,password);

Statement statement = conn.createStatement(scrollType, ResultSet.CONCUR_READ_ONLY);

//Выполнение запроса и возврат наборов результатов.

return statement.executeQuery(query);

}

Если выбрана такая альтернатива, необходимо выполнить следующие шаги.

1.    Сначала, с помощью функции getResultSetFromJNDI(), необходимо указать следующие два объекта:

1.    Источник данных. В части 2 данной серии (см. раздел Resources) просмотрите подшаги с 1 по 12 шага 4, чтобы узнать, как указать источник данных с именем jdbc/robinDS, которым используется запись аутентификации Java™ Authentication and Authorization Service (JAAS) с именем robinAlias в дескрипторе развертывания веб-приложения (файл application.xml). Эти имя источника данных и запись аутентификации JAAS понадобятся в следующем шаге.

2.    Ссылка на ресурсы. Прямые просмотры источников данных интерфейсом JNDI в серверах WebSphere V6 исключается. Вместо этого необходимо создать ссылку на ресурсы в своем дескрипторе развертывания веб-приложения (файл web.xml), указывающую на источник данных JNDI. О преимуществах использования ссылок на ресурсы можно узнать в подразделе Resource References раздела Resources.

2.    Далее выполните следующие шаги для указания ссылки на ресурсы в своем источнике данных JNDI.

A.    Откройте файл web.xml двойным щелчком мыши по нему в области Project Explorer.

B.    Перейдите на вкладку References.

C.   Щелкните Add, чтобы добавить новую ссылку на ресурсы.

D.   Затем выберите Resource Reference в появившемся диалоговом окне Add Reference (рис. 26) и щелкните Next.


Рис. 26. Выборпункта Resource reference вдиалоговомокне Add Reference

 

3.    В диалоговом окне Resource Reference введите значения, показанные на рис. 27, а затем щелкните Finish.


Рис. 27. Диалоговоеокно Resource Reference

 

4.    На вкладке References в области WebSphere Bindings введите указанные значения (рис. 28) для созданной ссылки на ресурс robinDatasource.

5.    JNDI name: Введите имя JNDI для своего источника данных (jdbc/robinDS).

6.    JAAS login configuration: Выберите Use Default Method и введите имя записи аутентификации JAAS для настроек своего источника данных (robinAlias).


Рис. 28. Остальные настройки ссылки на источник на вкладке References

 

7.    Сохраните изменения в файле web.xml, щелкнув File > Save.

Совет:
Обратите внимание на следующую строку в отрывке программного кода в распечатке 19 для функции getResultSetFromJNDI():

ds = (DataSource) ctx.lookup("java:comp/env/robinDatasource");

Фактически это просмотр ссылки на ресурс robinDatasource, который далее связывается с источником данных на основе JNDI с именем jdbc/robinDS. Этим подтверждается, что функция getResultSetFromJNDI() уже правильно настроена для использования ссылки на ресурс, созданной на предыдущих шагах.

8.    Теперь остается только изменить программный код в подшаге 8 шага 3 для вызова функции getResultSetFromJNDI() (JNDI), а не функции getResultSetFromJDBC() (JDBC).

Вызов функции getResultSetFromJNDI() определенно более безопасен, чем вызов функции getResultSetFromJDBC(), потому что в данном случае аутентификация выполняется с помощью записи аутентификации JAAS (robinAlias), сконфигурированной для источника данных (robinDS) с помощью имени JNDI (jdbc/robinDS).

Обработка исключений, которые могут происходить во время выполнения

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

·         Если выводится сообщение об ошибке выполнения драйвера JDBC (рис. 29), скопируйте файлы .jar универсального драйвера JDBC для DB2 ( db2jcc.jar, db2jcc_license_cu.jar и db2jcc_license_cisuz.jar) из каталога установки DB2 (\SQLLIB\java) в свой каталог установки WebSphere Application Serverv6.0 (\lib\ext).


Рис. 29. Ошибка выполнения драйвера JDBC

 

Если используется среда тестирования WebSphere V6.0, а не автономный сервер IBM® WebSphere® Application Server V6.0, каталог установки и каталог установки приложения Rational Application Developer (\runtimes\base_v6), после копирования файлов .jar перезапустите сервер, щелкнув правой кнопкой мыши его обозначение в области Servers и выбрав Restart > Start.

·         Если в области Console появилось сообщение об ошибке log4j, показанное в распечатке 20, необходимую информацию можно найти по ссылке How to resolve log4j errors.

Распечатка 20. сообщение об ошибке log4j

               

[2/14/06 17:38:36:435 EST] 00000031 SystemErr

R log4j:ERROR setFile(null,true) call failed.

[2/14/06 17:38:36:435 EST] 00000031 SystemErr

 system cannot

find the path specified)

                    at java.io.FileOutputStream.openAppend(Native Method)

                    at java.io.FileOutputStream.init(FileOutputStream.java:199)

                    at java.io.FileOutputStream.init(FileOutputStream.java:124)

                    at org.apache.log4j.FileAppender.setFile(FileAppender.java:272)

                    at org.apache.log4j.RollingFileAppender.setFile

                    (RollingFileAppender.java:156)

                   

Далее в этой серии

На этом завершается 4 статья серии из 5 частей о внедрении отчетов Crystal Reports в веб-приложения. В данной статье было рассмотрено использование компонента Java Reporting Component (JRC) приложения Rational Application Developer для вставки динамических данных в отчет, создаваемый на основе выборочных данных, а не фактических данных. Преимущество проектирования отчетов с помощью выборочных данных заключается в том, что его можно использовать как обходной прием в ситуациях, когда нельзя подключиться к базе данных с помощью внедренного конструктора отчетов Crystal Report, или по причине неправильной конфигурации среды, или из-за того, что внедренным конструктором отчетов не поддерживается прямое подключение JDBC к платформе базы данных.

Все более популярными становятся базы данных на основе языка XML. В части 5, которой завершается данная серия статей, описывается использование дополнительных функций JRC, таких как создание отчетов из данных XML, а не из таблиц реляционных баз данных. Если необходимо создавать отчеты Crystal Reports на основе данных XML, рекомендуется изучить данную статью.


Страница сайта http://test.interface.ru
Оригинал находится по адресу http://test.interface.ru/home.asp?artId=9202