[RESOLVIDO] Applet não carrega

Bom dia pessoal!

Estou começando a mexer com applets e estou encontrando algumas dificuldades meio bobas, mas que não consigo resolver. Eu ja dei uma olhada aqui no forum e em outros sites tb mas não estou conseguindo carregar a minha applet.

Eu tenho uma aplicação Swing que monta um Jtable com um modelo que eu mesmo fiz. Então, resolvi colocar ele pra rodar em uma applet. Na minha página html estou chamando assim:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
aaaaa3
<applet code="Main.class" width="520" height="380">
</applet>
</body>
</html>

Aonde o Main.class é a minha classe que contém o metode main do pacote. Porém, eu to tomando erro na pagina html. Está dizendo que a minha classe Main não existe. Veja o erro que dá na applet:

carregar: classe Main.class não encontrada.
java.lang.ClassNotFoundException: Main.class
	at sun.plugin2.applet.Applet2ClassLoader.findClass(Unknown Source)
	at sun.plugin2.applet.Plugin2ClassLoader.loadClass0(Unknown Source)
	at sun.plugin2.applet.Plugin2ClassLoader.loadClass(Unknown Source)
	at sun.plugin2.applet.Plugin2ClassLoader.loadClass(Unknown Source)
	at java.lang.ClassLoader.loadClass(Unknown Source)
	at sun.plugin2.applet.Plugin2ClassLoader.loadCode(Unknown Source)
	at sun.plugin2.applet.Plugin2Manager.createApplet(Unknown Source)
	at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)
Caused by: java.io.IOException: open HTTP connection failed:http://localhost:8080/dev/web/Main/class.class
	at sun.plugin2.applet.Applet2ClassLoader.getBytes(Unknown Source)
	at sun.plugin2.applet.Applet2ClassLoader.access$000(Unknown Source)
	at sun.plugin2.applet.Applet2ClassLoader$1.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	... 9 more
Exceção: java.lang.ClassNotFoundException: Main.class

Eu já tentei exportar meu projeto para um jar e colocar ele dentor da tag ARCHIVE, mas tb nao funcionou. Talvez eu esteja colocando algum arqivo no lugar errado ou coisa do tipo. Minha árvore de diretorios está assim:

Tomcat -> webapps -> dev
-> web -> aqui é aonde fica a minha página html e também o diretorio WEB-INF, cujo dentro deste está o diretorio CLASSES
-> src -> pacote -> arquivos.java

Obrigado pela atenção

Ah, consegui fazer sumir o erro. Era um erro na declaração da tag Applet. Em nenhum tutorial que eu vi na internet dizia para eu colocar o nome do pacote junto com o nome da classe, mas sem o .CLASS ¬¬

ficou assim:

<applet code="pacote.Main" width="520" height="380" archive="Giro7.jar, CacheDB.jar">

Bom, o erro sumiu, mas agora não aparece nada na applet. Fica em branco tudo! O que poderia ser?

Obrigado pela atenção

Use seu amigo o “Java Console”. Provavelmente ele vai mostrar, quando habilitado no browser, o que pode estar ocorrendo (por exemplo, os stack traces normalmente aparecem lá.)

Ativar Java Console no Firefox:

Ativar Java Console no Internet Explorer:

Clique no System Tray sobre o ícone do Java com o botão direito.

Obrigado pelas respsotas.

Então, no java console não da nenhum erro. E a tela do html continua em branco.

Me surgiu uma duvida agora. A minha aplicação Swing roda normal qndo eu executo ela no eclipse como JAVa APPLICATION. Agora, qndo eu executo ela como JAVA APPLET, o appletviewr abre em branco, igual no html.

Eu nao fiz nenhuma alteração no meu código. Eu soh extendi a classe applet na minha classe principal Main.class.

E o meu java é o 6

Sei.
Há algumas opções no Java Console que permitem dar mais diagnósticos. Leia a tela inicial que aparece no Java Console, e vá experimentando com as opções até achar uma que faça sentido para você).
Acerte essas opções, recarregue a applet de novo (veja no Control Panel, Java, como fazer para limpar o cache de applets - ele não é o mesmo cache do browser, e isso já deu problema para muita gente.), e veja que mensagens ele dá no Control Panel.

Consegui algum avanço. O problema era que eu estava executando a minha classe swing de metodo Main. Acabei de ler aqu iagor que qndo vamos executar uma aplicação Swing em um APplet, não se executa a classe do metodo Main, e sim a classe do construtor direto.

Bom, no appletView funcionou porém no browser me trouxe uma porrada de erros.

java.sql.SQLException: [Cache JDBC] Communication link failure: access denied (java.net.SocketPermission 10.1.1.12:1972 connect,resolve)
	at com.intersys.jdbc.CacheConnection.connect(CacheConnection.java:1063)
	at com.intersys.jdbc.CacheConnection.<init>(CacheConnection.java:370)
	at com.intersys.jdbc.CacheDriver.connect(CacheDriver.java:211)
	at java.sql.DriverManager.getConnection(Unknown Source)
	at java.sql.DriverManager.getConnection(Unknown Source)
	at pacote.ClasseDAO.listarClientes(ClasseDAO.java:31)
	at pacote.JanelaPrincipal.instanciaComponentes(JanelaPrincipal.java:50)
	at pacote.JanelaPrincipal.<init>(JanelaPrincipal.java:42)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
	at java.lang.reflect.Constructor.newInstance(Unknown Source)
	at java.lang.Class.newInstance0(Unknown Source)
	at java.lang.Class.newInstance(Unknown Source)
	at sun.plugin2.applet.Plugin2Manager$12.run(Unknown Source)
	at java.awt.event.InvocationEvent.dispatch(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)
java.lang.reflect.InvocationTargetException
	at com.sun.deploy.util.DeployAWTUtil.invokeAndWait(Unknown Source)
	at sun.plugin2.applet.Plugin2Manager.runOnEDT(Unknown Source)
	at sun.plugin2.applet.Plugin2Manager.createApplet(Unknown Source)
	at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.ClassCastException: pacote.JanelaPrincipal cannot be cast to java.applet.Applet
	at sun.plugin2.applet.Plugin2Manager$12.run(Unknown Source)
	at java.awt.event.InvocationEvent.dispatch(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)
Exceção: java.lang.reflect.InvocationTargetException

Com excessão do primeiro erro, que pelo que eu vi é permissão de acesso ao banco de dados, os outros eu não faço idéia do motivo :shock:

O problema de permissão é que applets não podem acessar o banco a menos que sejam assinadas digitalmente.

O outro erro, é óbvio, é porque a classe pacote.JanelaPrincipal não estende javax.swing.JApplet (que estende java.awt.Applet).

Ué, então eu preciso estender o JApplet ao invés do Applet?

E como eu faço para minha applet ser assinada digitalmente? Eu vou precisar usar banco de dados. Essa applet vai ser tipo uma planilha excel.

Obrigado

[quote=MarujoRafao]Ué, então eu preciso estender o JApplet ao invés do Applet?

E como eu faço para minha applet ser assinada digitalmente? Eu vou precisar usar banco de dados. Essa applet vai ser tipo uma planilha excel.

Obrigado[/quote]

a) Se você usa Swing, tem de usar o javax.swing.JApplet. Se usar apenas AWT (o que eu duvido que você esteja fazendo) então pode usar o java.awt.Applet.

b) Procure aqui no GUJ como fazer a assinatura digital de applets. É um processo um pouco chatinho.

No meu caso aqui, minha applet é um conjunto de 4 classes, aonde ´possuo uma que faz a conexão com o banco e talz, outra para montar a tabela, outra para atriuir suas propriedades e outra para montar a tela. Como eu teria que fazer nesse caso? eu crio uma assinatura para cada classe? Ou só para a classe que faz a conexão com o banco de dados?

No prompt do windows eu fiz:

keytool -genkey -alias teste  

E preenchi os campos la que ele vai pedindo.

Aí agora eu teria que fazer isso neh?

jarsigner MinhasClasses teste 

O que eu coloco nesse ‘MinhasClasses’? Eu faço um jar das minhas classes e coloco em algum lugar ou o que?

vlw!

Jarsigner, como o próprio nome diz, assina arquivos jar. Para facilitar, crie um único arquivo JAR com todas as classes que são usadas pelo seu applet. Então assine só esse JAR. Eu digo para fazer isso, porque se seu applet precisar de 4 JARs assinados, o browser vai pedir a verificação da assinatura de cada applet individualmente (argh).

E depois disso ja era? Tenho uma assinatura digital criada?

Não sei, é por isso que eu pedi para você ler os tutoriais com cuidado. Para ver se o arquivo foi assinado digitalmente, você pode olhar dentro do arquivo .jar (ele é um arquivo .zip, como você deve saber) e ver se há algum arquivo com extensão .DSA ou .RSA dentro do subdiretório META-INF. Mais ou menos como no exemplo abaixo:

Archive:  miglayout-3.7.1.jar
  Length     Date   Time    Name
 --------    ----   ----    ----
    10089  06/07/10 15:33   META-INF/MANIFEST.MF
    10152  06/07/10 15:33   META-INF/SIGNAPPL.SF
     1047  06/07/10 15:33   META-INF/SIGNAPPL.DSA
        0  12/08/09 18:09   META-INF/
        0  12/08/09 18:09   net/
        0  12/08/09 18:09   net/miginfocom/
        0  12/08/09 18:09   net/miginfocom/demo/
        0  12/08/09 18:09   net/miginfocom/examples/
        0  12/08/09 18:09   net/miginfocom/layout/
        0  12/08/09 18:09   net/miginfocom/swing/
        0  12/08/09 18:09   net/miginfocom/swt/
      586  12/08/09 18:09   net/miginfocom/demo/CallbackDemo$1.class
      877  12/08/09 18:09   net/miginfocom/demo/CallbackDemo$2.class
...

obrigado pelo apoio bezier curve. Funcionou aqui, depois de muito sufoco.

Executei a assinatura e depois tive que gerar um documento de permissões na ferramenta policytool fornecida pelo proprio jdk e funcionou. Eu tive que criar uma assinatura para minhas classes e uma só para o jar do driver do meu banco de dados (cache no caso).

Pra quem tiver o mesmo problema, segue o tutorial que segui:


http://docs.google.com/viewer?a=v&q=cache:sZKtH7-cw_cJ:markmail.org/download.xqy%3Fid%3Dijm6e3xgyfy3p5e4%26number%3D1+tag+applet+%2B+assinatura+digital&hl=pt-BR&gl=br&pid=bl&srcid=ADGEESh9-Xaj6wJkO4IBvj1u-Qfb7jwyEMYn9FIPxDt5w27WcDCbzmrdYL7lHvFxTrxFqbMwUogLpRv3dmy8s2EnCKUC9UzkQwB_O9mb_3gtcKBp7PThnnnxX76G7cJx12Vp_OiD57qo&sig=AHIEtbRQSHoX6XLa-1bOBFrvrHC3D00nHQ

Obrigado pela ajuda