如何从Java applet更新我的MySQL数据库?

时间:2009-09-21 17:28:30

标签: java mysql applet

我是Java的新手,我需要一些关于如何调试Java Applet的建议/信息。

我创建了一个只更新MySQL数据库的applet。 applet似乎加载到网页中没有错误。当我点击我的按钮更新数据库时,似乎实际上调用了applet,但没有任何反应,即没有对数据库进行新的插入,页面返回正常。

我已经使用了applet代码并在Java桌面应用程序中对其进行了测试。它工作正常,除了删除“扩展Applet”修饰符之外没有其他任何变化。在桌面应用程序中,数据库会正确更新。

如果给我一些关于如何写入Java控制台窗口的指针,这可能有助于我调试代码 - 但我不知道如何做到这一点。我不知道还有什么可以尝试找到这个问题。一切似乎都对我不对。

BTW:我在Windows 7中使用Netbeans 6.7,在CENTOS(Linux)系统上使用MySQL服务器和Glassfish 2.1。

以下是我的applet代码:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.me.db;
import java.applet.*;
import java.sql.*;

/**
 *
 * @author Rick
 */
public class dbapplet extends Applet {

    /**
     * Initialization method that will be called after the applet is loaded
     * into the browser.
     */
    public void init() {
        // TODO start asynchronous download of heavy resources
    }

    public long SaveToDatabase(String subject, String note, int priority,
            String category, String isOpen, String currentSession) {
        Connection con = null;
        Statement stmt = null;
        StringBuilder sb = new StringBuilder();
        long lastInsertId = -1;

        try {
            //build the insert
        int IsOpen = (isOpen.contains("1")) ? 1 : 2;
            sb.append("INSERT INTO 'LogDetails' ('category', 'priority', 
                 'subject', 'note', 'is_open', 'has_attachements') VALUES");
            sb.append(" (");
            sb.append("'" + category + "',");
            sb.append(priority + ",");
            sb.append("'" + subject + "',");
            sb.append("'" + note + "',");
            sb.append("b'" + IsOpen + "',");
            sb.append("b'0');");

            //connect and execute the insert
            String dbURL = "jdbc:mysql://localhost/authentication";
            Class.forName("com.mysql.jdbc.Driver");
            con = DriverManager.getConnection(dbURL, "xxxxxxx", "yyyyyyyy");
            stmt = con.createStatement();
            stmt.execute(sb.toString());

            //get the last inserted id
            ResultSet rs = null;
            rs = stmt.executeQuery("SELECT LAST_INSERT_ID()");

            if (rs.next()) {
                lastInsertId = rs.getLong(1);
            }
            rs.close();

        } catch (Exception e) { //database problem
             System.out.println("Error " + e.getMessage());
             System.out.println(sb.toString());
        }
        return lastInsertId;
    } //end of SaveToDatabase

     public void QuickSaveToDataBase() {
        //disgard the result for now - lets see if we can get this working
        this.SaveToDatabase("Quick Save", "Testing of the Quick Save Function",
               1, "Testing", "1", "skjdkjd-junk");
    }
}

4 个答案:

答案 0 :(得分:3)

如果可能的话,应该避免在Applet中使用JDBC。以下是您将面临的安全问题,

  1. 您必须将数据库打开到所有IP地址,除非这是一个内部或企业应用程序。
  2. 您的数据库密码将位于小程序中,任何进行少量逆向工程的人都可以读取。
  3. 如果您真的想要这样做,则需要通过签名来使用受信任的Applet。

答案 1 :(得分:0)

由于您已将localhost作为服务器的地址...,除非您在同一个盒子上运行mysql服务器,否则会导致问题。此外,我认为存在安全限制,不允许通过Java Applet通过端口联系localhost。

希望这有帮助。

答案 2 :(得分:0)

小程序在沙箱中运行(在浏览器中时)会严重限制他们可以执行的操作。一般情况下,他们无法打开与任何主机之间的连接,而不是他们所提供的主机。

此网站:http://www.securingjava.com/chapter-two/chapter-two-2.html有点过时,但您可以很好地了解您将面临哪些限制。

答案 3 :(得分:0)

失败的最可能原因是类加载器异常。 applet的类加载器是一个URLClassloader,由于安全隐患,它只能从某些URL加载类。

在这种情况下,applet类加载器很可能无法加载MySQL JDBC驱动程序。如果必须使applet工作,请将MySQL驱动程序的jar文件放在applet可访问的Web服务器上的某个区域中,并使用archive attribute of the applet tag启用类加载器来加载驱动程序。

为什么不这样做?

虽然上面给出的答案在技术上是有效的,但在互联网或DMZ(非军事区)上公开您的数据库是一种非常糟糕的做法。在某些公司中通常也包括内联网。据推测,您这样做是为了研究applet,而不是用于生产用途。 ZZ Coder has already pointed this out