`
qinya06
  • 浏览: 595591 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

applet中使用JDBC访问数据库的

阅读更多
最近,在这里看到了几篇关于在applet中使用JDBC访问数据库的帖子,觉得大侠们有的回复很绝对,说applet不能访问数据库,不敢苟同,于是参照Sun的网上教程"[url=http://cn.sun.com/developers/onlineTraining/Programming/BasicJava1/data.html]Java程序设计语言基础: 实践指南,第1部分",做了一些实验,总结出来与大家分享,也请多多指教。

实验环境
DB Server #1: Solairs 8 + Oracle 8.1.7 + apache
DB Server #2: Solairs 8 + Oracle 8.1.7
Client: Windowsxp SP3 + J2SE6.0+ Oracle JDBC Driver

实验中使用的数据表的结构
TABLE DBA (
        TEXT varchar2(100),
        primary key (TEXT)
)

import java.awt.Color;
import java.awt.BorderLayout;
import java.awt.event.*;
import java.applet.Applet;
import javax.swing.*;
import java.sql.*;
import java.net.*;
import java.io.*;

public class DbaAppl extends Applet implements ActionListener {

   JLabel text, clicked;
   JButton button, clickButton;
   JTextField textField;
   private boolean _clickMeMode = true;
   private Connection c;

   final static private String _driver = "oracle.jdbc.driver.OracleDriver";
   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)))";

   public void init(){
     setBackground(Color.white);
     text = new JLabel("Text to save to file:");
     clicked = new JLabel("Text retrieved from file:");
     button = new JButton("Click Me");
     button.addActionListener(this);
     clickButton = new JButton("Click Again");
     clickButton.addActionListener(this);
     textField = new JTextField(20);
     setLayout(new BorderLayout());
     setBackground(Color.white);
     add(BorderLayout.NORTH, text);
     add(BorderLayout.CENTER, textField);
     add(BorderLayout.SOUTH, button);
   }

   public void start(){ 
     System.out.println("Applet starting.");
   } 

   public void stop(){
     System.out.println("Applet stopping.");
   }

   public void destroy(){
    System.out.println("Destroy method called.");
   }

   public void actionPerformed(ActionEvent event){
     try{
        Class.forName (_driver);
        c = DriverManager.getConnection(_url);
      }catch (java.lang.ClassNotFoundException e){
       System.out.println("Cannot find driver");
       System.out.println(e.getMessage());
      }catch (java.sql.SQLException e){
       System.out.println("Cannot get connection"); 
       System.out.println(e.getMessage());
      }

     Object source = event.getSource();
     if(source == button){
       if(_clickMeMode){
         JTextArea displayText = new JTextArea();
         try{
     //Write to database
          String theText = textField.getText();
          Statement stmt = c.createStatement();
          String updateString = "INSERT INTO dba VALUES ('" + theText + "')";
          int count = stmt.executeUpdate(updateString);
    //Read from database
          ResultSet results = stmt.executeQuery("SELECT TEXT FROM dba "); 
          while(results.next()){
            String s = results.getString("TEXT");
            displayText.append(s + "\n");
          }
          stmt.close();
         }catch(java.sql.SQLException e){
         System.out.println("Cannot create SQL statement");
         System.out.println(e.getMessage());
         }

//Display text read from database
        text.setText("Text retrieved from file:");
        button.setText("Click Again");
        _clickMeMode = false;
//Display text read from database
      } else {
        text.setText("Text to save to file:");
        textField.setText("");
        button.setText("Click Me");
        _clickMeMode = true;
      }
    }
  }
}





运行此applet的html文件DbaAppl.html
<HTML>;
<BODY>;

<APPLET CODE=DbaAppl.class
  WIDTH=200
  HEIGHT=100>;
</APPLET>;

</BODY>;
</HTML>;



首先,DbaAppl.java中_url串指定的是与Web Server在同一台主机上(server1)的Oracle,编译后把DbaAppl.class和DbaAppl.html
一起放在Web Server的同一目录下,在客户机的浏览器里访问DbaAppl.html,查看Java控制台,得到如下信息

Cannot find driver
oracle.jdbc.driver.OracleDriver
java.lang.NullPointerException


这一出错信息的意思是,DriverManager 已在 applet HTML和类文件所在的目录以及当前JRE使用的本地CLASSPATH中没有找到 JDBC 驱动程序。
解决办法,将JDBC 驱动程序oracle-jdbc-driver.jar文件放在客户机当前使用的JRE的${JRE_HOME}/lib/ext目录下,或者用jar工具将oracle-jdbc-driver.jar解压,把解压后得到的oracle目录也放在Web Server上applet所在
的目录中。

更正后,重新访问DbaAppl.html,查看Java控制台,得到如下信息

java.security.AccessControlException: access denied(java.net.SocketPermission server1 resolve)


这个错误的通知你访问被拒绝。这就是说,由于 applet 程序试 图在没有获得正确的权限的情况下访问系统资源,括号中代码表示,若要纠正这种情况,您需要一个向数据库所在计算机(主机名为server1) 授予 applet 访问权限的 SocketPermission。

解决办法,利用 Policy 工具生成你所需要的策略文件,或者用一个 ASCII 编辑 器生成该策略文件。
下面的代码是名为 DbaApplPol 的、获得上述权限的策略文件的内容

引用
grant {
  permission java.net.SocketPermission "server1", "resolve";
};

创建了策略文件后,还要修改${JRE_HOME}/lib/security/java.security文件

policy.url.1=file:${java.home}/lib/security/java.policy
policy.url.2=file:${user.home}/.java.policy

下添加一行
policy.url.3=file:/path/to/DbaApplPol
再次访问DbaAppl.html,成功运行。

再将DbaAppl.java中_url串改为指定另一台主机(server2)上的Oracle,编译,上传,访问得到如下错误信息
java.security.AccessControlException: access denied(java.net.SocketPermission 10.6.1.16:1521 connect,resolve)
这回的意思是需要一个允许在数据库所在的server2上访问IP地址和端口的SocketPermission。在前面生成的策略文件中加入
permission java.net.SocketPermission "10.6.1.16:1521", "connect, resolve";
后,成功运行。

总结一下,通过applet访问数据库不是不可以的,但确实不太方便,某些特殊环境下可能值得使用。
[list=1]
  • 客户端要有JRE支持,可以在客户机访问applet所在页面是提示安装Java Plug-in,这样的页面可以通过HTMLConvert工具生成
  • JDBC驱动要么放在客户机JRE的CLASSPATH下,要么与applet放在一起,注意如果驱动是jar文件的话,要解开
  • 通过设置正确的策略文件,applet不仅可以访问与自己在同一台机器上的数据库,也可以访问其他远程数据库。不过,需要每个想要成功运行applet的客户机修改其本地JRE的java.security文件

  • 转:http://bbs.chinaunix.net/viewthread.php?tid=256602
    作者:wolfg
    分享到:
    评论

    相关推荐

      JDBC连接数据库代码大全

      3. 网络协议驱动:这种驱动用于三层架构,通常由Applet使用,通过网络连接到数据库。 4. 全Java驱动(也称为类型4驱动):这是最现代和最高效的驱动,完全用Java编写,直接与数据库通信,了解数据库的底层协议,...

      java JDBC连接数据库代码大全

      #### 三、使用JDBC访问数据库的基本步骤 1. **加载JDBC驱动**:使用`Class.forName("com.mysql.jdbc.Driver")`加载MySQL数据库的JDBC驱动。 2. **建立连接**:通过`DriverManager.getConnection(url, username, ...

      使用Java Applet访问数据库

      在本文中,我们将探讨如何使用Java Applet访问数据库,特别是使用Microsoft Access数据库。 首先,要实现Java Applet访问数据库,我们需要了解几个关键概念: 1. **数据库连接**:在Java中,`java.sql.Connection`...

      java_JDBC连接数据库代码大全

      #### 三、传统 JDBC 访问数据库步骤 使用 JDBC 连接数据库的一般步骤如下: 1. **注册 JDBC 驱动**:通过调用 `Class.forName(driverClass)` 加载相应的 JDBC 驱动。 2. **获取数据库连接**:通过 `DriverManager....

      jdbc的Java数据库编程

      尽管JDBC独立于ODBC(Open Database Connectivity),但在早期,JDBC-ODBC桥接器被用作一种常见的解决方案,允许Java应用程序通过ODBC驱动程序间接访问数据库。然而,随着原生JDBC驱动程序的发展,这种桥接方式逐渐...

      java-JDBC连接数据库代码大全.doc

      3. 网络协议驱动:支持三层架构,主要用于Applet访问数据库的情况,通过网络通信与数据库服务器交互。 4. 全Java驱动(类型4):也称为JDBC网络协议驱动,是纯Java实现,直接与数据库实例通信,了解数据库的底层...

      JDBC连接数据库

      #### 四、传统JDBC访问数据库步骤 1. **注册数据库驱动**:通过`Class.forName(String driverClass)`加载指定的JDBC驱动。 2. **获取数据库连接**:使用`DriverManager.getConnection(String url, String user, ...

      java数据库连接jdbc介绍

      JDBC使得Java应用程序能够通过标准接口与任何支持JDBC的数据库进行交互,无论是客户端应用、服务器端应用还是Applet,都可以方便地访问数据库。JDBC不仅适用于Intranet环境,还可以跨平台运行在Windows、Macintosh和...

      基于JDBC的WebGIS异构数据库存取技术

      1. **建立连接**:用户通过Web浏览器加载含有Java Applet的HTML页面,Applet中的代码调用JDBC API建立与数据库的连接。 2. **编译SQL语句**:Java程序通过JDBC API创建Statement或PreparedStatement对象,用于编译和...

      第10章 数据库访问的编程技术

      10.3 JDBC访问数据库的基本过程 1. 加载驱动:通过Class.forName()加载数据库驱动。 2. 建立连接:使用DriverManager.getConnection()方法连接数据库。 3. 创建Statement/PreparedStatement对象。 4. 执行SQL:调用...

      Java的JDBC数据库连接池实现方法.doc

      在 J2EE 程序中,应用服务器通常提供了数据库连接池的功能,但是对于一般的 Java 应用程序、Applet 或者 JSP、velocity 等,数据库连接池的选择并不多且性能不好。 Java 程序员通常会羡慕 Windows ADO 的数据库连接...

      轻松学习Java(多线程、swing、applet、网络程序设计、数据库)

      JDBC(Java Database Connectivity)是Java访问数据库的标准接口,适用于多种数据库系统。通过加载数据库驱动、建立连接、创建Statement或PreparedStatement对象,可以执行SQL语句,对数据进行增删改查。JDBC还支持...

      浅谈Java小程序数据库的访问方法.pdf

      第一种方法是直接使用Java小程序中的专用协议纯Java驱动器,通过两种结构(即客户端和服务器端)直接访问数据库。这种方案下,所有的客户功能都由Java实现,不需要额外的Java服务器程序作为中间层。 第二种方法则是...

      Java Database Programming with JDBC

      "中,作者Pratik Patel首先解释了什么是JDBC,这是一个Java程序员访问数据库的标准化方式。他介绍了JDBC的结构,包括驱动程序模型,以及JDBC如何通过ODBC(Open Database Connectivity)与传统的数据库系统兼容。这...

      jdbc0520.rar

      企业也可以用 JDBC 通过 Intranet 将所有职员连到一个或多个内部数据库中(即使这些职员所用的计算机有 Windows、 Macintosh 和UNIX 等各种不同的操作系统)。随着越来越多的程序员开始使用Java 编程语言,对从 Java ...

      通过JDBC连接oracle数据库的十大技巧

      这种驱动完全由Java编写,无需额外安装客户端库,非常适合在Web应用环境中使用。 - **Oracle提供的选项**:Oracle提供了OCI (Oracle Call Interface) 和 Thin 驱动两种选择。OCI驱动依赖于本地客户端库,而Thin驱动...

    Global site tag (gtag.js) - Google Analytics