╨ατ≤∞σσ≥± , ≈≥ε ε≡παφΦτεΓα≥ⁿ Σε±≥≤∩ Ω ßατα∞ Σαφφ√⌡ Φτ ±εΓ≡σ∞σφφεπε τ√Ωα ∩≡επ≡α∞∞Φ≡εΓαφΦ Γ φα°σ Γ≡σ∞ φσ ∩≡σΣ±≥αΓδ σ≥ φΦΩαΩεΘ ±δεµφε±≥Φ. ┴εδσσ ≥επε, Φ ±α∞Φ τ√ΩΦ ∩≡επ≡α∞∞Φ≡εΓαφΦ ßεδσσ Γ±σπε ε÷σφΦΓα■≥± ≡ατ≡αßε≥≈ΦΩα∞Φ ∩ε ≥Φ∩≤ Φ Γετ∞εµφε±≥ ∞ ταδεµσφφ√⌡ Γ φΦ⌡ ±≡σΣ±≥Γ Σε±≥≤∩α Ω ßατα∞ Σαφφ√⌡, ≤Σεß±≥Γ≤ Φ ∩εδφε≥σ Φφ≥σ≡⌠σΘ±εΓ. ┬ ²≥ε∞ ±∞√±δσ Java φσ ∩≡σΣ±≥αΓδ σ≥ Φ±Ωδ■≈σφΦ . ╙µσ Γ Γσ≡±ΦΦ JDK1.1 ∩ε ΓΦδ± ∩αΩσ≥ Ωδα±±εΓ java.sql, εßσ±∩σ≈ΦΓα■∙ΦΘ ßεδⁿ∙Φφ±≥Γε ⌠≤φΩ÷ΦΘ, ΦτΓσ±≥φ√⌡ Ω ≥ε∞≤ Γ≡σ∞σφΦ ≡ατ≡αßε≥≈ΦΩα∞ ODBC-∩≡ΦδεµσφΦΘ. ┬ ²≥ε∞ ∩αΩσ≥σ ±εΣσ≡µΦ≥± ≡ Σ τα∞σ≈α≥σδⁿφ√⌡ Ωδα±±εΓ, φα∩≡Φ∞σ≡: java.sql.CallableStatement, Ωε≥ε≡√Θ εßσ±∩σ≈ΦΓασ≥ Γ√∩εδφσφΦσ φα Java ⌡≡αφΦ∞√⌡ ∩≡ε÷σΣ≤≡; java.sql.DatabaseMetaData, Ωε≥ε≡√Θ Φ±±δσΣ≤σ≥ ßατ≤ Σαφφ√⌡ φα ∩≡σΣ∞σ≥ σσ ≡σδ ÷ΦεφφεΘ ∩εδφε≥√ Φ ÷σδε±≥φε±≥Φ ± ∩εδ≤≈σφΦσ∞ ±α∞√⌡ ≡ατφεεß≡ατφ√⌡ Σαφφ√⌡ ε ≥Φ∩α⌡ Φ ±εΣσ≡µΦ∞ε∞ ≥αßδΦ÷, ΩεδεφεΩ, ΦφΣσΩ±εΓ, Ωδ■≈σΘ Φ ≥.Σ.; φαΩεφσ÷, - java.sql.ResultSetMetaData, ± ∩ε∞ε∙ⁿ■ Ωε≥ε≡επε ∞εµφε Γ√ΓεΣΦ≥ⁿ Γ ≤Σεßφε∞ ΓΦΣσ Γ±■ φσεß⌡εΣΦ∞≤■ Φφ⌠ε≡∞α÷Φ■ Φτ ≥αßδΦ÷ ßατ√ Σαφφ√⌡ ΦδΦ ∩σ≈α≥α≥ⁿ ±α∞Φ ∞σ≥αΣαφφ√σ Γ ΓΦΣσ φατΓαφΦΘ ≥αßδΦ÷ Φ ΩεδεφεΩ.
╬ΣφαΩε, Ωε≡σφφεσ ε≥δΦ≈Φσ Java ε≥ Σ≡≤πΦ⌡ ≥≡αΣΦ÷Φεφφ√⌡ τ√ΩεΓ ∩≡επ≡α∞∞Φ≡εΓαφΦ ταΩδ■≈ασ≥± Γ ≥ε∞, ≈≥ε εΣφΦ Φ ≥σ µσ ⌠≤φΩ÷ΦΦ Σε±≥≤∩α Ω ßατα∞ Σαφφ√⌡, ± ∩ε∞ε∙ⁿ■ ≤φΦΓσ≡±αδⁿφε±≥Φ Φ Ω≡ε±±∩δα≥⌠ε≡∞σφφε±≥Φ Java, ∞εµφε ε≡παφΦτεΓα≥ⁿ ≈≡στΓ√≈αΘφε πΦßΩε, Φ±∩εδⁿτ≤ Γ±σ ∩≡σΦ∞≤∙σ±≥Γα ±εΓ≡σ∞σφφ√⌡ εß·σΩ≥φε-ε≡Φσφ≥Φ≡εΓαφφ√⌡ ≥σ⌡φεδεπΦΘ, WWW Φ Intranet/Internet. ╨α±±∞ε≥≡Φ∞ ∩ε ∩ε≡ ΣΩ≤ Γ±σ Γα≡Φαφ≥√ Φ±∩εδⁿτεΓαφΦ Java-∩≡επ≡α∞∞ ∩≡Φ ΓταΦ∞εΣσΘ±≥ΓΦΦ ± ßατα∞Φ Σαφφ√⌡.
JDBC (Java Database Connectivity) Γδ σ≥± φσ ∩≡ε≥εΩεδε∞, α Φφ≥σ≡⌠σΘ±ε∞ Φ ε±φεΓαφ φα ±∩σ÷Φ⌠ΦΩα÷Φ ⌡ SAG CLI (SQL Access Group Call Level Interface - Φφ≥σ≡⌠σΘ± ≤≡εΓφ Γ√τεΓα π≡≤∩∩√ Σε±≥≤∩α SQL).
╤α∞ ∩ε ±σßσ JDBC ≡αßε≥α≥ⁿ φσ ∞εµσ≥ Φ Φ±∩εδⁿτ≤σ≥ ε±φεΓφ√σ αß±≥≡αΩ÷ΦΦ Φ ∞σ≥εΣ√ ODBC. ╒ε≥ Γ ±≥αφΣα≡≥σ JDBC API Φ ∩≡σΣ≤±∞ε≥≡σφα Γετ∞εµφε±≥ⁿ ≡αßε≥√ φσ ≥εδⁿΩε ≈σ≡στ ODBC, α Φ ≈σ≡στ Φ±∩εδⁿτεΓαφΦσ ∩≡ ∞√⌡ δΦφΩεΓ Ω ßατα∞ Σαφφ√⌡ ∩ε ΣΓ≤⌡- ΦδΦ ≥≡σ⌡-τΓσφφεΘ ±⌡σ∞σ (±∞. ╨Φ±.1), ²≥≤ ±⌡σ∞≤ Φ±∩εδⁿτ≤■≥ πε≡ατΣε ≡σµσ, ≈σ∞ ∩εΓ±σ∞σ±≥φε Φ±∩εδⁿτ≤σ∞√Θ JDBC-ODBC-Bridge ταφΦ∞α■∙ΦΘ ÷σφ≥≡αδⁿφεσ ∞σ±≥ε Γ εß∙σΘ ±⌡σ∞σ ΓταΦ∞εΣσΘ±≥ΓΦ Φφ≥σ≡⌠σΘ±εΓ (±∞. ╨Φ±. 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,┬ ∩ε±δσΣφσ∞ ±δ≤≈ασ ≈α±≥ⁿ 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-±σ≡Γσ≡α∞Φ.
┬√τεΓ ≤Σαδσφφ√⌡ ∞σ≥εΣεΓ (RMI - Remote Method Invocation) εßσ±∩σ≈ΦΓασ≥ ±≡σΣ±≥Γα Ωε∞∞≤φΦΩα÷ΦΦ ∞σµΣ≤ Java ∩≡επ≡α∞∞α∞Φ, Σαµσ σ±δΦ εφΦ Γ√∩εδφ ■≥± φα ≡ατφ√⌡ Ωε∞∩ⁿ■≥σ≡α⌡, φα⌡εΣ ∙Φ⌡± Γ ∩≡ε≥ΦΓε∩εδεµφ√⌡ ≥ε≈Ωα⌡ τσ∞φεπε °α≡α.
┬αµφα ε±εßσφφε±≥ⁿ RMI ταΩδ■≈ασ≥± Γ ≥ε∞, ≈≥ε εφ ∩≡σΣ±≥αΓδ σ≥ ∩≡επ≡α∞∞Φ≡≤σ∞√Θ Φφ≥σ≡⌠σΘ± Σδ ≡αßε≥√ ± ±σ≥ ∞Φ Γ ε≥δΦ≈Φσ ε≥ ±εΩσ≥εΓ TCP. ├δαΓφεσ ∩≡σΦ∞≤∙σ±≥Γε σπε Γ ≥ε∞, ≈≥ε εφ ∩≡σΣδαπασ≥ Γα∞ Φφ≥σ≡⌠σΘ± ßεδσσ Γ√±εΩεπε ≤≡εΓσφ , ε±φεΓαφφ√Θ φα Γ√τεΓα⌡ ∞σ≥εΣεΓ, ≥αΩ, ΩαΩ σ±δΦ ß√ ≤Σαδσφφ√Θ εß·σΩ≥ εß≡αßα≥√Γαδ± δεΩαδⁿφε. RMI ßεδσσ ≤Σεßσφ Φ ßεδσσ σ±≥σ±≥Γσφσφ, ≈σ∞ Φφ≥σ≡⌠σΘ±, ε±φεΓαφφ√Θ φα ±εΩσ≥α⌡, φε εφ ≥≡σß≤σ≥ Γ√∩εδφσφΦ Java-∩≡επ≡α∞∞ φα εßεΦ⌡ Ωεφ÷α⌡ ±εσΣΦφσφΦ . ╤σ≥σΓεσ ±εσΣΦφσφΦσ, ≥σ∞ φσ ∞σφσσσ, Σε±≥Φπασ≥± Φ±∩εδⁿτεΓαφΦσ∞ Γ±σ ≥επε µσ TCP/IP ∩≡ε≥εΩεδα.
╨α±±∞ε≥≡Φ∞ ε±φεΓφ√σ °απΦ Σδ ∩ε±≥≡εσφΦ ≡αßε≥α■∙σπε 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╩ε∞∩Φδ ÷Φ ΩεΣα
╥≡Φ ⌠αΘδα - 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 Φφ≥σ≡⌠σΘ± Φπ≡ασ≥ φσ∞αδεΓαµφ≤■ ≡εδⁿ.
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"
┼±δΦ α∩∩δσ≥√ ≡α±°Φ≡ ■≥ ⌠≤φΩ÷Φεφαδⁿφε±≥ⁿ Web-ß≡α≤τσ≡εΓ, ≥ε ±σ≡Γδσ≥√ ≡α±°Φ≡ ■≥ ⌠≤φΩ÷Φεφαδⁿφε±≥ⁿ Web-±σ≡Γσ≡εΓ Φ Γδ ■≥± ∞ε∙φ√∞ ±≡σΣ±≥Γε∞ ∩≡επ≡α∞∞Φ≡εΓαφΦ . ┬ ∩ε±δσΣφσσ Γ≡σ∞ ∞φεπΦσ ∩≡σΣ∩ε≈Φ≥α■≥ εß√ΩφεΓσφφ√∞ α∩∩δσ≥α∞, ταπ≡≤µασ∞√∞ δεΩαδⁿφε ΦδΦ ≤Σαδσφφε, Φ∞σφφε ±σ≡Γδσ≥√, Ωε≥ε≡√σ φσ φ≤µφε φΦΩ≤Σα ταπ≡≤µα≥ⁿ Φ, Ωε≥ε≡√σ Γ±σπΣα Γ√∩εδφ ■≥± Γ Ωεφ≥σΩ±≥σ Web-±σ≡Γσ≡α, εßσ±∩σ≈ΦΓα , Γ ε≥δΦ≈Φσ ε≥ εß√≈φ√⌡ CGI-∩≡ε÷σ±±εΓ ΦδΦ ±Ω≡Φ∩≥εΓ, Ω≤Σα ßεδσσ ≡ατΓΦ≥√σ Γετ∞εµφε±≥Φ.
╤σ≡Γδσ≥√ Γδ ■≥± εß·σΩ≥α∞Φ, Ωε≥ε≡√σ εß≡ατ≤■≥ ±∩σ÷Φ⌠Φ≈σ±ΩΦΘ Φφ≥σ≡⌠σΘ±, ± ∩ε∞ε∙ⁿ■ Ωε≥ε≡επε Φ⌡ ∞εµφε ±ΓεßεΣφε Γ±≥≡αΦΓα≥ⁿ Γ Java-ε≡Φσφ≥Φ≡εΓαφφ√σ Web-±σ≡Γσ≡α. ┬ ε≥δΦ≈Φσ ε≥ α∩∩δσ≥εΓ, εφΦ Γδ ■≥± εßδσπ≈σφφ√∞Φ Java-εß·σΩ≥α∞Φ (ßστ π≡α⌠ΦΩΦ Φ GUI-Ωε∞∩εφσφ≥εΓ), φε τα≥ε, ß≤Σ≤≈Φ Ω≡ε±±∩δα≥⌠ε≡∞σφφ√∞Φ Φ ΣΦφα∞Φ≈σ±ΩΦ ταπ≡≤µασ∞√∞Φ Φ, Φ±∩εδⁿτ≤ Γ±σ Γετ∞εµφε±≥Φ Java, εφΦ ∞επ≤≥ Φ±∩εδⁿτεΓα≥ⁿ ∩≡αΩ≥Φ≈σ±ΩΦ δ■ßεΘ HTML Φ ΓταΦ∞εΣσΘ±≥ΓεΓα≥ⁿ ± δ■ß√∞ ß≡α≤τσ≡ε∞. ┼±≥σ±≥Γσφφε, ≈≥ε ±σ≡Γδσ≥√ ∞εµφε Φ±∩εδⁿτεΓα≥ⁿ Φ Φ±∩εδⁿτ≤■≥ Σδ Σε±≥≤∩α Ω ßατα∞ Σαφφ√⌡, ∩≡επ≡α∞∞Φ≡≤ Γ±σ ≤Σαδσφφ√σ ε∩σ≡α÷ΦΦ ± ßατεΘ Φτ ß≡α≤τσ≡α. ┬ φα±≥ε ∙σσ Γ≡σ∞ ßεδⁿ°Φφ±≥Γε Web ±σ≡Γσ≡εΓ ∩εΣΣσ≡µΦΓα■≥ ≥σ⌡φεδεπΦ■ ±σ≡Γδσ≥εΓ. Java Web-Server ⌡ε≡ε° ≥σ∞, ≈≥ε ≈≥ε εφ φαΦßεδσσ ∩εδφε ≡σαδΦτ≤σ≥ ²≥≤ ≥σ⌡φεδεπΦ■. ╤≥αφΣα≡≥φ√Θ Servlet-API ≡σαδΦτεΓαφ ΩαΩ Γ ±α∞ε∞ Java Web Server, ≥αΩ Φ Γ ε≥Σσδⁿφε∞ ∩≡εΣ≤Ω≥σ JSDK, φε φα≈Φφα ± Γσ≡±ΦΦ 1.2, εφ ΓΩδ■≈σφ Γ ±ε±≥αΓ JDK. ╒α≡αΩ≥σ≡φεΘ ε±εßσφφε±≥ⁿ■ ±σ≡Γδσ≥εΓ Γδ σ≥± ≥ε, ≈≥ε εφΦ φσ ≥≡σß≤■≥ ±ετΣαφΦ φεΓ√⌡ ∩≡ε÷σ±±εΓ ∩≡Φ ΩαµΣε∞ φεΓε∞ τα∩≡ε±σ. ╠φεµσ±≥Γε ±σ≡Γδσ≥εΓ Γ√∩εδφ ■≥± ∩α≡αδδσδⁿφε Γ ≡α∞Ωα⌡ εΣφεπε ∩≡ε÷σ±±α φα ±σ≡Γσ≡σ Φ ∩ε ±ΓεσΘ ∩≡εΦτΓεΣΦ≥σδⁿφε±≥Φ ∩≡σΓε±⌡εΣ ≥ ΩαΩ CGI, ≥αΩ Φ Fast-CGI ∩≡ΦδεµσφΦ (±∞. ╨Φ±.3).
═σ±∞ε≥≡ φα ≥ε, ≈≥ε ±σ≡Γδσ≥√ Φ±∩εδⁿτ≤■≥ 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-∩≡ΦδεµσφΦΘ.
─δ ≥σ⌡, Ω≥ε Φ∞σσ≥ Σσδε ± ≡ατδΦ≈φ√∞Φ Ωε∞∩ⁿ■≥σ≡φ√∞Φ ∩δα≥⌠ε≡∞α∞Φ Φ ±≥≡σ∞Φ≥± Ω ≤φΦΓσ≡±αδΦτ∞≤, Γ√ßε≡ 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