我是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");
}
}
答案 0 :(得分:3)
如果可能的话,应该避免在Applet中使用JDBC。以下是您将面临的安全问题,
如果您真的想要这样做,则需要通过签名来使用受信任的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