⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chinaunix_net - 关于在applet中使用jdbc访问数据库的一点总结 - 中国unix技术社区.htm

📁 一个applet与oracle进行连接的例子(大家知道applet与数据库是比较难通讯的
💻 HTM
📖 第 1 页 / 共 2 页
字号:
<!-- 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>&nbsp;&nbsp;发表于: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程序设计语言基础:&nbsp;实践指南,第1部分[/url]",做了一些实验,总结出来与大家分享,也请多多指教。
<br>
<br>实验环境
<br>DB&nbsp;Server&nbsp;#1:&nbsp;Solairs&nbsp;8&nbsp;+&nbsp;Oracle&nbsp;8.1.7&nbsp;+&nbsp;apache
<br>DB&nbsp;Server&nbsp;#2:&nbsp;Solairs&nbsp;8&nbsp;+&nbsp;Oracle&nbsp;8.1.7
<br>Client:&nbsp;Windows2000&nbsp;SP4&nbsp;+&nbsp;J2SE1.4.1&nbsp;+&nbsp;Oracle&nbsp;JDBC&nbsp;Driver
<br>
<br>实验中使用的数据表的结构
<br>[code:1:8c94ca30e9]
<br>TABLE&nbsp;DBA&nbsp;&#40;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TEXT&nbsp;varchar2&#40;100&#41;,
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;primary&nbsp;key&nbsp;&#40;TEXT&#41;
<br>&#41;
<br>[/code:1:8c94ca30e9]
<br>
<br>applet的源代码
<br>[code:1:8c94ca30e9]
<br>import&nbsp;java.awt.Color;
<br>import&nbsp;java.awt.BorderLayout;
<br>import&nbsp;java.awt.event.*;
<br>import&nbsp;java.applet.Applet;
<br>import&nbsp;javax.swing.*;
<br>import&nbsp;java.sql.*;
<br>import&nbsp;java.net.*;
<br>import&nbsp;java.io.*;
<br>
<br>public&nbsp;class&nbsp;DbaAppl&nbsp;extends&nbsp;Applet&nbsp;implements&nbsp;ActionListener&nbsp;&#123;
<br>
<br>&nbsp;&nbsp;&nbsp;JLabel&nbsp;text,&nbsp;clicked;
<br>&nbsp;&nbsp;&nbsp;JButton&nbsp;button,&nbsp;clickButton;
<br>&nbsp;&nbsp;&nbsp;JTextField&nbsp;textField;
<br>&nbsp;&nbsp;&nbsp;private&nbsp;boolean&nbsp;_clickMeMode&nbsp;=&nbsp;true;
<br>&nbsp;&nbsp;&nbsp;private&nbsp;Connection&nbsp;c;
<br>
<br>&nbsp;&nbsp;&nbsp;final&nbsp;static&nbsp;private&nbsp;String&nbsp;_driver&nbsp;=&nbsp;&quot;oracle.jdbc.driver.OracleDriver&quot;;
<br>&nbsp;&nbsp;&nbsp;final&nbsp;static&nbsp;private&nbsp;String&nbsp;_url&nbsp;=&nbsp;&quot;jdbc&#58;oracle&#58;thin&#58;username/password@&#40;description=&#40;address_list=&#40;address=&#40;protocol=tcp&#41;&#40;host=developer&#41;&#40;port=1521&#41;&#41;&#41;&#40;source_route=yes&#41;&#40;connect_data=&#40;sid=ansid&#41;&#41;&#41;&quot;;
<br>
<br>&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;init&#40;&#41;&#123;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setBackground&#40;Color.white&#41;;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;text&nbsp;=&nbsp;new&nbsp;JLabel&#40;&quot;Text&nbsp;to&nbsp;save&nbsp;to&nbsp;file&#58;&quot;&#41;;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;clicked&nbsp;=&nbsp;new&nbsp;JLabel&#40;&quot;Text&nbsp;retrieved&nbsp;from&nbsp;file&#58;&quot;&#41;;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;button&nbsp;=&nbsp;new&nbsp;JButton&#40;&quot;Click&nbsp;Me&quot;&#41;;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;button.addActionListener&#40;this&#41;;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;clickButton&nbsp;=&nbsp;new&nbsp;JButton&#40;&quot;Click&nbsp;Again&quot;&#41;;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;clickButton.addActionListener&#40;this&#41;;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;textField&nbsp;=&nbsp;new&nbsp;JTextField&#40;20&#41;;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setLayout&#40;new&nbsp;BorderLayout&#40;&#41;&#41;;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setBackground&#40;Color.white&#41;;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add&#40;BorderLayout.NORTH,&nbsp;text&#41;;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add&#40;BorderLayout.CENTER,&nbsp;textField&#41;;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add&#40;BorderLayout.SOUTH,&nbsp;button&#41;;
<br>&nbsp;&nbsp;&nbsp;&#125;
<br>
<br>&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;start&#40;&#41;&#123;&nbsp;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println&#40;&quot;Applet&nbsp;starting.&quot;&#41;;
<br>&nbsp;&nbsp;&nbsp;&#125;&nbsp;
<br>
<br>&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;stop&#40;&#41;&#123;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println&#40;&quot;Applet&nbsp;stopping.&quot;&#41;;
<br>&nbsp;&nbsp;&nbsp;&#125;
<br>
<br>&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;destroy&#40;&#41;&#123;
<br>&nbsp;&nbsp;&nbsp;&nbsp;System.out.println&#40;&quot;Destroy&nbsp;method&nbsp;called.&quot;&#41;;
<br>&nbsp;&nbsp;&nbsp;&#125;
<br>
<br>&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;actionPerformed&#40;ActionEvent&nbsp;event&#41;&#123;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&#123;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Class.forName&nbsp;&#40;_driver&#41;;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c&nbsp;=&nbsp;DriverManager.getConnection&#40;_url&#41;;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;catch&nbsp;&#40;java.lang.ClassNotFoundException&nbsp;e&#41;&#123;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println&#40;&quot;Cannot&nbsp;find&nbsp;driver&quot;&#41;;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println&#40;e.getMessage&#40;&#41;&#41;;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;catch&nbsp;&#40;java.sql.SQLException&nbsp;e&#41;&#123;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println&#40;&quot;Cannot&nbsp;get&nbsp;connection&quot;&#41;;&nbsp;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println&#40;e.getMessage&#40;&#41;&#41;;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;
<br>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;source&nbsp;=&nbsp;event.getSource&#40;&#41;;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&#40;source&nbsp;==&nbsp;button&#41;&#123;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&#40;_clickMeMode&#41;&#123;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JTextArea&nbsp;displayText&nbsp;=&nbsp;new&nbsp;JTextArea&#40;&#41;;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&#123;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Write&nbsp;to&nbsp;database
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;theText&nbsp;=&nbsp;textField.getText&#40;&#41;;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Statement&nbsp;stmt&nbsp;=&nbsp;c.createStatement&#40;&#41;;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;updateString&nbsp;=&nbsp;&quot;INSERT&nbsp;INTO&nbsp;dba&nbsp;VALUES&nbsp;&#40;'&quot;&nbsp;+&nbsp;theText&nbsp;+&nbsp;&quot;'&#41;&quot;;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;count&nbsp;=&nbsp;stmt.executeUpdate&#40;updateString&#41;;
<br>&nbsp;&nbsp;&nbsp;&nbsp;//Read&nbsp;from&nbsp;database
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ResultSet&nbsp;results&nbsp;=&nbsp;stmt.executeQuery&#40;&quot;SELECT&nbsp;TEXT&nbsp;FROM&nbsp;dba&nbsp;&quot;&#41;;&nbsp;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while&#40;results.next&#40;&#41;&#41;&#123;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;s&nbsp;=&nbsp;results.getString&#40;&quot;TEXT&quot;&#41;;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;displayText.append&#40;s&nbsp;+&nbsp;&quot;\n&quot;&#41;;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stmt.close&#40;&#41;;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;catch&#40;java.sql.SQLException&nbsp;e&#41;&#123;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println&#40;&quot;Cannot&nbsp;create&nbsp;SQL&nbsp;statement&quot;&#41;;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println&#40;e.getMessage&#40;&#41;&#41;;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;
<br>
<br>//Display&nbsp;text&nbsp;read&nbsp;from&nbsp;database
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;text.setText&#40;&quot;Text&nbsp;retrieved&nbsp;from&nbsp;file&#58;&quot;&#41;;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;button.setText&#40;&quot;Click&nbsp;Again&quot;&#41;;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_clickMeMode&nbsp;=&nbsp;false;
<br>//Display&nbsp;text&nbsp;read&nbsp;from&nbsp;database
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;else&nbsp;&#123;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;text.setText&#40;&quot;Text&nbsp;to&nbsp;save&nbsp;to&nbsp;file&#58;&quot;&#41;;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;textField.setText&#40;&quot;&quot;&#41;;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;button.setText&#40;&quot;Click&nbsp;Me&quot;&#41;;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_clickMeMode&nbsp;=&nbsp;true;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&#125;
<br>&nbsp;&nbsp;&#125;
<br>&#125;
<br>[/code:1:8c94ca30e9]
<br>
<br>运行此applet的html文件DbaAppl.html
<br>[code:1:8c94ca30e9]
<br>&lt;HTML&gt;
<br>&lt;BODY&gt;
<br>
<br>&lt;APPLET&nbsp;CODE=DbaAppl.class
<br>&nbsp;&nbsp;WIDTH=200
<br>&nbsp;&nbsp;HEIGHT=100&gt;
<br>&lt;/APPLET&gt;
<br>
<br>&lt;/BODY&gt;
<br>&lt;/HTML&gt;
<br>[/code:1:8c94ca30e9]
<br>
<br>首先,DbaAppl.java中_url串指定的是与Web&nbsp;Server在同一台主机上(server1)的Oracle,编译后把DbaAppl.class和DbaAppl.html
<br>一起放在Web&nbsp;Server的同一目录下,在客户机的浏览器里访问DbaAppl.html,查看Java控制台,得到如下信息
<br>[code:1:8c94ca30e9]
<br>Cannot&nbsp;find&nbsp;driver
<br>oracle.jdbc.driver.OracleDriver
<br>java.lang.NullPointerException
<br>[/code:1:8c94ca30e9]
<br>这一出错信息的意思是,DriverManager&nbsp;已在&nbsp;applet&nbsp;HTML和类文件所在的目录以及当前JRE使用的本地CLASSPATH中没有找到&nbsp;JDBC&nbsp;驱动程序。
<br>解决办法,将JDBC&nbsp;驱动程序oracle-jdbc-driver.jar文件放在客户机当前使用的JRE的${JRE_HOME}/lib/ext目录下,或者用jar工具将oracle-jdbc-driver.jar解压,把解压后得到的oracle目录也放在Web&nbsp;Server上applet所在
<br>的目录中。
<br>
<br>更正后,重新访问DbaAppl.html,查看Java控制台,得到如下信息
<br>[code:1:8c94ca30e9]
<br>java.security.AccessControlException&#58;&nbsp;access&nbsp;denied&#40;java.net.SocketPermission&nbsp;server1&nbsp;resolve&#41;
<br>[/code:1:8c94ca30e9]
<br>这个错误的通知你访问被拒绝。这就是说,由于&nbsp;applet&nbsp;程序试&nbsp;图在没有获得正确的权限的情况下访问系统资源,括号中代码表示,若要纠正这种情况,您需要一个向数据库所在计算机(主机名为server1)&nbsp;授予&nbsp;applet&nbsp;访问权限的&nbsp;SocketPermission。
<br>
<br>
<br>解决办法,利用&nbsp;Policy&nbsp;工具生成你所需要的策略文件,或者用一个&nbsp;ASCII&nbsp;编辑&nbsp;器生成该策略文件。
<br>下面的代码是名为&nbsp;DbaApplPol&nbsp;的、获得上述权限的策略文件的内容
<br>[code:1:8c94ca30e9]
<br>grant&nbsp;&#123;
<br>&nbsp;&nbsp;permission&nbsp;java.net.SocketPermission&nbsp;&quot;server1&quot;,&nbsp;&quot;resolve&quot;;
<br>&#125;;
<br>[/code:1:8c94ca30e9]
<br>创建了策略文件后,还要修改${JRE_HOME}/lib/security/java.security文件
<br>在[code:1:8c94ca30e9]
<br>policy.url.1=file&#58;$&#123;java.home&#125;/lib/security/java.policy&nbsp;
<br>policy.url.2=file&#58;$&#123;user.home&#125;/.java.policy&nbsp;
<br>[/code:1:8c94ca30e9]
<br>下添加一行[code:1:8c94ca30e9]
<br>policy.url.3=file&#58;/path/to/DbaApplPol&nbsp;
<br>[/code:1:8c94ca30e9]
<br>
<br>再次访问DbaAppl.html,成功运行。
<br>
<br>再将DbaAppl.java中_url串改为指定另一台主机(server2)上的Oracle,编译,上传,访问得到如下错误信息
<br>[code:1:8c94ca30e9]
<br>java.security.AccessControlException&#58;&nbsp;access&nbsp;denied&#40;java.net.SocketPermission&nbsp;10.6.1.16&#58;1521&nbsp;connect,resolve&#41;
<br>[/code:1:8c94ca30e9]
<br>这回的意思是需要一个允许在数据库所在的server2上访问IP地址和端口的SocketPermission。在前面生成的策略文件中加入
<br>[code:1:8c94ca30e9]
<br>permission&nbsp;java.net.SocketPermission&nbsp;&quot;10.6.1.16&#58;1521&quot;,&nbsp;&quot;connect,&nbsp;resolve&quot;;
<br>[/code:1:8c94ca30e9]
<br>后,成功运行。
<br>
<br>总结一下,通过applet访问数据库不是不可以的,但确实不太方便,某些特殊环境下可能值得使用。
<br>[list=1:8c94ca30e9]
<br>[*:8c94ca30e9]客户端要有JRE支持,可以在客户机访问applet所在页面是提示安装Java&nbsp;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 + -