������ � ����� ������ �� Java-�������� � �������� �����������
��������
����������, ��� ������������ ������ � ����� ������ �� ������������ ����� ���������������� � ���� ����� �� ������������ ������� ���������. ����� ����, � ���� ����� ���������������� ����� ����� ����������� �������������� �� ���� � ������������ ���������� � ��� ������� ������� � ����� ������, �������� � ������� �����������. � ���� ������ Java �� ������������ ����������. ��� � ������ JDK1.1 �������� ����� ������� java.sql, �������������� ����������� �������, ��������� � ���� ������� ������������� ODBC-����������. � ���� ������ ���������� ��� ������������� �������, ��������: java.sql.CallableStatement, ������� ������������ ���������� �� Java �������� ��������; java.sql.DatabaseMetaData, ������� ��������� ���� ������ �� ������� �� ����������� ������� � ����������� � ���������� ����� ������������� ������ � ����� � ���������� ������, �������, ��������, ������ � �.�.; �������, - java.sql.ResultSetMetaData, � ������� �������� ����� �������� � ������� ���� ��� ����������� ���������� �� ������ ���� ������ ��� �������� ���� ���������� � ���� �������� ������ � �������.������, �������� ������� Java �� ������ ������������ ������ ���������������� ����������� � ���, ��� ���� � �� �� ������� ������� � ����� ������, � ������� ��������������� � �������������������� Java, ����� ������������ ����������� �����, ��������� ��� ������������ ����������� ��������-��������������� ����������, WWW � Intranet/Internet. ���������� �� ������� ��� �������� ������������� Java-�������� ��� �������������� � ������ ������.
1. Java-��������� � ������� � ����������� JDBC-ODBC
JDBC (Java Database Connectivity) �������� �� ����������, � ����������� � ������� �� ������������� SAG CLI (SQL Access Group Call Level Interface - ��������� ������ ������ ������ ������� SQL).
��� �� ���� JDBC �������� �� ����� � ���������� �������� ���������� � ������ ODBC. ���� � ��������� JDBC API � ������������� ����������� ������ �� ������ ����� ODBC, � � ����� ������������� ������ ������ � ����� ������ �� ����- ��� ����-������� ����� (��. ���.1), ��� ����� ���������� ������� ����, ��� ����������� ������������ JDBC-ODBC-Bridge ���������� ����������� ����� � ����� ����� �������������� ����������� (��. ���. 2)

���. 1. ���������������� ������ � ���� ������ �� 3-�-������� �����.

���. 2. ����� �������������� �����������.
���� ������� ������� �� ���. 2 ������ ����������, ����� ������ - ����� ����� �������������� ����������� � Java ������������ ������� ���������� ����� ���� �������� ����� ODBC � �� ���������� ������������ �������-��������� � ��������� ���� � ������� �������������� ����������������� ����������. JDBC Driver Manager - ��� �������� ����� JDBC-�����������. ��� ��������� ������� ����� ������ - ��������� Java-��������� � ��������������� JDBC ������� � ����� ����� �� ����. �����������, ��� ODBC ��� ���� � �������� ������ JDBC ��-�� ��� ������������ ����� ����������� ����������� ������������ ����������� � �������������. �� ����� ��������� �������� ������ - � ����� ������ ����� JDBC � �� ����� �� ���� ������������ ������������ ������ � ODBC-��������� ��������������� �� Java? ������� �� ���� ������ ����� ���� ������ ����������� ���. ���� ����� JDBC-ODBC-Bridge, ��� �� �������, ����� ��������� ������� ������.
1. ODBC ������ ������������ ��������������� �� Java, ��������� �� ������� �� C-����������. ����� �� Java C-���� �������� ��������� ��������� Java, ��������� ����� � ������ � ������ ��������� ������-�����������.
2. ������� ODBC C-API � Java-API �����������. � �������, Java �� ����� ����������, � �� ����� ��� � ODBC ��� ������������.
3. ODBC ������� ������ ��� ���������. � ��� ������� ������� � ������� ����, ������ ������� ����� ������ ����������� ��� ����� ������� ��������.
4. Java-API ���������, ����� �������� ��������� ������ Java �������. ����� ODBC ������������, �� ODBC-������� � ODBC �������� ������ ���� �������������� �� ������ ���������� ������. � �� �� �����, JDBC ������� ������� ��������� �� Java � ����� ���� ����� ��������� �� ����� ��������� �� ������� ����������� �� �����������.
JDBC API - ��� ������������ Java-��������� � ������� SQL ����������� �, ��������� ��� � �������� ���������� ��������� ODBC, �� ����������, ���-����, ��� ��������� Java-���������, ������������� � ���������� ������� ������� Java.
� ������� �� ���������� ODBC, JDBC ����������� ������� �����. ������� ��� ������ �������� �������, ������������ ������ JavaSoft ��� ������� �� JDBC � ���������� ������. ���� ������� �������� ����� ������� � �������� ������� JDBC � ���������� DriverManager. ��������, �������������� �������� Internet, ���� ������ � �������� �� ������������ �������������� ��� ������ URL.
jdbc:��� ���
� ��������� ������� ������ ODBC ����� ���� ������������ ��� ������� �������� ������� � ���� ������, ��������:
jdbc:dcenaming:accounts-payable,���
jdbc:dbnet://ultra1:1789/state
� ��������� ������ ����� URL //ultra1:1789/state ������������ �����
������, ��� ��� ���������� ����, ���� �����, ���-���� ������������ �������� ODBC ��������� ��� ��������������� � �����������. ��������� �������������� ����� ��������� JDBC � ODBC ����������� ������ JavaSoft � �������������� � InterSolv � ���������� JDBC-ODBC-Bridge. ��� ����������� � ���� JdbcOdbc.class (��� ��������� Windows JdbcOdbc.dll) � ������ � �������� JDK1.1. ������ JdbcOdbc-��������� ������ ������������ ����������� �������� (����������), ������� ��������� ���������������� ������ � ����� ������ ����� ����������� ��������� ODBC. ��� ������� ��� ���������� ����������� � ����� ODBC.INI. �� ���������� ������ JDBC-ODBC-Bridge ���������� ������ Java � ������ ODBC � ��� ����� ��������� ������������ ����� ������������ �������� ODBC, ������� � ���������� ������� ��������� � ��������.
���������� �������� ���������� �� Java c �������� � ��������� ������������ ������� ��� ���� � ������� dBase-�������.
// ��������� ��� �� Java ������������ ��� ������. ������� ������������ // ��������������� �������� url, login, � password, �, ����� ������������ // SQL ���������� �� ������ �������� �� � ���� ������. //-------------------------------------- // // Module: SimpleSelect.java // // ��������: ��� ��������� ��� ODBC API ����������. Java-���������� // ����� �������������� � JDBC ��������, �������� select �������� // � ���������� ���������� � ������� // // �������: JDBC � ODBC ���� // // �����: Karl Moss (�.������ ����������� ��� ������ � ����������) // // ����: ������ 1997 // // Copyright: 1990-1996 INTERSOLV, Inc. // This software contains confidential and proprietary // information of INTERSOLV, Inc. //-------------------------------------- import java.net.URL; import java.sql.*; import java.io.*; class SimpleSelect { public static void main (String args[]) { String url = "jdbc:odbc:dBase"; String query = "SELECT * FROM my_table"; try { // �������� jdbc-odbc-bridge �������� Class.forName ("sun.jdbc.odbc.JdbcOdbcDriver"); DriverManager.setLogStream(System.out); // ������� ���������� � ���������. ������ �� // ������������������ ��������� ����� �����������, ���� // �� ����� ������ ���, ������� ������ ���������� ���� URL Connection con = DriverManager.getConnection(url, "", ""); // ���� �� ������ �����������, �� ���������� exception // (�������������� ��������). ������, ���� �� �������� // � ��������� ������ ���������, ������ �� ������� ����������� � URL // �������� � ������ ��������� �� �������� ���������� // checkForWarning (con.getWarnings ()); // �������� DatabaseMetaData ������ � �������� // ���������� � ���������� DatabaseMetaData dma = con.getMetaData (); //System.out.println("\nConnected to " + dma.getURL()); //System.out.println("Driver " + //dma.getDriverName()); //System.out.println("Version " + //dma.getDriverVersion()); //System.out.println(""); // ������� ��������-������ ��� ������� // SQL ���������� � ������� Statement stmt = con.createStatement (); // ���������� ������, ����� �������� ResultSet ������� ResultSet rs = stmt.executeQuery (query); // �������� ��� ������� � ���� �� ������ ����������� dispResultSet (rs); // ������� �������������� ����� rs.close(); // ������� �������� stmt.close(); // ������� ���������� con.close(); } catch (SQLException ex) { // ��������� SQLException. ���������� � // ������� ���������� �� ������. �������, ��� ��� // ����� ���� ��������� ������, ��������� ������ // //System.out.println ("\n*** SQLException caught ***\n"); while (ex != null) { //System.out.println ("SQLState: " + // ex.getSQLState ()); //System.out.println ("Message: " + ex.getMessage ()); //System.out.println ("Vendor: " + //ex.getErrorCode ()); ex = ex.getNextException (); //System.out.println (""); } } catch (java.lang.Exception ex) { // ������� ��������� ������ ���� exception, ����������� ��. ex.printStackTrace (); } } //---------------------------------- // checkForWarning // �������� � ���������� ��������������. ������� true ���� // �������������� ���������� //---------------------------------- private static boolean checkForWarning (SQLWarning warn) throws SQLException { boolean rc = false; // ���� SQLWarning ������ ��� �������, �������� // ��������������� ���������. if (warn != null) { System.out.println ("\n *** Warning ***\n"); rc = true; while (warn != null) { //System.out.println ("SQLState: " + //warn.getSQLState ()); //System.out.println ("Message: " + //warn.getMessage ()); //System.out.println ("Vendor: " + //warn.getErrorCode ()); //System.out.println (""); warn = warn.getNextWarning (); } } return rc; } //---------------------------------- // dispResultSet // �������� ������� ���������� ����������� //---------------------------------- private static void dispResultSet (ResultSet rs) throws SQLException, IOException { // ���������� ����������� ���������� � // ��������� ��� �������� ������� ������������� ������ int i, length, j; String cp1 = new String("Cp1251"); // �������� the ResultSetMetaData. ��� ����� ������������ // ��� ������ ���������� ResultSetMetaData rsmd = rs.getMetaData (); // �������� ����� ������� � �������������� ������ int numCols = rsmd.getColumnCount (); // �������� ��������� ������� for (i=1; i<=numCols; i++) { if (i > 1) System.out.print(","); //System.out.print(rsmd.getColumnLabel(i)); } System.out.println(""); // �������� ������, �������� �� �� ��� ���, ���� �� ����������� // �������������� ����� boolean more = rs.next (); while (more) { // ���� �� �������� for (i=1; i<=numCols; i++) { // ��������� ������ ���������� ��������� ������� ������������� // ����� �� ������� ���� ������ � �������� ������, ������ ��� � // ��������� ����� ������� ����� ���� ������������ ������������ // �������. ���� ������������ ����������� ����� - getString - �� ������ // ���������� �����������. ������ ����� ������� ��������� � Unicode, // ����� �������������� � ������ Windows � ������ ���������� ���� InputStream str1 = rs.getUnicodeStream(i); byte str2[]; byte str3[]; int sizeCol = rsmd.getColumnDisplaySize(i); str2 = new byte[sizeCol+sizeCol]; str3 = new byte[sizeCol+sizeCol]; length = str1.read(str2); // ����� ����� ������ ���� �� ������, ������� ���������� ������ // ���������������� ������ k=1; for (j=1; j<sizeCol*2; j++) { if (str2[j] != 0) { str3[k]=str2[j]; k=k+1; } } String str = new String(str3,cp1); System.out.print(str); } System.out.println(""); // �������� ���������� ���� � ������ more = rs.next (); } } }
� ���� ������� ���������, ���������� �� ��������� ����������, ���� ����������� ���� ��������� ���������, ����������� ������������ �� ��� ������ � ���������� ������ ������, ���������� ������� � ������ � ������������� ���������. ���� � ���, ��� ���� Java ������������� ���������� �������������� �� Unicode � ������� � ������������ � �������������� �� ����� ������ ��������� �������������� (��� ���������� locale), ��� �������������� �� ������ ��������� �� ��������� � ������������� ������, ��������, ����� ������������� ������ ��������� �� ��������������� � Java-���������, � ���������� �� ������� ����������, �������� �� ��� ������ ����� ��������� ������������� �����. �� �� ��������, ��� �� ������ �����, ��������� � ��� ������������� ���������, ���������� � ������ ������������ � Web-���������.
2. ����-��������������� Java-����������
2.1 RMI-����������
����� ��������� ������� (RMI - Remote Method Invocation) ������������ �������� ������������ ����� Java �����������, ���� ���� ��� ����������� �� ������ �����������, ����������� � ��������������� ������ ������� ����.
������ ����������� RMI ����������� � ���, ��� �� ������������ ��������������� ��������� ��� ������ � ������ � ������� �� ������� TCP. ������� ������������ ��� � ���, ��� �� ���������� ��� ��������� ����� �������� �������, ���������� �� ������� �������, ���, ��� ���� �� ��������� ������ ������������� ��������. RMI ����� ������ � ����� �����������, ��� ���������, ���������� �� �������, �� �� ������� ���������� Java-�������� �� ����� ������ ����������. ������� ����������, ��� �� ������, ����������� �������������� ��� ���� �� TCP/IP ���������.
���������� �������� ���� ��� ���������� ����������� RMI-����������:
- ���������� ��������� �������� � ����� ��� ������� � �������
- Java-����������
- RMI-����������
- ����������� .class-������ � ��������������� ����������
- �����������
- ����� �������
- ����� �������
��������� ���� ������ ���������� ��� ������� � �������, ������������� �� ����� � ��� �� ������, ������, ���������� ����� �������� ����� � ������� ��������� ��� ��������, ������������� �� ������ ������� � ���� � ��������� ������������. ��������� ������� ���� ����� � ������ ��������� � ����������� ����, ��������� ����������� �� �������.
��� �������� RMI
�� ����������� Java-���������, ����� ������� ������ ������, ������� ����� ������������ ���������, � ���������e�� ����� ������, ������� ����� ���� ������� ��� �������. ������ ����� ������������ RMI-��������� � ������� ������� ��� ������, ����������� ������� ������������������ � ��������� ��� ������ �� URL-���������� �����, ��������:
rmi://localhost/LookupServer������, ��������� ��� ������, ����� �������� �������� ������ � ������ ������, � �������� ��������� ������ � ����. ����� ��������� ����� ����� ��������� � ������� RMI ����������� � ������������ �� ����������������� ���� � ���������������� ����� �������, ������� ���������� ������������ � ������� TCP/IP.
���������� ���������� ���������� ����
RMI ������������ ������� Java, �������������� ����� ����� �� ������, ���������� �� ����, ��� ��� ������� ���������. ������ ��� ��� �������� ������, � �������� ����� ���������� ������������, - ��� ����������� ����������, ������������ ������, ������� �������� ������������-������������.
// Lookup.java import java.rmi.*; public interface Lookup extends Remote { public String findInfo(String info) throws RemoteException; }
Java.rmi.Remote - ������ ���������, ������� ���������, ��� ��� ��������� ������, - ��� ������� ������, ����������� �����("Lookup") �������� ���������� ��������. ��� ������ � ��������� ���������� ������ ���� ��������� ����� ���������� ���� Java.rmi.RemoteException, ������� �������������� ������ ���, ����� ����� ���������� ������ ���� ����.
���������� ���������� ����
����� ���� ��� �� ���������� ��������� � ���������� �������, ����� ��������� ��������� ��� - ����������� ��� �������. ������ ������������ ��������� ��������� � ������� ������� �������, ������� ����� ������������-���������.
��� ������ ������� ��� ����� ��������� ��������� �������:
// LookupServer.java import java.io.*; import java.util.*; import java.rmi.*; import java.rmi.server.*; public class LookupServer extends UnicastRemoteObject implements Lookup { private Vector save = new Vector(); public LookupServer(String db) throws RemoteException { try { FileReader fr = new FileReader(db); BufferedReader br = new BufferedReader(fr); String s = null; while ((s = br.readLine()) != null) save.addElement(s); fr.close(); } catch (Throwable e) { System.err.println("exception"); System.exit(1); } } public String findInfo(String info) { if (info == null) return null; info = info.toLowerCase(); int n = save.size(); for (int i = 0; i < n; i++) { String dbs = (String)save.elementAt(i); if (dbs.toLowerCase().indexOf(info) != -1) return dbs; } return null; } public static void main(String args[]) { try { RMISecurityManager security = new RMISecurityManager(); System.setSecurityManager(security); String db = args[0]; LookupServer server = new LookupServer(db); Naming.rebind("LookupServer", server); System.err.println("LookupServer ready..."); } catch (Throwable e) { System.err.println("exception: " + e); System.exit(1); } } }
������ ������ � ��������� ���� ������ ��������� � ����� � ��������� �� ���������. ����� findInfo ���� ����� ������ ��� � �������.
������ ���� ������:
Ivanov, Ivan 295-0083
Petrov, Peter 775-9958
Romanov, Alexander 555-7779
�������, ��� LookupServer �������� ����������� ������������ ������ java.rmi.server.UnicastRemoteObject � ��������� Lookup. ���� �� ���� ������� ������������ ��������� �������� ���������, ����������� ��� ��������� ��������, � ������ ���������� ������, ������� ����� ������� ������������.
��������� ������ ������������
�������� ������� ����� ����� ���� - ��, ��� ���������� � ��������� main(). ������ ����� ����� ���������� ������. RMI ��������� ��������� ��������� .class ����� � � ���� ������ ���������� �����-������ web-������� � ��� ���������� �� �������� ��������, ��� ���� �� ���� ������ �����������. ���� �� �� ���������� ������, �� �� ��������� ������ ����������� ������ ��������� �����, � RMI �� ����������� �� ����� �������� � ������ �������������. ��� ��� �� ������ ���������� security manager, ����� ������� ��������� �������� ��������� .class ������.
������� LookupServer ����� �������������� � ������� ������ Naming.rebind � ���������� ��������� ������� �� �����.
�� ����� �� �������� ��������, ��� ��������� ����� ���������� ���������� ����������, ���� ������ �� �������� �������� �������� ���� � ������� TCP/IP ����������? ��� ���������� �� ������, ��������� ������ � ������ ���������� ��� ���������� ��������� � ����� ��� ������������ ����� �����. ��������������� .class ����� ������������ �� ���������� .class ����� ����� RMI ����������, ��������� ����.
�������������, ����� stub(��������) �������� ���:
public class LookupServer_Stub extends java.rmi.server.RemoteStub implements Lookup, java.rmi.Remote { ... }
� �������� - ���:
public class LookupServer_Skel implements java.rmi.server.Skeleton { ... }
������������� �������:
Javap -c LookupServer_Stub
����� ���������� ����-��� � �������������� ��, ��� ���������� �� ������.
����(stub) -��� �������� ��� ���������� �������, � �������� - ����� �������� �� �������, ������� ������������ ��������� ������.
���� ������������ ������� ������ �������� �� ������� �������, � �������� - �� ������� �������. ��� ���� ������������ �������������� �������� � ���������������� �����, � ����� ������, � ����� ������, ������������ � ������� ��������� TCP/IP
���������� ����������� ����
// LookupClient.java import java.rmi.*; import java.rmi.server.*; public class LookupClient { public static void main(String args[]) { try { RMISecurityManager security = new RMISecurityManager(); System.setSecurityManager(security); String host = "localhost"; String server = "LookupServer"; String name = "rmi://" + host + "/" + server; Lookup look_obj = (Lookup)Naming.lookup(name); String results = look_obj.findInfo(args[0]); if (results == null) System.err.println("** not found **"); else System.out.println(results); } catch (Throwable e) { System.err.println("exception: " + e); System.exit(1); } } }
���� �� ������������� ������, �������� ������ ���������� ������, �� ������ ��� ������������ ������������ ����� �� ��� � �� �������. URL ��� ���� ������������ ���:
Rmi://localhost/LookupServer��� localhost - ��� ���������� ���������� (IP, ����� = 127.0.0.1), ������������� ��� ������. ������ ������������� �� ��� �� ����� ������. �� ������ ����� ������������ � ��������� ������� ���. ����� ����� � ������� ������ ������, ���������� ��������������� ���������� �������.
���������� ����
��� ����� - Lookup.java, LookupServer.java, � LookupClient.java ������������� ��� � ������ � Java:
javac Lookup.java javac LookupServer.java javac LookupClient.java
���������� RMI �����������
����� ����, ��� �� �������������� ��� �����, ��������� RMI Compiler (rmic):
rmic LookupServer
����� �������� LookupServer_Skel.class � LookupServer_Stub.class �����.
�����������.class ������ � ��������������� �� ����� �� �����
�� ������ ����������� ���������� ����� (Lookup.class, LookupClient.class, � LookupServer_Stub.class) � ����������, ������ �� �� ������� ��������� ��� ������.
�� ������ ����������� ��������� ����� (Lookup.class, LookupServer.class, LookupServer_Skel.class, � LookupServer_Stub.class) � ����������, ��� ��� ������ ���������� ��� ���������� �������.
�����������
������, � �������� ���������� ������������, ������ ���� ������ � ������� ��������, �.�. ���������������. � JDK 1.1 ������� ����������� ���������
Rmiregistry
Rmiregistry ����� ����������� ��� � ��������� ���� ��� ��� ������� ������� �� �������.
����� �������
�� ������ ���������� ������ �� �������:
java LookupServer database_name
� �������, ���� ���� ���� ������ � ������� ���� � ��������� ��������� � ����� C:\PHONE.TXT, �� �� ������ ���� �������:
java LookupServer C:\PHONE.TXT
����� �������
���������� ��������� ���������� �� �������:
java LookupClient Ivanov
"Ivanov" - ��� ������� ��� � ����.
����� �������, RMI ���� ����������� ��������� �������������� Java-to-Java ���������� ���������, � ������� ������ ��������� �������� Java ���������� �� ������ Java-�������� �� ��������� ������� ��� ��� ���, ���� �� ��� ������ ���������� ��������. �����������, ��� �������� ����������� ����� ���������� ������������ ��� ������ � SQL-���������, ������� ������������� Java-API ��������� ��� ������� � ������. ��������, � ������ ��������� Informix � Informix Client SDK ���� �������� Informix Object Interface for Java, ��� ���������� �������������� �������, ��� ������������ ����������������� RMI-���������� � �������� � ����� ������ Informix. ����� ����, ������� � ��������������� RMI-������, ������� �������� ����� ������� � �������� �������, ������� ����� �������� ������������. � ��������, ����������� ���� ������ ����� ������������ ��� ������ � ������ ������ ������ � SQL-���������, ���� �� ������ ����� ������� ������� Java-API ��������� ��� ������� � ����� ������. � ������� ������ �� ������������ � ������������� JDBC � RMI-�����������, ���� ���� �� ��� ����� � ����������� ������� ����������. � Informix, ��������, ��� ����������������� �������������� � ������ ������ ���������� ��� RMI-������: informix.api.remote.rmi - ��� ��������� �������� � informix.api.remote.rmi.server - ��� rmi-�������. ��� ���� � ���������� ���������� ������������ ��������� � DBMSManager, ������� ����������� ���������� ��� ���� �������� Informix � ����� ������, � �� ������ ���������� ���� ���������, ���� ��������� ���������� � ����� ����� RMI ������. ��� ���������� ���������� ��������� DirectDBMSManager ������. ��� ���������� ���������� ��������� RMIDBMS-Manager ������ � ���������� � ���������������� RMI �������. ������������ RMI ������� �������������� � �����:
rmi://hostname[:port]/ //�������� DBMSManager ������� DBMSManager getDBMSManager() throws Exception { // based on RMI Checkbox, get appropriate DBMSManager DBMSManager dbmsManager; if (RMIcheckbox.getState()) dbmsManager = new RMIDBMSManager(rmiServerTextField.getText()); else dbmsManager = new DirectDBMSManager(); return dbmsManager;
���� �������������� � ����� �������������� � ������� ����������� �������������� ������� � ������� ���������� ��������, ������� ����� ���������� ��� ��������, ��� � ������������. � ��������� ����� � SQL-�������� ��� ����� �������������� �� �������, �� ���� ������ ������������������ - ������ � ������������� Java-API ��������� ������ ������������ ����.
2.1 Java, ����������������� � ����
Java ����� ���� �������� � ���� ���������� ��������� �������� � ��� ���� ������ ����������� ������� ����� ���������� �����:
- ���������� ������������ ����� ���������������� ��� ��������� �������� ��������. � ������ ������������ ����������� ������ Java � ���������� ��������� JDBC. ����������� ������� � ����������� ����� ���������������� ��������� ������ ����������� �������� �������� �� ����� SQL.
- ���������� ��������� ����� ������. �������, ���������� �� ����� Java ����� ��������� � ���� �������� � ����������� �������. ��� ��������� ��������� � ������������ ������������ ���� ������. Java-����� ����� ���� ����������� � �������� ���� ������ ��� ������� �������. ������ ���� ����� ������ ���������� ����������� ���������������� Java-������. � �������� ������� ������� ������� ����� �� ����� Java, �������� ������. ���������� ��� ����� ���� ������� � ������ ������. ��������, ��������� ������ ����� ����������� ������ � ����� Street � Postal Code(�������� ���), � �������� ���� City ����� ����������� �� ������ ��������� �������. ����� ����, ����� ������������ ������������ ������� � �������. ��� ���� ����������� ���������� ������� � ����������� �� ������������� ������. ��� ����� ������� ������ US_Address � Rus_Address, �������������� �� �������� ������ Address. � ������ ����� ������ ����� ���� ������ ������ ����������� ������� �� ��������� ������� � ������ �������� ��� ��������, ����������� ������ ��� ������ � ���. ���� ��� SQL ����� �������������� ��� ������� � Java-��������, ��� ��� ��� ������� � Sybase Adaptive Server.
��������� ������ ��������� ����� ������ � �������:
INSERT INTO employees (id, name, Address) VALUES(1789, "Serg Dunaev", new Rus_Address("58 Gagarin Street", "153038") )
��������� ������ � �������������� Java-�������� ���������� ������ �����������, ������� �� ��������� �����:
SELECT name FROM employees WHERE Rus_Address.street="Gagarin Street"
- ������ ����������� ������. ������� ���������� ����������� ���������� ����� ����� ���������� ����� ����������� �����������, ��������� ���������� � ����. ������������ ������ ������������ ������ ����������� ������ �� ���� ������� �������������� �������. ������������ ��������� �� Java ������� �� ������ �������. ��� �� ������������� ���������� �������� ����������� Java-������� � ����. ������ ������ ���� ��������������� � ����-��� � ��� �����, ������ ��� ������������� � ����� ����������� ������. � ����� � �������������� ����������� ������ ��� ���������� ������� �� Java � ���������� ��������� ���������� JDBC, ���� � ��� �� ������ �� ����� Java ����� ���� ����������� ��� ������, ��� � ��� ����.
3. Java-��������
���� ������� ��������� ���������������� Web-���������, �� �������� ��������� ���������������� Web-�������� � �������� ������ ��������� ����������������. � ��������� ����� ������ ������������ ������������ ��������, ����������� �������� ��� ��������, ������ ��������, ������� �� ����� ������ ��������� �, ������� ������ ����������� � ��������� Web-�������, �����������, � ������� �� ������� CGI-��������� ��� ��������, ���� ����� �������� �����������.
3.1 �������� �� ���� Java Web Server
�������� �������� ���������, ������� �������� ������������� ���������, � ������� �������� �� ����� �������� ���������� � Java-��������������� Web-�������. � ������� �� ��������, ��� �������� ������������ Java-��������� (��� ������� � GUI-�����������), �� ����, ������ ������������������� � ����������� ������������ �, ��������� ��� ����������� Java, ��� ����� ������������ ����������� ����� HTML � ����������������� � ����� ���������. �����������, ��� �������� ����� ������������ � ���������� ��� ������� � ����� ������, ������������ ��� ��������� �������� � ����� �� ��������. � ��������� ����� ����������� Web �������� ������������ ���������� ���������. Java Web-Server ����� ���, ��� ��� �� �������� ����� ��������� ��� ����������. ����������� Servlet-API ���������� ��� � ����� Java Web Server, ��� � � ��������� �������� JSDK, �� ������� � ������ 1.2, �� ������� � ������ JDK. ����������� ������������ ��������� �������� ��, ��� ��� �� ������� �������� ����� ��������� ��� ������ ����� �������. ��������� ��������� ����������� ����������� � ������ ������ �������� �� ������� � �� ����� ������������������ ����������� ��� CGI, ��� � Fast-CGI ���������� (��. ���.3).


���. 3. ��������� �������� �� Web-�������.
�������� �� ��, ��� �������� ���������� HTTP-��������, �� ��� ������������� ������������� ������� ��� ������ ����� ������� � ��� ����� �������� �� ��������������. � ���������, ����� �� ����������� ��������, �����-����, ��������� �������� ������������� ������������� ��������. ���� � ���, ��� ����������� ���� ����������� ������ ��� �� ���������, ������ ��� Web-������ ��� ������ ��������� ��� ���������� Java-handler, �������� �������� �� ���������� ��� Java-�������� � ������������ ������-������� ������ � ��� ����� ����������� ���������� �������. �������, ���� �� ������ �������� � �������� �� ������ Web-�������, ������� ��������� ��������, ������������� ������, ��� ���� ������������ ������ ����������� ���������� �����/������ ��������� ����������� ������ ��� ������ �� ��������, ��������:
// ����������� ������������ ������������ // � ����������� �� ������������� ���� ��������� String dos = new String("Cp866"); String win = new String("Cp1251"); String iso = new String("8859_5"); String im = new String("������������� �����"); ....................................................... out.println("<body>"); //out.write(im.getBytes(dos)); out.write(im1.getBytes(win)); //out.write(im2.getBytes(iso)); out.println("</body></html>");
�� � ������ ����������� ������� Java - getBytes() �� ���������, ����� �� ���������� ������ ��� ������ ��������� �� ��� ������. ����� ���������� ��������� �����, ������� �� ��� ������������ ��� ������ � ������ ������ ��� ������ ���������� JDBC. ����� ����, ���� font.properties � �������� $JDK_HOME/lib ��� � ����������� �������� ������ �������� ������ ���� �������������� ������� ��������. �� ������ ������� Java ������� ������� ����� font.properties.ru, ������� ����� ����� � �������� ������. ���� �� ��������� � ��� ���������������� Web-��������, ��������, ������� ������� Apache, �� �� ����������� �� ��� � ��� ������������ ������, ����������� �� ���� ������ �� ��������. ����� ������� ��������������� �������� � ����� ������ � �������? ������� �� ����������� ������� ����������� �� ������������� ����������� � ����� ������. ����� ������������ ������������ JDBC-ODBC, ��� ������������� �������� ��������������� �� ���������� SQL-������� � ���� ������. ���������� �������� DBServlet.java, ������� � ������� ����� ����������� ��� �� Java Web Server, ��� � Web ������� Apache.
/* * @(#)DBServlet.java 1.6 97/06/13 */ import javax.servlet.*; import javax.servlet.http.*; import java.io.*; import java.net.*; import java.sql.*; /** * DBServlet * * ���� ������� ������������� ��� ������������ JDBC ���� * � �������� ������ � ����� ������ ��� ������ ���������. ��� ����, ����� ��������� ���� * �������, ���������� CLASSPATH, LD_LIBRARY_PATH, ODBCINI * ������ ���� ��������������� ������� �����������. */ public class DBServlet extends HttpServlet { /** * init method */ public void init(ServletConfig conf) throws ServletException { super.init(conf); } /** * service method */ public void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { String stack, username, password, query; Connection con; PrintStream out; /* ServletOutputStream out = res.getOutputStream();*/ // �������� ����������. ������ ��� ��������� ������ ����� ��������� // � ���������� ������������� ���� ��������, � ������� ����� // ����������������� ��� ������� stack = req.getParameter("stack"); username = req.getParameter("username"); password = req.getParameter("password"); query = req.getParameter("query"); res.setContentType("text/html"); out = new PrintStream(res.getOutputStream()); printPageHeader(out); // � ��� ������, ���� ��������� ����������� if (stack == null || username == null || password == null || query == null) { printPageFooter(out); return; } String url = "jdbc:odbc:"+stack; out.println("<hr><h3>Previous Query</h3>"); out.println("<pre>"); out.println("Database Stack : "+stack); out.println(" User ID : "+username); out.println(" Password : "+password); out.println(" Query : "+query); out.println("</pre>"); try { // ����� jdbc ����. ����� ������������ ��������� //������������������ ��������� Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); //Class.forName("jdbc.odbc.JdbcOdbcDriver"); // �������� ���������� � ����� ������ con = DriverManager.getConnection(url, username, password); out.println("<hr>"); out.println("<h3>ODBC Driver and Database Messages</h3>"); checkForWarning(con.getWarnings(), out); DatabaseMetaData dma = con.getMetaData(); out.println("Connected to " + dma.getURL() + "<br>"); out.println("Driver " + dma.getDriverName() + "<br>"); out.println("Version " + dma.getDriverVersion() + "<br>"); // ������� � ��������� ������. ���������� �������� SQL // �������� ��������� ������������� � ���� ��� �������� Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery(query); // ������ �����������. //��� ��������������� �� ����������� ����� // � ��������� � ������� ������� dispResultSet(rs, out); rs.close(); stmt.close(); con.close(); out.println("<hr>"); } catch (SQLException ex) { out.println("<hr>*** SQLException caught ***"); while (ex != null) { out.println("SQLState: " + ex.getSQLState() + "<br>"); out.println("Message: " + ex.getMessage() + "<br>"); out.println("Vendor: " + ex.getErrorCode() + "<br>"); ex = ex.getNextException(); } } catch (java.lang.Exception ex) { ex.printStackTrace(); } printPageFooter(out); } /** * ������� ����������� ���������� */ public String getServletInfo() { return "��� ������� �������, ������� ���������� ��� ������������ JDBC"; } /* * �������� � ������ ���������� ������� */ private void checkForWarning(SQLWarning warn, PrintStream out) throws SQLException { boolean rc = false; if (warn != null) { out.println("<hr>*** Warning ***"); rc = true; while (warn != null) { out.println("SQLState: " + warn.getSQLState() + "<br>"); out.println("Message: " + warn.getMessage() + "<br>"); out.println("Vendor: " + warn.getErrorCode() + "<br>"); warn = warn.getNextWarning(); } } } /* * ����� ����������� ������� � ��������� html ������� */ private void dispResultSet(ResultSet rs, PrintStream out) throws SQLException, IOException { int i; // ���������� ������������ ��� ��������� ���������� � ����� ResultSetMetaData rsmd = rs.getMetaData(); int numCols = rsmd.getColumnCount(); out.println("<hr>"); out.println("<h3>Database Columns and Data</h3>"); out.println("<table border=3>"); out.println("<tr>"); for (i=1; i<=numCols; i++) { out.println("<th>" + rsmd.getColumnLabel(i) + "</th>"); } out.println("</tr>"); // ��� ���� ������ while (rs.next()) { out.println("<tr>"); // for one row for (i=1; i<=numCols; i++) { dispElement(rs, rsmd.getColumnType(i), out, i); } out.println("</tr>"); } out.println("</table>"); } // ������ ������ �������� private void dispElement(ResultSet rs, int dataType, PrintStream out, int col) throws SQLException, IOException { String cp1 = new String("Cp1251"); // � ����������� �� ���� //������, ���������� ��������� ���� ��������� switch(dataType) { case Types.DATE: java.sql.Date date = rs.getDate(col); out.println("<th>" + date.toString() + "</th>"); break; case Types.TIME: java.sql.Time time = rs.getTime(col); out.println("<th>" + time.toString() + "</th>"); break; case Types.TIMESTAMP: java.sql.Timestamp timestamp = rs.getTimestamp(col); out.println("<th>" + timestamp.toString() + "</th>"); break; case Types.CHAR: case Types.VARCHAR: case Types.LONGVARCHAR: String str = rs.getString(col); // ��������, ��� ����� ��� //����������� ������������� �������������� out.println("<th>" + str + "</th>"); break; case Types.NUMERIC: case Types.DECIMAL: java.math.BigDecimal numeric = rs.getBigDecimal(col, 10); out.println("<th>" + numeric.toString() + "</th>"); break; case Types.BIT: boolean bit = rs.getBoolean(col); out.println("<th>" + new Boolean(bit) + "</th>"); break; case Types.TINYINT: byte tinyint = rs.getByte(col); out.println("<th>" + new Integer(tinyint) + "</th>"); break; case Types.SMALLINT: short smallint = rs.getShort(col); out.println("<th>" + new Integer(smallint) + "</th>"); break; case Types.INTEGER: int integer = rs.getInt(col); out.println("<th>" + new Integer(integer) + "</th>"); break; case Types.BIGINT: long bigint = rs.getLong(col); out.println("<th>" + new Long(bigint) + "</th>"); break; case Types.REAL: float real = rs.getFloat(col); out.println("<th>" + new Float(real) + "</th>"); break; case Types.FLOAT: case Types.DOUBLE: double longreal = rs.getDouble(col); out.println("<th>" + new Double(longreal) + "</th>"); break; case Types.BINARY: case Types.VARBINARY: case Types.LONGVARBINARY: byte[] binary = rs.getBytes(col); out.println("<th>" + new String(binary, 0) + "</th>"); break; } } private void printPageHeader(PrintStream out) { out.println("<html>"); out.println("<head>"); out.println("<tltle> �������� ������� ��� ������ � ������ ������ </title>"); out.println("</head>"); out.println("<body>"); out.println("<center><font size=5>" + "<b>Jeeves Database Servlet</b>" + "</font></center>"); out.println("<hr>"); out.println("<form action=\"/servlet/dbServlet\" method=\"get\">"); out.println("<pre>"); out.println("ODBC DSN : <input type=textarea name=stack>"); out.println(" User ID : <input type=textarea name=username>"); out.println(" Password : <input type=textarea name=password>"); out.println(" SQL Query : <input type=textarea name=query>"); out.println("</pre>"); out.println("<input type= submit>"); out.println("</form>"); } private void printPageFooter(PrintStream out) { out.println("</body>"); out.println("</html>"); out.flush(); } }
� ���� ��������� ���������� ������ ������� ��� ��������� ��������� - javax.servlet.* � javax.servlet.http.*, ������� ��������� � ����������� �������� ����� JavaSoft JSDK1.0.1 ��� ��������������� � JDK1.2.
������� ����, ������� ���������� ��� ���� ������, - ��� ����� ������� ����������� ���������� �������� ��������� �� ����� � ����� ������� ���������� �������� ��������� �� ������.
public void service (HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { ... }
����������� ����� request �������� ������ ����������, ������� ����� ���� ��������� ��� ������ HttpServletRequest::getParameterNames ������.
stack = req.getParameter("stack");
���������� ��� �������� ���� �� ������������� � htm-����� ��������� stack, � ������� �� ������ �������� � ���������� ��� ODBC-��������� (ODBC DSN).
����� ���������� ����������� ���� ��������� ��� ���������� ������� ���������, ����������� �� HTML-�����, ����� ��� ���������� ��� ��������� � ��������:
while ( values.hasMoreElements() ) { ... }
��� � �������� ������� ������������ ��������� ����� �������� �� ����� ������ �����.
String name, value; name = (String)values.nextElement(); value = req.getParameter (name);
���� ������ ������ ���������� ��� ����, ����� ������ ������ ������� ��������, ����������� ���������������� JavaServer"� ��� ��������� ����, ������ ����, ����� ������ c������ CGI. �������, �������, ��� ���� ��������, ������� ����� ���������� ������� - ��������� ������� � �������������� ��������. ���������, ��� �� ��������������� ���� ������ � init ������ � ����� ��������� HttpServlet ��� ServletException:
public void init (ServletConfig conf) throws ServletException ... public void service (HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException ...
������ DBServlet �������� ����� service ����� ������������ ���� ��� ��������� ������ try/catch, ������� ������������ ������������ ��� ������������ ��������� �������, ��������� � ���������� ��������� ���������� ��� ����������. � ������ ����� try ������������ ����� ���������� �������� ��� ������������� �������� ���������� � �������� ���� ������ ��� ���������� sql-�������. ������ ���� try ����� ������������ �� ������ ����������, ��������, ��� ������ ����������� � ���� � ����������� �������� - ������� �� ������� �� ������ ����� ������� �� ������������� ���������. ���� ��� - � ����������� ���������� ������ �������� ��������������� �����������.
��� ��������� ����� �������������� � ������������ � ������ ������� � �������� �� ������ ���������� ������ � �������, �� � ����� ���������� ������ � ����������� ������ java.sql ���������� ������� ������ �������, ��� ��, ������� ���������� ����������� �������� ��� ���������� ����������� ODBC-����������.
3.2 �������� �� ���� Apache
��� ���, ��� ����� ���� � ���������� ������������� ����������� � ��������� � �������������, ����� Apache HTTP-������� ��������, �������, ����� ����������. ����� �����, ����� ���������� ���� ������ ����� �������� � �� �� � �� ����������������� ���������������������� ��������, ������ ����������� � ���������� ������� ��������, ��� ������� �� ���������, ���� �������� � �������� �����������. �����, �� ������ �� �����, ���������� ������� ��������� � ����������� �������� Web-�������, ������������ �� �������� ������, � ��� ��������� ����� ���� ������������ ��������� �������������, ������� ��� ������������� ��������� �� �� ���� ����������. �� ��������� ������� ��� Web-������� ����� �������� �� ���������� ������ ��� ���� ���������: CGI, ISAPI ��� NSAPI, ������ ��� ��������� ���� ����� ���� ����������� �� Wintel-���������. ���, � ���������� Delphi-3 ������ ����� ���������� ���� ���������� � ���� Web-�������, �� �������� ������������� ��������� ��������������, ������� ����� ���������� ������ ������� Web, ���������� ��� Windows-95/NT, � ��� ����� � ���� �� ������� ������� ����������� ��������� ����� ������� Gateway-ODBC. ����� ������� �� ������ ���������� �����������, ��� �����, ��� �������� HTTP ��� ������ ����� ������� �������� ������������ ������ ���������� ��������� � ������ � ���� ������ ��� ��������. ��� Apache ���������� ����������� ����������� ��������� JServ, ������� ����� ��� � ��� ������ � �������� ����� ���������������� ���������� ���������. ��� ������� Apache ������������� �������� Java-����������, �������� � ����� ������������ �� ���������� ��� �������, ��������� � �������� Java-��������. ��������, ���� ����� �� Java �������������� ��������������� � Web, ������� ���������� ������� �������� ��� ������������ ��������. �������� ���������� Java-���������� ������� �� ������������������ ����������, �� ������� ��������������� Web-������ Apache. ���� ���, � ������� UltraSparc-3000 c Java-����������� ������� HotSpot, �� �������� ����� ���� ����� �������, � �������, � �� � � ����� ��� �������, ��� �� ������� NT-������. Apache, � ������� �� ��������� �� ����� ����������� ����������� ������ Java, � ������������� �� ��, ������� ������������� ��� ������ ���������. ����� ������ ����������� �����, ��� ��������� ��������� ��������� Java-�����, ���������� ���������� ������� � ������ �� �������� � ���������� Apache. �������, � � ����� ���������������� ������ Apache ��� ������������� ������� ����� �������� �����, ��� �������� ��������������, ������� ��� ���������� � ������������� ������� ������ �������� ��� ������� �� ��������� � ������ �������������������� ��������� ��� ����������������� Web-�����, ������ ��� Fastrack, ��� Java Web Server. ��� ����, ����� ������������ Apache �� �������������� � Java, ���������� �������������� ������� Jserv, ���������� ����������� ���������� Java-�������, ����� �������� ���������������� ���� Apache Configuration, ������� � ���� ������:
Module jserv_module mod_jserv.o
(������ mod_jserv.c ������ ���������� ��� ���� � src/���������� Apache). ����� ����� ���������� ��������������� Apache � ������� ��������� make. ����� ����� �������� �������� ���������������� ���� Apache httpd.conf, ������� � ���� ������ ����:
<IfModule mod_jserv.c> ServletProperties conf/servlet.properties ServletPort 8007 ServletBinary /opt1/jdk1.1.5/bin/java ServletClassPath /opt1/jdk1.1.5/lib/classes.zip ServletClassPath /opt1/local/etc/httpd/jserv/lib/servclasses.zip ServletClassPath /opt1/local/etc/httpd/jserv/classes ServletClassPath /opt1/JSDK1.0.1/lib/classes.zip ServletErrorLog logs/jserv_log ServletAlias /servlets /opt1/local/etc/httpd/ jserv/servlets ServletAuthExport Off # AddHandler jhtml-parser .jhtml # Action jhtml-parser /servlets/ org.apache.jserv.JServSSI </IfModule>
����������, � ������ ���������� ������ ���������� ����� ���� �������, ������, ����� ����� ������ Apache HTTP-������� �� ������� httpd, �� ������������� ��������� Java-����������, ������� � ����� ��������� � ��������� ��� ����������� ��������, � ��� ����� � ��, ������� ����� �������� � ������ ������. ������������ Apache ��� ������ � ������ ������ ����������� � ���, ��� ��������� ��, ����� ��� � Java, �������� � �������� �����, ����� ���������� ������������ ��� ����������� ����������� � ��������� ��� ���������� �������������� ��������� �� Java � �� ����� C, �������, �� ���������� ������������� ����� ��������� ��������� �������� �������.
����������
������������� ������ �� ���������� ����������� ������������� Java-�������� ��� ������ � ������ ������. ������� ������, ��� ���������� ��������� �����������, ���������������� � ����������� ������ �����������. ������ ������� Microsoft �������� � �������� ����� ���������� RDO, ADO � OLE DB. ��� ����������, ����� ��� JDBC �������� � ����������� ��������-��������������� ���������� � �������� �� �������, ������� ����� ���� ��������� � JDBC. � �� �� ����� � JDBC ����������� � � ������ ������� �������� ���� JSQL, ������� ��� ������������ ��������� ��������. � ���� ������, SQL ��������� ����� ����� ���������� � Java ���������, � �� ���������� �� ��� ��������� ���������� � Java-������. ���������� SQL-������������ �������� ������������� ������������ Java-���������� � SQL ����������.