ТРЕНДСЛЕДЯЩАЯ МЕХАНИЧЕСКАЯ ТОРГОВАЯ СИСТЕМА 
на валютном рынке FOREX, генерирующая торговые сигналы с применением современных математических методов. Позволяет обрести уверенность в принятии Вами торговых решений.
Подробнее: www.forex-gold.com.ru  

реклама у нас

***

Метод обновления данных в Internet магазине

Евгений Вересов

Причины разработки программы

Если вы владелец или разработчик магазина в Internet, и ваш сервер находится на площадке у провайдера, то эта статья для вас. Предлагаемая методика позволяет обновлять информацию в базе данных магазина удаленно, используя обычное коммутируемое соединение с Internet. Телефонная линия, модем и приложение под Windows - это все, что нужно.

При разработке программы автор исходил из предположения, что базу данных для магазина хорошо бы готовить под Windows, например, в MS Excel или MS Access, а затем передавать на сервер. И еще, было бы не худо видеть на локальном компьютере содержимое базы данных сервера, ну и корректировать его. Маленькая деталь - сервер работает под Linux (Unix).

"Однако, черт возьми, как?"
"Записки о Шерлоке Холмсе"

А. Конан Дойл.

Состав программного обеспечения

Определим состав программных средств сервера Internet-магазина.

Операционная система: Linux (Unix);

Web-сервер: Apache;

CУБД: MySQL;

Контейнер для выполнения Servlets и JSP: Tomcat;

Интерпретатор Java;

Ну и собственно Servlet(s) - это тот Java-модуль, который возьмет на себя все хлопоты по работе с базой данных на стороне сервера.

На стороне клиента задействованы:

Операционная система: Windows;

СУБД, работающая под Windows и имеющая JDBC-драйвер, например, MS Access. Возможно использование MS Excel или MS Word.

Интерпретатор Java;

Клиентское Swing GUI Java-приложение, работающее с локальной и серверной базами данных, ну и с оператором тоже. Куда же от этого умника деться?

Сформулируем задачу

Программа должна:

1. Cчитывать данные из локальной БД Access, передавать иx через Internet на сервер, и там записывать в базу данных MySQL. Все эти функции должны выполняться автоматически, в обязанности оператора входит лишь инициация процесса.

2. Считывать данные из БД MySQL-сервера, отображать их на машине клиента, предоставлять возможность оператору клиентской машины корректировать отдельные записи или группы записей в БД сервера.

Протокол обмена данными HTPP. Языки разработки приложения: Java, SQL.

Автор не делает никаких предположений относительно того, как готовятся данные в БД Access, это легко реализуется разными методами и средствами.

Автор не рассматривает серверную бизнес-логику в части, не касающейся обмена данными.

Отметим также, что описываемая программа предназначена для обслуживания магазина и никак не заменяет Web-броузер - инструмент пользователя.

"..Соломон родил Равоама; Равоам родил Авию; Авия родил ...."
Книга нового завета. От Матфея.

Стих 7.

Алгоритм реализации первого пункта задачи

Предельно упростим задачу. Мы имеем две таблицы: PRICE - локальной базы данных MS Access и SALES - серверной базы данных MySQL. Задача в том, чтобы перенести данные PRICE в SALES через Internet.

Опуская обременительные детали Java- кода, например, такие как try {...} catch (...) {.....}, кратко рассмотрим алгоритм реализации задачи.

1. Подключимся к БД Access посредством моста JDBC-ODBC.

Class.forName("sun.jdbc.odbc.JdbcOdbc Driver");

Connection Connect = DriverManager.get Connection("jdbc:odbc:price");

где, price - источник данных ODBC.

2. Используя SQL-оператор "SELECT * FROM PRICE", считаем данные в объект класса ResultSet.

Statement statementAccess = Connect. createStatement();

ResultSet resultSetAccess = statement Access.executeQuery ("SELECT * FROM PRICE");.

3. Подготовим SQL-оператор INSERT. Укажем в операторе перечень полей SALES и соответствующие им значения, считанные из таблицы PRICE базы данных Access.

while (resultSetAccess.next())
{
a = resultSetAccess.getString(1);
b = resultSetAccess.getString(2);
c = resultSetAccess.getString(3);
d = resultSetAccess.getString(4);
f = resultSetAccess.getString(5);
query= ("INSERT INTO SALES (Id, SalesGroupId, Name, Property,...)" +
"VALUES (" + a + "," + b + "," + c + "," + d + "," +....+ ")");
.................
}
где,
a, b, c, d, f, query - объекты класса String, содержащие значения полей PRICE.

Id, SalesGroupId, Name, Property - имена столбцов таблицы SALES.

Интересный момент! Данные первой записи из таблицы PRICE БД Access входят в состав оператора INSERT, приготовленного для таблицы SALES.

4. Позаботимся о том, чтобы отправить оператор INSERT на сервер и выполнить его там, записав данные в таблицу SALES, для этого мы должны определить параметры:

- http-адрес сервера Internet, к которому мы собираемся обратиться;

- драйвер базы данных MySQL;

- url базы данных сервера;

- имя базы данных, в которую мы намерены записать данные;

- имя и пароль пользователя, с которыми мы собираемся войти в базу данных.

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

String http= httpField.getText();
String host = hostField.getText();
String dbName = dbNameField.getText();
String username = usernameField.getText();
String password = String. valueOf(passwordField.getPassword());
String tip="0";

Полностью сформированная строка, подлежащая передаче на сервер, выглядит так:

String postData= "1=" + encoded Value(driver) +
"&2=" + encodedValue(url) +
"&3= " + encodedValue(username) +
"&4= " + encodedValue(password) +
"&5=" + encodedValue(query) +
"&6=" + encodedValue(tip);
где,
String driver = "org.gjt.mm.mysql.Driver";
String url = "jdbc:mysql://" + host + "/" + dbName;

5. Следующий шаг состоит в том, чтобы связаться с выбранным сервером и передать данные. Делается это одним из стандартных для Java способом:

- создать URL;

- открыть, по созданному URL, новое соединение и настроить его;

- создать выходной поток и поместить в поток подготовленные данные;

- закрыть выходной поток;

- создать входной поток;

- принять ответ сервера;

- закрыть входной поток.

Текст, реализующий перечисленные функции:

URL server = new URL (http);
URLConnection con= server.openConnection();
con.setDoInput(true);
con.setDoOutput(true);
con.setUseCaches(false);
con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
DataOutputStream out1 = new DataOutputStream(con.getOutputStream());
out1.writeBytes(postData);
out1.flush();
out1.close();
ObjectInputStream in= new ObjectInputStream(con.getInputStream());
results = (DBResults)in.readObject();
in.close();.

Второй интересный момент! Оператор INSERT содержащий данные из БД Access, отправлен на сервер в составе строки postData .

6. Рассмотрим серверную логику в части обмена данными.

Отметим, что на сервере при запуске Linux стартует ряд служб и прикладных программ.

Среди них:

- WEB сервер Apache;

- СУБД MySQL;

- Контейнер сервлетов Tomcat.

Tomcat сконфигурирован таким образом, что при своей загрузке он инициирует запуск сервлетов.

Примечание. Как сконфигурировать Тоmcаt, чтобы он при своем старте загружал сервлеты - тема отдельной статьи.

Напомним, что сервлет - это объект класса HttpServlet библиотеки javax.servlet.http языка Java, изначально спроектированный SUN для реализации серверной логики. Вкупе с этим классом почти всегда используются интерфейсы:

- HttpServletRequest;

- HttpServletResponse;

- HttpSesison.

Сервлет реализует функции:

- прием от клиентской программы и выделение переданных параметров, необходимых для подключения к БД MySQL;

- подключение к базе данных;

- выполнение SQL-оператора, в данном случае INSERT для занесения строки данных в таблицу SALES базы данных MySQL;

- создание выходного потока и отправки с ним результата выполнения SQL-оператора.

Прием и выделение параметров выполнено так:

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType(CONTENT_TYPE2);
String driver = null;
String url = null;
String username = null;
String password = null;
String query = null;
String tip = null;
Enumeration e = request.get ParameterNames();
while(e.hasMoreElements())
{
String pname =(String)e.nextElement();
switch (Integer.parseInt(pname))
{
case 1:
driver=request.getParameter(pname);

break; case 2: url=request.getParameter(pname);
break;
case 3:
username=request.getParameter(pname);
break;
сase 4:
password=request.getParameter(pname);
break;
case 5:
query=request.getParameter(pname);
break;
сase 6:
tip=request.getParameter(pname);
break;
}
}
}
где,
rivate static final String CONTENT_TYPE2 = "text/html; charset=КОИ8_R".

Java развивается весьма стремительно и сейчас, год спустя, автор написал бы этот фрагмент по-другому.

Подключимся к базе данных MySQL:

Class.forName(driver);

Connection connection = Driver Manager.getConnection(url, username, password);.

Вот где востребованы параметры базы данных, переданные от программы - клиента.

Выполним, наконец, оператор INSERT:

Statement statement = connection. createStatement();

ResultSet resultSet = statement. executeQuery(query);

DBResults dbResults = new DB Results(connection);

где public class DBResults implements Serializable{connection}

Все. Строка данных перенесена из локальной базы данных в базу данных сервера.

Известим программу клиента о результате выполнения операции, для чего создадим выходной поток и отправим в него результат операции:

ObjectOutputStream pout = new Object OutputStream(response.getOutputStream());
pout.writeObject(dbResults);
pout.flush();
pout.close();

При получении положительного ответа клиентом будет послана очередная строка из resultSetAccess.

Вывод: Нет никаких ограничений для передачи из программы клиента на сервер любых операторов SQL и выполнения их там.

Например, можно послать оператор SELECT и полученные данные отобразить у клиента, или передать на исполнение операторы LOAD DATA INFILE, DELETE, UPDATE, DROP.

Но об этом вы узнаете во второй части статьи.

Литература

1. Патрик Ноутон, Герберт Шилдт. JAVA 2. Пер. с англ. СПб.: БХВ-Петербург. 2000.

2. М.Холл.Сервлеты и JavaServer Pages. Библиотека программиста. СПб. : Питер, 2001.

Источник: http://www.comprice.ru/
   


Copyright © "Internet Zone"info@izcity.com 
Копирование и использование данных материалов разрешается только в случае указания на журнал "Internet Zone", как на источник получения информации. При этом во всех ссылках обязательно явное указание адреса вэб-сайта http://www.izcity.com/.
При наличии у копируемого материала авторов и источника информации - их также нужно указывать, наряду со ссылкой на нас. Подробнее условия использования материалов смотрите здесь.