─ε±≥≤∩ Ω ßατα∞ Σαφφ√⌡ Φτ 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. ┬ ±δ≤≈ασ ∩≡Φ∞σφσφΦ  ODBC, Γ URL-±≥≡εΩ≤ ∩εΣ±≥αΓδ σ≥±  Φ∞σφφε ²≥α αßß≡σΓΦα≥≤≡α, α Γ Ωα≈σ±≥Γσ Φ±∩εδⁿτ≤σ≥±  εß√≈φ√Θ DSN (Data Source Name), ≥.σ. Φ∞  ODBC-Φ±≥ε≈φΦΩα Φτ ODBC.INI ⌠αΘδα. ═α∩≡Φ∞σ≡:

jdbc:odbc:dBase

┬ φσΩε≥ε≡√⌡ ±δ≤≈α ⌡ Γ∞σ±≥ε 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-∩≡ΦδεµσφΦ :

╤δσΣ≤■∙ΦΘ φΦµσ ∩≡Φ∞σ≡ ≡ατ≡αßε≥αφ Σδ  ΩδΦσφ≥α Φ ±σ≡Γσ≡α, Γ√∩εδφ ■∙Φ⌡±  φα εΣφεΘ Φ ≥εΘ µσ ∞α°Φφσ, εΣφαΩε, ταδεµσφφ√σ τΣσ±ⁿ ∩≡Φφ÷Φ∩√ ∞εµφε ± ≤±∩σ⌡ε∞ ∩≡Φ∞σφΦ≥ⁿ Σδ  ∩≡επ≡α∞∞, Γ√∩εδφ ■∙Φ⌡±  φα ≡ατφ√⌡ ∞α°Φφα⌡ Φ Σαµσ ± ≡ατδΦ≈φεΘ α≡⌡Φ≥σΩ≥≤≡εΘ. ╧≡επ≡α∞∞α ΩδΦσφ≥α Φ∙σ≥ Φ∞σφα Φ φε∞σ≡α ≥σδσ⌠εφεΓ Γ ÷σφ≥≡αδⁿφεΘ ßατσ, ∩ε±≥ε φφε ≡στΦΣσφ≥φεΘ φα ±σ≡Γσ≡σ.

╩αΩ ≡αßε≥ασ≥ 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 ∞εµσ≥ ß√≥ⁿ Γ±≥≡εσφα Γ ╤╙┴─ ∞φεµσ±≥Γε∞ ≡ατδΦ≈φ√⌡ ±∩ε±εßεΓ Φ ∩≡Φ ²≥ε∞ Γ±σπΣα Σε±≥Φπασ≥±  ≡σ°σφΦσ ±≡ατ≤ φσ±ΩεδⁿΩΦ⌡ ταΣα≈:

╤δσΣ≤■∙ΦΘ ∩≡Φ∞σ≡ Γ±≥αΓδ σ≥ φεΓ≤■ τα∩Φ±ⁿ Γ ≥αßδΦ÷≤:

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"

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 ε∩σ≡α≥ε≡α⌡.

╤σ≡πσΘ ┴ε≡Φ±εΓΦ≈ ─≤φασΓ, ╚ΓαφεΓ±ΩΦΘ πε±≤Σα≡±≥Γσφφ√Θ ²φσ≡πσ≥Φ≈σ±ΩΦΘ ≤φΦΓσ≡±Φ≥σ≥, ╥σδ.: (0932) 38-57-01, E-mail sbd@polytech.ivanovo.su