📄 chinaunix_net - 关于在applet中使用jdbc访问数据库的一点总结 - 中国unix技术社区.htm
字号:
<!-- Generated by LibHtt 2004-2-26 10:18:32 Templet source: /data0/chinaunix.net/cgisrc/do_html/viewtopics_jh.html Warnings and errors: 0--><html><head><TITLE>ChinaUnix.net - 关于在applet中使用JDBC访问数据库的一点总结 - 中国Unix技术社区</TITLE><META http-equiv=Content-Type content="text/html; charset=gb2312"><META NAME ="keywords" CONTENT="Linux,Freebsd,Solaris,Sco,HP-UX,IBM-AIX,cisco,oracle,java,cgi,mysql,perl,Apache,proFTP,Sendmail,Qmail,DNS,Squid,Rsync,SSL"> <META NAME="description" CONTENT="中国UNIX技术社区"><style type="text/css"><!--body,th,input,select,textarea,select,checkbox{font:12pt 宋体}body { font-family: "宋体", "serif"; font-size: 12pt}td { font-family: "宋体", "serif"; font-size: 12pt}p { font-size: 9pt; line-height: 150%}--></style></head><body><script src=http://www.chinaunix.net/title.js></script><div align="center"><center><table border="0" width=75% cellspacing="0" cellpadding="0" ><tr> <td height="45"><p align="center"><b>ChinaUnix-Java讨论区精华帖</b></td> </tr> <tr><tr> <td width="100%" height="2" colspan="5" bgcolor="#49ADE9"><img src="/images/bline.gif" width=1 height=1></td> </tr></table><table border="0" width=75% cellspacing="0" cellpadding="0"><tr> <td align=center height="40" valign=middle bgcolor=#EDF0F5><font size=5><b>关于在applet中使用JDBC访问数据库的一点总结</b></font></td></tr><tr> <td align=center height="20" bgcolor=#EDF0F5><small>http://www.chinaunix.net 作者:<a href=http://bbs.chinaunix.net/forum/profile.php?mode=viewprofile&u=88600 target=_blank>wolfg</a> 发表于:2004-02-10 11:04:50</font></td></tr><tr><td align=center bgcolor=#EDF0F5> <table border="0" width="90%" cellspacing="0" cellpadding="0" align=center style='border-collapse: collapse; WORD-BREAK: break-all'> <tr><td valign=top><br> 最近,在这里看到了几篇关于在applet中使用JDBC访问数据库的帖子,觉得大侠们有的回复很绝对,说applet不能访问数据库,不敢苟同,于是参照Sun的网上教程"[url=http://cn.sun.com/developers/onlineTraining/Programming/BasicJava1/data.html]Java程序设计语言基础: 实践指南,第1部分[/url]",做了一些实验,总结出来与大家分享,也请多多指教。
<br>
<br>实验环境
<br>DB Server #1: Solairs 8 + Oracle 8.1.7 + apache
<br>DB Server #2: Solairs 8 + Oracle 8.1.7
<br>Client: Windows2000 SP4 + J2SE1.4.1 + Oracle JDBC Driver
<br>
<br>实验中使用的数据表的结构
<br>[code:1:8c94ca30e9]
<br>TABLE DBA (
<br> TEXT varchar2(100),
<br> primary key (TEXT)
<br>)
<br>[/code:1:8c94ca30e9]
<br>
<br>applet的源代码
<br>[code:1:8c94ca30e9]
<br>import java.awt.Color;
<br>import java.awt.BorderLayout;
<br>import java.awt.event.*;
<br>import java.applet.Applet;
<br>import javax.swing.*;
<br>import java.sql.*;
<br>import java.net.*;
<br>import java.io.*;
<br>
<br>public class DbaAppl extends Applet implements ActionListener {
<br>
<br> JLabel text, clicked;
<br> JButton button, clickButton;
<br> JTextField textField;
<br> private boolean _clickMeMode = true;
<br> private Connection c;
<br>
<br> final static private String _driver = "oracle.jdbc.driver.OracleDriver";
<br> final static private String _url = "jdbc:oracle:thin:username/password@(description=(address_list=(address=(protocol=tcp)(host=developer)(port=1521)))(source_route=yes)(connect_data=(sid=ansid)))";
<br>
<br> public void init(){
<br> setBackground(Color.white);
<br> text = new JLabel("Text to save to file:");
<br> clicked = new JLabel("Text retrieved from file:");
<br> button = new JButton("Click Me");
<br> button.addActionListener(this);
<br> clickButton = new JButton("Click Again");
<br> clickButton.addActionListener(this);
<br> textField = new JTextField(20);
<br> setLayout(new BorderLayout());
<br> setBackground(Color.white);
<br> add(BorderLayout.NORTH, text);
<br> add(BorderLayout.CENTER, textField);
<br> add(BorderLayout.SOUTH, button);
<br> }
<br>
<br> public void start(){
<br> System.out.println("Applet starting.");
<br> }
<br>
<br> public void stop(){
<br> System.out.println("Applet stopping.");
<br> }
<br>
<br> public void destroy(){
<br> System.out.println("Destroy method called.");
<br> }
<br>
<br> public void actionPerformed(ActionEvent event){
<br> try{
<br> Class.forName (_driver);
<br> c = DriverManager.getConnection(_url);
<br> }catch (java.lang.ClassNotFoundException e){
<br> System.out.println("Cannot find driver");
<br> System.out.println(e.getMessage());
<br> }catch (java.sql.SQLException e){
<br> System.out.println("Cannot get connection");
<br> System.out.println(e.getMessage());
<br> }
<br>
<br> Object source = event.getSource();
<br> if(source == button){
<br> if(_clickMeMode){
<br> JTextArea displayText = new JTextArea();
<br> try{
<br> //Write to database
<br> String theText = textField.getText();
<br> Statement stmt = c.createStatement();
<br> String updateString = "INSERT INTO dba VALUES ('" + theText + "')";
<br> int count = stmt.executeUpdate(updateString);
<br> //Read from database
<br> ResultSet results = stmt.executeQuery("SELECT TEXT FROM dba ");
<br> while(results.next()){
<br> String s = results.getString("TEXT");
<br> displayText.append(s + "\n");
<br> }
<br> stmt.close();
<br> }catch(java.sql.SQLException e){
<br> System.out.println("Cannot create SQL statement");
<br> System.out.println(e.getMessage());
<br> }
<br>
<br>//Display text read from database
<br> text.setText("Text retrieved from file:");
<br> button.setText("Click Again");
<br> _clickMeMode = false;
<br>//Display text read from database
<br> } else {
<br> text.setText("Text to save to file:");
<br> textField.setText("");
<br> button.setText("Click Me");
<br> _clickMeMode = true;
<br> }
<br> }
<br> }
<br>}
<br>[/code:1:8c94ca30e9]
<br>
<br>运行此applet的html文件DbaAppl.html
<br>[code:1:8c94ca30e9]
<br><HTML>
<br><BODY>
<br>
<br><APPLET CODE=DbaAppl.class
<br> WIDTH=200
<br> HEIGHT=100>
<br></APPLET>
<br>
<br></BODY>
<br></HTML>
<br>[/code:1:8c94ca30e9]
<br>
<br>首先,DbaAppl.java中_url串指定的是与Web Server在同一台主机上(server1)的Oracle,编译后把DbaAppl.class和DbaAppl.html
<br>一起放在Web Server的同一目录下,在客户机的浏览器里访问DbaAppl.html,查看Java控制台,得到如下信息
<br>[code:1:8c94ca30e9]
<br>Cannot find driver
<br>oracle.jdbc.driver.OracleDriver
<br>java.lang.NullPointerException
<br>[/code:1:8c94ca30e9]
<br>这一出错信息的意思是,DriverManager 已在 applet HTML和类文件所在的目录以及当前JRE使用的本地CLASSPATH中没有找到 JDBC 驱动程序。
<br>解决办法,将JDBC 驱动程序oracle-jdbc-driver.jar文件放在客户机当前使用的JRE的${JRE_HOME}/lib/ext目录下,或者用jar工具将oracle-jdbc-driver.jar解压,把解压后得到的oracle目录也放在Web Server上applet所在
<br>的目录中。
<br>
<br>更正后,重新访问DbaAppl.html,查看Java控制台,得到如下信息
<br>[code:1:8c94ca30e9]
<br>java.security.AccessControlException: access denied(java.net.SocketPermission server1 resolve)
<br>[/code:1:8c94ca30e9]
<br>这个错误的通知你访问被拒绝。这就是说,由于 applet 程序试 图在没有获得正确的权限的情况下访问系统资源,括号中代码表示,若要纠正这种情况,您需要一个向数据库所在计算机(主机名为server1) 授予 applet 访问权限的 SocketPermission。
<br>
<br>
<br>解决办法,利用 Policy 工具生成你所需要的策略文件,或者用一个 ASCII 编辑 器生成该策略文件。
<br>下面的代码是名为 DbaApplPol 的、获得上述权限的策略文件的内容
<br>[code:1:8c94ca30e9]
<br>grant {
<br> permission java.net.SocketPermission "server1", "resolve";
<br>};
<br>[/code:1:8c94ca30e9]
<br>创建了策略文件后,还要修改${JRE_HOME}/lib/security/java.security文件
<br>在[code:1:8c94ca30e9]
<br>policy.url.1=file:${java.home}/lib/security/java.policy
<br>policy.url.2=file:${user.home}/.java.policy
<br>[/code:1:8c94ca30e9]
<br>下添加一行[code:1:8c94ca30e9]
<br>policy.url.3=file:/path/to/DbaApplPol
<br>[/code:1:8c94ca30e9]
<br>
<br>再次访问DbaAppl.html,成功运行。
<br>
<br>再将DbaAppl.java中_url串改为指定另一台主机(server2)上的Oracle,编译,上传,访问得到如下错误信息
<br>[code:1:8c94ca30e9]
<br>java.security.AccessControlException: access denied(java.net.SocketPermission 10.6.1.16:1521 connect,resolve)
<br>[/code:1:8c94ca30e9]
<br>这回的意思是需要一个允许在数据库所在的server2上访问IP地址和端口的SocketPermission。在前面生成的策略文件中加入
<br>[code:1:8c94ca30e9]
<br>permission java.net.SocketPermission "10.6.1.16:1521", "connect, resolve";
<br>[/code:1:8c94ca30e9]
<br>后,成功运行。
<br>
<br>总结一下,通过applet访问数据库不是不可以的,但确实不太方便,某些特殊环境下可能值得使用。
<br>[list=1:8c94ca30e9]
<br>[*:8c94ca30e9]客户端要有JRE支持,可以在客户机访问applet所在页面是提示安装Java Plug-in,这样的页面可以通过HTMLConvert工具生成
<br>[*:8c94ca30e9]JDBC驱动要么放在客户机JRE的CLASSPATH下,要么与applet放在一起,注意如果驱动是jar文件的话,要解开
<br>[*:8c94ca30e9]通过设置正确的策略文件,applet不仅可以访问与自己在同一台机器上的数据库,也可以访问其他远程数据库。不过,需要每个想要成功运行applet的客户机修改其本地JRE的java.security文件
<br>[/list:o:8c94ca30e9]<br> <br> </td></tr> </table>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -