quinta-feira, maio 15, 2003

E aê javaneses! Voltamos! Recebi essa dúvida via email:

olá,

vi no seu blogue que alguem estava com dificuldade para permissao de leitura.

o meu problema eh o contrario:
eu nao tenho permissao de escrita:

import java.net.*;
import java.awt.print.*;
import java.util.*;
import java.io.*;

class ImprimirURL {
public static void main(String[] args) {
try {
URL urlRef = new URL("http://localhost/adm/teste.php");
BufferedReader is = new BufferedReader(new
InputStreamReader(urlRef.openStream()));
String inputLine;
FileOutputStream os = new FileOutputStream("LPT1:");
PrintStream ps = new PrintStream(os);
while ((inputLine = is.readLine()) != null)
{ //System.out.println(inputLine);
ps.println(inputLine);
}
ps.close();
is.close();
} catch (MalformedURLException me) {
System.out.println("MalformedURLException: " + me);
} catch (IOException ioe) {
System.out.println("IOException: " + ioe);
}
}
}

O que eu quero é umapplet que pegue o resultado da consulta atravéz da url
direcione tudo para LPT1:

Vou explicar o porque.
Meu sistema é feito em php e o ruindows só imprime em modo gráfico.
Para imprimir Notas Ficais é um método inviável, pela demora.
Para relatório de contabilidade com 80 a 200 páginas é pior ainda.
É por iso que eu quero imprimir diretamente na LPT1:

Quem tiver alguma dica, por favor nos envie porque eu tb tenho esse maldito problema de impressão em java...

terça-feira, fevereiro 25, 2003


Bate papo no Restaurante no Fim do Universo
Esse JavaMan... inventa cada nome, mas devemos admitir que é muito criativo! Hoje, às 18:30h neste link: Restaurante no Fim do Universo irá ocorrer um bate papo com o Daniel, do DFJUG. O assunto será
O Mercado Java no Brasil, eles terão muita coisa para discutir sem dúvida...
Mudando de assunto, estão me perguntando porque eu não tenho atualizado mais este blogger, a verdade é que estou atolado de coisas aqui na CTIS, tenho que estudar para a Web Components, amadurecer meus conhecimentos em EJB e ainda tem o J2ME! É por isso que estou procurando membros para este blogger, quem quiser participar e postar mensagens aqui é só me mandar um email!
OBS: É possível entrar no Restaurante através do Appletviewer através do comando: appletviewer http://www.javaman.com.br/restaurante/appv.jsp?login=guest, em que guest é o seu nome de usuário. Muito fácil, é só abrir uma tela do DOS, colar o comando e dar enter! Esse JavaMan... realmente tem as manhas...

quarta-feira, fevereiro 19, 2003


Questões do dia
Bom dia irmãos da grande linguagem Java! Hoje postei mais essas questões da prova de web components retiradas do primeiro capítulo do CD da Sybex:


1. Which HTTP method is used to store a resource on the server?
A. GET
B. POST
C. PUT
D. STORE
E. HEAD

2. Given the following code, which request method will get invoked?
‹HTML›
‹BODY›
‹FORM ACTION=‘/servlet/test’›
‹p›Enter the file you would like to Post:‹/P›
‹INPUT TYPE=‘text’ size=‘40’ name=‘fileName’›
‹INPUT TYPE=‘submit’ value=‘Done’› ‹/p›
‹/FORM›
‹/BODY›
‹/HTML›

A. PUT
B. POST
C. GET
D. HEAD

3. Which of the following query strings is invalid? (Choose all that
apply.)

A. name=Michael&address=1234 Sunset Blvd. #301&state=CA
B. name=Michael&address=1234+Sunset Blvd.+#301&state=CA
C. name=Michael&address=1234+Sunset+Blvd%45+
%23301&state=CA
D. name= Michael&address=1234+Sunset+Blvd.+
%23301&state=CA

Comentário
São três questões básicas sobre o protocolo Http, o primeiro capítulo do CD da Sybex.
Questão 1: Essa é bem fácil, como bem sabemos o método Http para armazenar algum recurso no servidor é o PUT, letra c é a correta.
Questão 2: Como é o padrão, todos os formulários HTML utilizam get para envio dos dados caso não seja especificado um método, letra c é a correta.
Questão 3: Essa questão é sobre query string, os parametros enviados por get. Na opção a existem espaços no valor address, portanto é inválido. b ìden e em d o espaço está depois da igualdade do valor name. R:a, b, d.

segunda-feira, fevereiro 17, 2003

Questões do dia
Separei mais duas questões da prova de Web Components hoje.

1. Which of the following is an example of a correctly formed condtional statement
in jsp?



a) ‹%
Enumeration names = request.getParameterNames();
while(names.hasMoreElements())
{
‹tr›
‹td›
out.print(request.getParameter((String)names.nextElement());
‹/td›
‹/tr›
} %›

b) ‹%@ jsp:if condtion="‹%= session.isNew() %›"›
‹h2›Hello‹/h2›
‹/jso:if›

c) ‹%
Enumeration names = request.getParameterNames();%›
‹% jsp:while(names.hasMoreElements())
{ %›

‹tr›
‹td›
‹%= request.getParameter((String)names.nextElement()) %›
‹/td›
‹/tr›
‹% } %›


d) ‹% if(session.isNew())
out.print("Hello");
%›



2. A client types the URI :
http://www.someserver.com/servlet/SomeServlet?name=fred
The value of name can be obtained by:


a) doGet(HttpServletRequest request, HttpServletResponse response)
{
String name = request.getParameter("name");
...

b) doGet(HttpServletRequest request, HttpServletResponse response)
{
String name = request.getInitParameter("name");
...

c) doGet(HttpServletRequest request, HttpServletResponse response)
{
String name = response.getParameter("name");
...

d) service(HttpServletRequest request, HttpServletResponse response)
{
String name = request.getParameter("name");
...


Comentário:
A questão 1 é bem interessante e pode enganar os distraídos... A opção a é aparentemente correta, até que você vê código Html dentro do scriptlet! Certamente isso daria um erro de compilação na página. A opção b é absurda pois não existe uma declaração ‹%@ jsp:if condtion="‹%= session.isNew() %›"›. A opção c não procede pois assim como a b não existe algo como ‹% jsp:while(names.hasMoreElements())
{ %›. Por exclusão, a questão d é correta, afinal existe mesmo na interface HttpSession o método isNew() o qual retorna um valor boolean, logo pode ser utilizado na expressão da opção d.

A questão 2 é sobre assinatura dos métodos em um servlet. Como o servlet será acessado diretamente via URL, a forma recomendada e correta para se recuperar um valor é através do método doGet, o qual tem a seguinte assinatura: doGet(HttpServletRequest request, HttpServletResponse response)
, como sabemos para recuperar valores do request, utilizamos o método getParameter(String name), portanto a opção a é correta, e embora o método service não seja adequado para recuperar valores, pode-se considerar a opção d como correta.

sexta-feira, fevereiro 14, 2003

Dúvida de internauta
Recebi esta mensagem hoje:

Olá Jose Carlos,

Parabéns pela conquista da sua certificação!

Estou estudando para fazer a prova. Não conhecia os pdf's da Sybex.
Como não estou com tempo AGORA para vê-los pq ainda não terminei
de estudar pelo livro, gostaria de saber como eles foram úteis para vc
e se em outro site eu encontro pdf's, e-books, etc.

Minha principal preocupação é que estou estudando pelo livro JAVA 2
certification study guide do java 1.3 e ele não tem assertion, fala pouco
sobre collections, etc. Por isso, estou buscando material complementar.
Se vc o tiver, me diga onde posso conseguir e outras dicas mais que vc
deve ter sobre a prova e seu programa.

Agradeço desde já,

Cordialmente,
Givanildo Santana do Nascimento


Caro Givanildo, obrigado por nos escrever! Não se preocupe com a falta dos
asserts, estudei pelo mesmo material, afinal os pdf´s são a mesma coisa
do livro! Faça os simulados, e quanto ao collections framework... é só
isso que cai mesmo!
Boa Sorte!
Dúvidas de Internautas respondidas
Recebi esta dúvida de um amigo nosso por email:

Oi José Carlos meu nome é Robson e sou iniciante em java.
Estou tentando criar um applet que leia um arquivo texto contendo 13 linhas
e retorna uma delas para o browser , ele roda correto no JBuilder e no
appletviewer mas não consigo rodar no Internet Explorer que dá um erro de
(java.io.FilePermission teste.txt read).
Obrigado pela ajuda

A saída no Console é:

java.security.AccessControlException: access denied (java.io.FilePermission
teste.txt read)
at
java.security.AccessControlContext.checkPermission(AccessControlContext.java
:270)
at
java.security.AccessController.checkPermission(AccessController.java:401)
at
java.lang.SecurityManager.checkPermission(SecurityManager.java:542)
at
java.lang.SecurityManager.checkRead(SecurityManager.java:887)
at
java.io.RandomAccessFile.(RandomAccessFile.java:194)
at
MinutodeSabedoria.init(MinutodeSabedoria.java:18)
at
sun.applet.AppletPanel.run(AppletPanel.java:347)
at
java.lang.Thread.run(Thread.java:536)


O código é esse:

import java.awt.*;
import javax.swing.*;
import java.util.*;
import java.io.*;

public class MinutodeSabedoria extends JApplet {
public void init(){
JTextArea outputArea = new JTextArea();
Container c = getContentPane();
c.add( outputArea );


File name = new File("teste.txt");
Vector v = new Vector ();
try {
RandomAccessFile r = new RandomAccessFile( name, "r" );
StringBuffer buf = new StringBuffer();
String text;

while( ( text = r.readLine()) != null )
v.addElement(text + "\n" );
}
catch( IOException e2 ){
JOptionPane.showMessageDialog( this,
"FILE ERROR",
"FILE ERROR", JOptionPane.ERROR_MESSAGE );
}
Random rd = new Random();
outputArea.setText(v.elementAt(Math.abs(rd.nextInt())%13).toString());
}
}


Meu caro Robson, a verdade é que o Applet está tentando ler um arquivo diretamente da máquina cliente!
E isso não é permitido por razões de segurança.
Neste link você
tem um exemplo correto que abre uma URL para realizar essa leitura, o que é o correto.

Questões comentadas da prova de WebComponents
Como o prometido, separei duas questões sobre a certificação de WebComponents.
Foram retiradas do JavaRanch e me pareceram fáceis de acertar, porém, pertinentes
e com grandes chances de ocorrerem similares na prova real:

1. A binary output stream is created in a servlet with which method call?

a) request.getOutputStream();
b) request.getWriter();
c) response.getWriter();
d) response.getOutputStream();


2. Question Bank ID : 42 Choose the 1 correct answer
What is the output of the following code?


‹%
for(int i=0; i‹3; ++i){
%›
out.print(i);
‹%
}
%›

a) 1 2 3
b) Does not compile
c) 2 3 4
d) out.print(i);out.print(i);out.print(i);

Comentários:
A primeira questão trata apenas do conhecimento das interfaces HttpServletRequest
e HttpServletResponse, desta forma, ao ter estudado estas interfaces você saberia
que na interface HttpServletResponse existe um método getOutputStream().
Já a segunda questão... bem essa se você estiver cansado e ela cair no final,
então você poderá errar. Como se pode ver, a expressão que deveria
imprimir na tela o valor de i está fora do scriptlet, desta forma, é lido como HTML normal.
R: 1. d, 2. d.

quinta-feira, fevereiro 13, 2003

Simulado do JavaRanch para a prova de WebComponents
Para quem vai fazer a prova de WebComponents aí vai um link para o simulado
do JavaRanch. O simulado é bem básico, mas acho que está bom para quem
está começando a estudar para a prova. Inclusive, o endereço da JC é em homenagem
ao JavaRanch (http://mocks.blogspot.com).


Simulado da WebComponents by JavaRanch
Questões do dia:
Em breve estarei colocando algumas questões da prova de WebComponents,
afinal, eu também almejo esta certificação!
Mas por enquanto, estou colocando estas da prova de Java Programmer:

1. Consider the following line of code:
	int[] x = new int[25];

After execution, which statement or statements are true?

A) x[24] is 0.
B) x[24] is undefined.
C) x[25] is 0.
D) x[0] is null.
E) x.length is 25.



1. Resposta: A, E
É importante saber que ao construir este array automáticamente ele
é preenchido com 0 em todas as suas posições.




2. Consider the following application:

1. class Q6 {
2. public static void main(String args[]) {
3. Holder h = new Holder();
4. h.held = 100;
5. h.bump(h);
6. System.out.println(h.held);
7. }
8. }
9.
10. class Holder {
11. public int held;
12. public void bump(Holder theHolder) {
13. theHolder.held++;
14. }
15. }

What value is printed out at line 6?

A) 0
B) 1
C) 100
D) 101



2. Resposta: D
Vejamos linha a linha:
Na linha 3 constrói-se uma instância h da classe Holder.
Na linha 4 a variável held tem o valor setado para 100.
Na linha 5 ocorre o mais importante:
O método bump é invocado em h passando uma cópia dela
mesma para o método. O método bump incrementa a variável
held em 1, como foi passada uma referência de h, essa alteração
ocorre no objeto h declarado na linha 3.

quarta-feira, fevereiro 12, 2003

Questão do dia
A seguinte questão foi tirada do site The Java Skinny e merece ser analisada:

Given the following code:

import java.util.Date;


public class Example {
public static void main(String args[]) {
Date d1 = new Date (99, 11, 31);
Date d2 = new Date (99, 11, 31);
method(d1, d2);
System.out.println("d1 is " + d1
+ "\nd2 is " + d2);
}

public static void method(Date d1, Date d2) {
d2.setYear (100);
d1 = d2;
}
}

Which one or more of the following correctly describe the
behavior when this program is compiled and run?

a) compilation is successful and the output is:

d1 is Fri December 31 00:00:00 GMT 1999

d2 is Fri December 31 00:00:00 GMT 1999


b) compilation is successful and the output is:

d1 is Fri December 31 00:00:00 GMT 1999

d2 is Sun December 31 00:00:00 GMT 2000


c) compilation is successful and the output is:

	d1 is Sun December 31 00:00:00 GMT 2000

d2 is Sun December 31 00:00:00 GMT 2000


d) the assignment 'd1 = d2' is rejected by the
compiler because the Date class cannot overload the operator
'='.

e) the expression (d1 is " + d1 + "\nd2 is " + d2)
is rejected by the compiler because the Date class cannot
overload the operator '+'.

O mais importante na classe Example ocorre no método. O método main apenas inicializa
e cria instâncias de java.util.Date() e imprime os resultados.


  1. d2 tem o ano setado para 100 (na verdade 2000). Em seguida a data é armazenada em d2.


  2. Objeto d1 aponta para o mesmo valor de d2. Esta é uma mudança somente na referência, não no que está armazenado em d1.



A classe compila e executa com sucesso, sem erros de
compilação ou execução assim d) é falso. e) é falso porque Java executa
toString() para qualquer objeto utilizado em um contexto de
String. toString() é definido em java.lang.Object logo é herdado
em todas as classes Java. Algumas classes sobrescrevem toString()
para retornar mais informações sobre si mesmas.

A questão se torna, em saber como uma alteração em objeto através de
chamada de método afeta o objeto no método chamador. Isso parece óbvio,
em Java isto pode ser feito, a chamada d2.setYear(100); deve alterar o
conteúdo em d2 e a alteração deve ser visível para o método chamador.
Assim o valor de d2 é alterado. Mas o que acontece quando a referência
ao objeto é alterada em d1 = d2? No método, d1 passa a apontar
para d2. Assim, o valor do ano para d1 é 2000. A atribuição de d1 é local
ao method, quando o método retorna, o valor de d1 é perdido e o
objeto d1 anterior permanece o mesmo.


A resposta é b). a) é falsa porque sabemos
que o conteúdo em d2 foi alterado. c) é falso porque sabemos
que d1 não foi alterado. Os nomes d1 e d2 foram utilizados em main
e method para que fosse mais confuso. Eles são diferentes e são armazenados da pilha em
lugares diferentes. Os objetos declarados são locais a seus métodos.

Enterprise JavaBeans ao alcance de todos!

Se existe algo tão bonito e maravilhoso como os EJB´s porque ainda existem tantos desenvolvedores bons
que tem medo ou não querem aprender? Realmente essa é uma boa questão que merece ser esclarecida.
Recentemente, o DFJUG abriu o curso de introdução ao EJB, sem dúvida uma iniciativa muito importante.
Recomendo o curso e pretendo fazer para que eu possa melhorar meus conhecimentos em EJB.
Para quem quiser saber mais e aprender este interessante componente do J2EE recomendo o livro Tutorial do J2EE,
o qual li e pude em 3 ou 4 dias aprender o básico sobre Entity e Session Beans. Fiquei impressionado com a qualidade,
didática e com os exemplos do livro.
Recomendo também o site The ServerSide.com,
o qual é meu favorito. Embora pareça muito complexo à primeira vista, é um dos principais sites sobre J2EE do mundo,
com muitos fóruns de discussão, livros para download dentre outras coisas.
Basta se cadastrar e você poderá baixar o maravilhoso Mastering EJB totalmente de graça!
Se você está cansado daquelas JSP´s e Servlets e quer algo mais no currículo, não deixe de acessar pois vale a pena.
Link recomendado no TheServerSide.com: procure a discussão sobre Java Data Objects vs. Entity Beans ,
isso ainda vai dar o que falar!

Dica do dia
Galera encontrei neste site alguns simulados sobre desenvolvimento Java, EJB´s e JSP em forma de certificação. Me pareceram muito bons porque não consegui completar nenhum com sucesso, o que é algo bom, pois a prova de certificação não é fácil não... De qualquer forma acho que vale a pena entrar e fazer uns testes!