2013-08-05 5 views
2

Я пытаюсь создать Java-апплет, который подключается к базе данных на стороне клиента и выполняет какой-либо запрос.Доступ к локальной базе данных клиента с помощью Java Applet

Апплет должен использовать JDBC ... поэтому я реализовал очень простое соединение JDBC с файлом базы данных, расположенным на моем диске C: /.

После подписания приложения (без подписания приложения, многие оповещения безопасности и стены) Я застрял на этой ошибке: «LiveConnect вызова для Applet ID-не допускаются в этой виртуальной машине Java, например»

ли кто-нибудь знает более простой способ потоковой передачи и получения результатов от клиентской базы данных через веб-браузер? Или кто-нибудь знает, почему это происходит?

Мои коды: AppletStart.java (Client Side - Applet)

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 (Client Side - апплетов):

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

Если вы пытаетесь создать соединение jdbc с localhost из апплета: насколько можно установить соединение с 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-не разрешено в этой ошибке JVM экземпляра. – MBarni

+0

Вы попробовали это (первый ответ на запрос Google для этой ошибки): [1] (https://code.google.com/p/jzebra/issues/detail?id=126), [2] (https://bugzilla.mozilla.org/show_bug.cgi?id=146458)? – msangel

+0

Да, я это сделал. Я всегда стараюсь делать вещи в Google. – MBarni

Смежные вопросы