2013-08-05 52 views
2

我想構建一個Java Applet,它連接到客戶端的數據庫並執行一些查詢。使用Java Applet訪問本地客戶端數據庫

該applet需要使用JDBC ...所以我實現了一個非常簡單的JDBC連接到位於我的C:/驅動器上的數據庫文件。

簽署應用後(不簽署應用程序,許多安全警報和牆)我被困在這個錯誤: 「LiveConnect的呼籲Applet的ID 1在此JVM實例不允許」

有誰知道一種簡單的流式傳輸方式,並通過Web瀏覽器從位於客戶端的數據庫中獲取結果? 還是有人知道這是爲什麼發生?

我的代碼: AppletStart.java(客戶端 - 小程序)

public class AppletStart extends Applet { 

    private static final long serialVersionUID = -2032951133100677643L; 

    public void queryDatabase(final String databaseFilePath, final String databaseQuery) { 

     AccessController.doPrivileged(new PrivilegedAction<Object>() { 
      public Object run() { 
       JDBCBean jdbcTest = new JDBCBean(); 
       jdbcTest.setDatabaseFilePath(databaseFilePath); 
       jdbcTest.setDatabaseQuery(databaseQuery); 

       try { 
        buildResult(jdbcTest.queryDatabase()); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
       return null; 
      } 
     }); 
    } 

    public void buildResult(ResultSet resultSet) throws SQLException { 
     ResultSetMetaData metaData = resultSet.getMetaData(); 
     int columns = metaData.getColumnCount(); 
     String text = ""; 

     while (resultSet.next()) { 
      for (int i = 1; i <= columns; ++i) { 
       text += "" + metaData.getColumnName(i) + ":\t"; 
       text += resultSet.getString(i); 
       text += "\n"; 
      } 
      text += "\n"; 
     } 

     alert(text); 
    } 

    public void alert(String text) { 
     try { 
      JSObject window = JSObject.getWindow(this); 
      window.call("showAlert", new Object[] { text }); 
     } catch (JSException jse) { 
      jse.printStackTrace(); 
     } 
    } 

} 

JDBCBean.java(客戶端 - 小程序):

public class JDBCBean { 

    private static String JDBC_DRIVER = "sun.jdbc.odbc.JdbcOdbcDriver"; 
    private static String CONN_STRING_FRAGMENT = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ="; 

    private Connection connection; 
    private Statement statement; 

    private String databaseFilePath; 
    private String databaseQuery; 

    public void setDatabaseFilePath(String databaseFilePath) { 
     this.databaseFilePath = databaseFilePath; 
    } 

    public void setDatabaseQuery(String databaseQuery) { 
     this.databaseQuery = databaseQuery; 
    } 

    public ResultSet queryDatabase() { 
     try { 

      Class.forName(JDBC_DRIVER).newInstance(); 
      String connectionString = CONN_STRING_FRAGMENT + databaseFilePath; 
      connection = DriverManager.getConnection(connectionString, "", ""); 

      buildStatement(); 
      return executeQuery(); 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     return null; 
    } 

    public void buildStatement() throws SQLException { 
     statement = connection.createStatement(); 
    } 

    public ResultSet executeQuery() throws SQLException { 

     boolean foundResults = statement.execute(databaseQuery); 

     if (foundResults) { 
      ResultSet set = statement.getResultSet(); 
      if (set != null) 
       return set; 
     } 

     connection.close(); 
     return null; 
    } 

} 

HTML(服務器端):

<body onload="queryDatabase()"> 
    <script> 

     var databaseFilePath = "C:/test_db.mde"; 
     var databaseQuery = "SELECT * FROM test_table"; 

     function showAlert(text) { 
      alert(text); 
     } 

     function queryDatabase() { 
      document.dbApplet.queryDatabase(databaseFilePath, databaseQuery); 
     } 

    </script> 
    <applet id="dbApplet" code="br.com.applet.AppletStart" archive="../resources/applet/dbapplet.jar" style="width: 1px; height: 1px; float: left;" mayscript="mayscript"></applet> 
</body> 

回答

0

如果您嘗試從applet創建到localhost的jdbc連接:只要連接到loc人數據庫一樣訪問遠程的小應用程序(由於安全限制的),你應該使用共同的規則:

http://www.oracle.com/technetwork/java/dba-140353.html#applet

至於數據庫的主機解決 - 如果它不會通過訪問「本地主機」或「127.0 .0.1',比你可能應該找到解決本地主機連接路徑的另一種方法。

如果您試圖訪問的文件進行讀取,比使用JDBC的工作,你shuld授予權這種操作太:

http://www.coderanch.com/how-to/java/HowCanAnAppletReadFilesOnTheLocalFileSystem

+0

我仍然得到「LiveConnect的呼籲Applet的ID 1不在此JVM實例中允許「錯誤。 – MBarni

+0

你試過這些(谷歌查詢此錯誤的第一反應):[1](https://code.google.com/p/jzebra/issues/detail?id=126),[2](https:/ /bugzilla.mozilla.org/show_bug.cgi?id=146458)? – msangel

+0

是的,我做過。我總是先嚐試谷歌的東西。 – MBarni

相關問題