|
*** |
Метод обновления данных в Internet-магазине. Часть 2Евгений Вересов <veresov@com.psc.ru> В первой части статьи были сформулированы требования к программе. Программа должна: 1. Cчитывать данные из локальной БД Access, передавать иx через Internet на сервер и там записывать в базу данных MySQL. Все эти функции должны выполняться автоматически, в обязанности оператора входит лишь инициация процесса. 2. Считывать данные из БД MySQL сервера, отображать их на машине клиента, предоставлять возможность оператору клиентской машины корректировать отдельные записи или группы записей в БД сервера. Первая часть требований была реализована в первой части статьи. В этой части автор расскажет о том, как организовать просмотр и редактирование данных в серверной базе данных MySQL. Технология реализации второй части задачиИзвестно, что с клиентской машины на сервер, в Servlet на исполнение может быть отправлен любой SQL-оператор, например: - SELECT; - UPDATE; - INSERT; - DELETE; ................ Ограничения, накладываемые на множество используемых операторов, определяются, с одной стороны, множеством SQL-операторов, поддерживаемых MySQL, и, с другой стороны, требуемой функциональностью приложения. После выполнения SQL-оператора Servlet извещает клиентское приложение. Для одних SQL-операторов - это признак нормального завершения операции либо код ошибки, для других, как, например, для SELECT - это еще и считанные данные. Рассмотрим алгоритм реализации задачи. Алгоритм реализации просмотра данных. Последовательность действий такова: - сформировать оператор SELECT; - передать сформированный оператор через Internet на исполнение Servlet; - Servlet должен принять оператор, подключиться к MySQL, выполнить принятый SQL-оператор, передать данные клиентскому приложению; - клиентское приложение должно принять от Servlet содержимое запроса и отобразить его в объекте класса JTable. Какие данные может запросить пользователь? Это может быть полное или частичное содержание одной или группы таблиц БД MySQL. Запросы могут быть предопределены приложением. Однако в общем случае пользователь может запросить любые данные. Поэтому упростим ситуацию и будем считать, что запрос набран пользователем в объекте класса JTextArea и считан в программе командой: String query = jTextArea.getText(); где, JTextArea jTextArea. Но вы скажете, что пользователь не обязан знать язык SQL-запросов, и будете абсолютно правы. Запрос можно формировать с помощью меню, checkbox и других полезных компонентов, но это определяется требованиями конкретного приложения. Следующий шаг состоит в том, чтобы передать оператор на сервер. Как передать запрос, содержащий SQL-оператор на сервер, подробно описано в пунктах 4-6 первой части статьи, и автор просит заинтересованного читателя обратиться туда. Предположим, что запрос благополучно доставлен в Servlet и ждет своей реализации. Подключимся к базе данных, выполним оператор SELECT, сформируем данные, отправим их клиенту. В литературе (2) предлагается к использованию пара замечательных классов DBResults и DBResultsTableModel, а также методика их применения. Автор ввел дополнительный конструктор и метод в класс DBResults и задействовал их в своем приложении. Итак, Java текст Servlet, реализующий запрос клиентского приложения: 1. Подключимся к базе данных MySQL: Class.forName(driver); Connection connection = DriverManager.getConnection(url, username, password);. где, String driver = "org.gjt.mm.mysql.Driver"; String url = "jdbc:mysql://" + host + "/" + dbName; String host, dbName, username, password; 2. Создадим объект класса DatabaseMetaData и получим данные о MySQL: DatabaseMetaData MySQLMetaData = connection.getMetaData(); String dbName = MySQLMetaData. getDatabaseProductName(); String dbVersion = MySQLMetaData. getDatabaseProductVersion(); 3. Создадим объект класса Statement и выполним присланный оператор SELECT: Statement statement = connection. createStatement(); ResultSet resultSet = statement.executeQuery(query); 4. Создадим объект класса ResultSet MetaData и найдем количество и имена столбцов в считанных данных: ResultSetMetaData resultsMetaData = resultSet.getMetaData(); Количество столбцов: int colCount = resultsMetaData. getColumnCount(); Массив имена столбцов: String[] colNames = new String[col Count]; for(int i=0; i<=colCount; i++) { colNames[i] = resultsMetaData.getColumn Name(i+1).trim();} 5. DBResults MySQLResults = new DBResults(connection, dbName, dbVersion, colCount, colNames); 6. Сформируем MySQLResults: while(resultSet.next()) { String[] row = new String[colCount]; for(int i=1; i<colCount+1; i++) { String entry = resultSet.getString(i); I f (entry != null) { entry = entry.trim(); } row[i-1] = entry; } MySQLResults.addRow(row); } 7. Создадим выходной поток: ObjectOutputStream pout = new ObjectOutputStream(response.getOutput Stream()); 8. Отправим считанные данные клиентскому приложению: pout.writeObject(MySQLResults); 9. Закроем поток. pout.flush(); pout.close(); Работа Servlet на этом завершена. Теперь дело за клиентским приложением - надо принять и отобразить данные. Делается это так: 1. Откроем входной поток и примем данные: ObjectInputStream in= new ObjectInputStream(con.getInput Stream()); DBResults. MySQLresults = (DBResults)in.readObject(); где con - объект класса URLConnection, созданного при передаче запроса на сервер; 2. Отобразим результат запроса в таблице: DBResultsTableModel model = new DBResultsTableModel(MySQLresults); table.setModel(model); table.updateUI(); где table объект класса JTable; Работа клиентского приложения на этом завершена. Корректировки данныхКак нетрудно предположить, для изменения данных в серверной БД автор предлагает использовать SQL-операторы: - DELETE; - UPDATE; - INSERT. Эти операторы определяются пользователем клиентского приложения, пересылаются Servlet на исполнение, выполняются там, а результат возвращается в приложение. Определение и пересылка на сервер операторов, подключение к базе данных выполняется аналогично оператору SELECT, и автор не будет на этом останавливаться. А вот выполнять в Servlet их нужно таким образом: DatabaseMetaData MySQLMetaData = connection.getMetaData(); Statement statement = connection.createStatement(); ResultSet resultSet = statement.executeQuery(query); DBResults MySQLResults = new DBResults(0); где query - SQL-оператор. При возникновении ошибки происходит исключение. Код ошибки передается клиентскому приложению в составе объекта класса DBResults и считывается методом int getError(). ВыводыИспользуя приведенную выше методику, можно удаленно просматривать и обновлять базу данных. Но нет спокойствия в стане Linux/Apache/Tomcat/Java. "Проклятые" конкуренты из страны Win32/IIS/MS SQL/Visual C++ выделение/копирование/вставку в базу данных выполняют парой щелчков мышью, а запрос формируют с помощью визуальных средств. И они правы, не царское это дело - пользователю с SQL-операторами работать. Но вот как это реализовать в Java - тема отдельной статьи. Литература1. Патрик Ноутон, Герберт Шилдт. JAVA 2. Пер. с анг. СПб.: БХВ-Петербург. 2000. 2. М. Холл. Сервлеты и JavaServer Pages. Библиотека программиста. СПб. : Питер 2001. Источник: http://www.comprice.ru/ |
|
Copyright © "Internet Zone", info@izcity.com |