Доступ к локальной клиентской базе данных с помощью Java-апплета

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

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

После подписания приложения (без подписи приложения, многих предупреждений безопасности и стен) я застрял в этой ошибке: «Вызов Liveconnect для идентификатора апплета 1 не разрешен в этом экземпляре JVM»

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

Мои коды: 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>

person BBacon    schedule 05.08.2013    source источник


Ответы (1)


Если вы пытаетесь создать соединение jdbc с локальным хостом из апплета: поскольку подключение к локальной базе данных такое же, как доступ к удаленному для апплетов (из-за ограничений безопасности), вы должны использовать общие правила:

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

Что касается разрешения хоста db - если он не будет получать доступ через «localhost» или «127.0.0.1», вам, вероятно, следует найти другой способ разрешить путь подключения к локальному хосту.

Если вы пытаетесь получить доступ к файлу для чтения, а не работать с jdbc, вы также должны предоставить права для этой операции:

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

person msangel    schedule 05.08.2013
comment
Я все еще получаю вызов Liveconnect для идентификатора апплета 1, который не разрешен в этой ошибке экземпляра JVM. - person BBacon; 05.08.2013
comment
Вы пробовали это (первый ответ на запрос Google об этой ошибке): 1, 2 ? - person msangel; 05.08.2013