SCJP – Guia de Estudos

Fevereiro 20, 2007 at 8:16 pm | In Java | 1 Comment

A certificação de programador é sem dúvida a mais famosa e mais almejada pelos programadores java. Um dos grandes problemas durante os estudos para a prova é saber quais items devem receber mais atenção. Neste post segue um guia de estudo que vai te ajudar a passar na prova.

Livro:SCJP Sun Certified Programmer for Java 5 Study Guide (Exam 310-055) (Certification Press Study Guides)

Prefira a versão em inglês. Caso seu inglês não seja lá essas coisas, tem a versão em português (recheada de erros, rs).

Dedique pelo menos 30 minutos do seu dia para os estudos. Eu sempre estudava à noite antes de dormir.

Leia com calma todos os capítulos do livro.

Tenha certeza que entendeu tudo sobre herança, polimorfismo, sobrescrita e sobrecarga de métodos. O exame é cruel nessa parte.

Faça tudo que você imaginar com IO. Preste atenção nas exceções que cada método pode lançar.

Date, Calendar e Locale não é muito cobrado. Tem uma grande chance de cair alguma questão do tipo drag-drop sobre estes itens.

Lembre-se que Strings são imutáveis. Saiba utilizar todos os métodos da classe String (substring, replace, etc…).

Conheça profundamente as collections, principalmente as diferenças de cada implementação, comparalable, comparator, busca binária (binarySearch). Sem dúvida cai muitas questões do tipo drag-drop sobre collections.

Thread com certeza é o que nos deixa mais apreensivo. Saiba usar wait, notify, notifyAll (preste atenção nos bloqueios). Não achei muito difícil e também não foi muito cobrado ( + ou – 5 questões).

Depois de ler todos os capítulos do livro pelo menos 02 vezes, faça todos os exercícios do livro. Na prova você encontrará perguntas neste nível.

Simulados são essenciais. O que eu mais indico é este (impressionante como cai perguntas idênticas na prova, rs). Durante os simulados é legal ir marcando os itens que você está encontrando mais dificuldade para uma posterior revisada.

No dia da prova chegue pelo menos meia hora antes. Sente… relaxe… compre uma garrafinha de água…. procure se descontrair.

O tempo dá e sobra. Portanto responda as peguntas com calma.

Depois é só pegar o resultado e tomar uma cerveja pra comemorar….

Alguém acrescenta alguma dica???

${EL.parte2}

Fevereiro 10, 2007 at 12:55 pm | In JEE | 2 Comments

Continuando o post sobre a Expression Language, devemos prestar atenção em outro detalhe importante: objetos implícitos.

Os objetos implícitos da EL, assim como os da JSP, facilitam o acesso às propriedades ou métodos de objetos que podem estar em diferentes escopos da aplicação.

  • param e paramValues: Map com os parâmetros da requisição.
  • header e headerValues: Map com os cabeçalhos da requisição.
  • cookie: Map com os cookies da requisição.
  • initParam: Map com os parâmetros init do contexto.
  • pageScope, requestScope, sessionScope, applicationScope: Map com os atributos dos escopos.

Exemplos de uso dos objetos implícitos:

${param.nome}

${paramValues.cidades[1]}

${header.host} ou ${header["host"]} – vimos a diferença na primeira parte do tutorial

${requestScope.pessoa.nome} – recupera o nome do objeto pessoa que está na requisição

E se você quiser obter o método utilizado na requisição HTTP (GET, POST, etc…). Precisamos invocar o método getMethod() do objeto request . Então podemos utilizar o objeto implícito requestScope para recuperar o método.

${requestScope.method}

Ops… Porque não funcionou? Lembre-se que requestScope é um map com os atributos da requisição. É apenas um Map com os atributos… Você não tem acesso às propriedades da requisição.

Eis que surge o objeto implícito pageContext. Este é o único objeto implícito que não é um Map. Através do pageContext podemos recuperar o objeto request:

${pageContext.request.method}

Outro ponto importante é a ordem em que o container procura por atributos nos diferentes escopos. Caso você não informe um escopo, a ordem será pageScope, requestScope, sessionScope e applicationScope.

ex:

em um servlet:

request.setAttribute(“nome”, “marcelo”);

session.setAttribute(“nome”, “maria”);

na jsp:

${requestScope.nome} – Marcelo //o atributo da requisição

${sessionScope.nome} -Maria // o atributo da sessão

${nome} – Marcelo // o atributo da requisição?

Se você não informar o escopo, o container primeiro procura pelo atributo “nome” no pageScope, se não encontrar nada, ele busca no requestScope. No exemplo, ele encontrou a propriedade no requestScope, então ele para a busca pelo atributo e imprime o atributo da requisição. Portanto, em alguns casos pode ser muito útil informar o escopo do atributo.

Comentem….

${EL.parte1}

Fevereiro 7, 2007 at 10:05 am | In JEE | 8 Comments

A Expression Language ou simplesmente EL foi adicionada na especificação 2.0 da JSP, e sem dúvida facilitou muito a vida de todos nós. O código na JSP ficou mais simples e ainda nos livramos dos malditos scriplets.

Em uma série de posts, abordarei alguns tópicos que considero importante sobre as EL`s.

Operador ponto (.) :

Este operador possui algumas restrições de uso. A primeira variável de EL deve ser um Map, um atributo ou um objeto implícito. A segunda variável deve ser uma propriedade do bean ou uma chave do Map e deve obedecer o padrão de nomenclatura de variáveis do java (não iniciar com número, etc…). Ex:

${pessoa.nome} – ${map.chave} – ${requestScope.pessoa.nome}

${pessoa.1} // não funciona pois não obedece o padrão de nomenclatura

E se a chave de seu Map for um número ( ${meuMap.2} ) ou ainda o pacote de uma classe, por exemplo “br.com.servlet” (${meuMap.br.com.servlet}). Viu que problemão? Já vimos que o operador . espera do seu lado direito uma propriedade ou chave de um Map que obedeça a regra de nomenclatura de variáveis.

Eis que surge o operador [ ]:

Este operador é mais poderoso e flexível. A variável à esquerda também pode ser um List ou um array de qualquer tipo. A variável à esquerda pode ser um número ou qualquer ainda qualquer valor que não respeite as regras de nomenclatura do java. Veja exemplos do operador [ ]:

${pessoa["nome"]} = ${pessoa.nome}

${map["chave"]} = ${map.chave}

${map["br.com.servlet"]} // agora funciona

${minhaLista["1"]} // agora funciona, porém…

Quando se utiliza [] e variável do lado esquerdo (“minhaLista”) for um array ou lista, tudo que se coloca dentro do [ ] é convertido para um inteiro, ou seja, isso não funciona:

${minhaLista["posicaoDois"]}

O compilador da jsp não conseguirá converter “posicaoDois” para um inteiro e lançará uma bonita exceção. Já isto funciona:

${minhaLista[1]} // sem aspas ” “.

como já explicado, minhaLista é um List, portanto java irá converter o que estiver dentro dos [ ] para um inteiro. Você só está ajudando um pouco o compilador passando um inteiro e não uma string.

Se variável do lado esquerdo for um Map, existe outra reqra para uso do operador []. Veja a diferença.

${meuMap["chave"]}

${meuMap[chave]}

Percebeu? a segunda EL o valor dentro dos colchetes não está dentro de ” “. Neste caso o container buscará nos escopos um atributo com este nome. Por exemplo, imagine esta jsp:

<% request.setAttribute(“chave”, “minhaChave”)%>

${meuMap[chave]}

Percebeu a diferença? Esta EL será traduzida para ${meuMap["minhaChave"]}.

—————————–

A EL é bastante poderosa e conhecê-la profundamente é importantíssimo para os desenvolvedores JEE. Deixe seu comentário.

Submetendo 02 forms… Parte 2

Fevereiro 5, 2007 at 10:01 pm | In Java, JavaScript | 1 Comment

Na primeira parte do post vimos como criar a queryString com os dados dos dois formulários. Agora iremos submeter esta query para o servidor através de uma requisição POST com AJAX.

Vamos adicionar agora o código AJAX que irá submeter o formulário.

—————-

function submeterForm(){
var query = recuperarQuery();

var xmlHttp = getXMLRequest();
xmlHttp.open(‘POST’, ‘ServletForm’, true);
xmlHttp.setRequestHeader(“Content-type”, “application/x-www-form-urlencoded”);
xmlHttp.setRequestHeader(“Content-length”, query.length);

xmlHttp.onreadystatechange = function(){
//função para tratar a resposta do servidor
}

xmlHttp.send(query);
}

function recuperarQuery(){
var query = ”;
query += ‘input1=’ + document.form1.input1.value;
query += ‘&input2=’ + document.form2.input2.value;
return query;
}

————————–

A função recuperarQuery() não sofreu alterações. A grande mudança está na função submeterForm().

Primeiro recuperamos a queryString com os dados que queremos submeter. Em seguida recuperamos um objeto XmlHttpRequest, responsável por fazer a requisição assíncrona (AJAX). Definimos que o tipo de requisição será POST o que torna necessário alterarmos dois cabeçalhos da requisição, o Content-type e o Content-length. O primeiro informa que o conteúdo da requisição são dados de um formulário e o segundo o tamanho do conteúdo. Informamos também a url ServletForm, que é um servlet configurado no servidor.

A propriedade onreadystatechange armazena a função que “atenderá” aos eventos da requisição ajax. Neste exemplo simplesmente não implementamos nenhuma lógica de retorno porque não é nosso intuito.

Por fim, enviamos os dados para o servidor chamando ’send(parametros)’.

Simples não???

No servidor é só recuperar os dados da requisição e executar sua lógica de negócio.

—————–

public class ServletForm extends HttpServlet {

@Override
protected void doPost(HttpServletRequest pReq, HttpServletResponse pRes) throws ServletException, IOException {

String parametroForm1 = pReq.getParameter(“input1″);
String parametroForm2 = pReq.getParameter(“input2″);

getServletContext().log(“Parâmetro do form 1: ” + parametroForm1);
getServletContext().log(“Parâmetro do form 2: ” + parametroForm2);

// mais lógica
}
}

——————-

O código acima é simples, recupera os dois parâmetros e imprime no log do servidor.

Bem pessoal… espero que tenham gostado do primeiro tutorial. Seu comentário será muito bem vindo e sugestões de melhoras mais ainda. Gostaria também de ouvir opiniões para próximos artigos e tutoriais.

Abraços…

Marcelo Madeira

Trabalhando com sessões web.

Fevereiro 4, 2007 at 9:09 pm | In JEE | Leave a Comment

O protocolo http usa conexões stateless. O browser abre uma conexão com o servidor, faz a solicitação, o servidor envia a resposta e fecha a conexão. Portanto a conexão existe para uma única solicitação/resposta.

A idéia da sessão web é manter o estado do usuário entre várias conexões. Na primeira conexão, o servidor gera um único session ID para o cliente e a devolve juntamente com a resposta. Nas próximas conexões, o cliente envia junto com a solicitação o seu session ID o que permite ao servidor identificá-lo. Por padrão a troca de session ID é feita utilizando cookie.

Aí que começa o problema, o cliente (browser) pode estar configurado para não aceitar cookie. Portanto a troca do session ID através de cookies não é garantido e pode não funcionar em 100% dos browsers. Para estes casos, a solução é a reescrita de URL. O session ID é enviado no final de cada URL da aplicação.

Ex: http://www.uol.com.br/index.do;jsessionid=123123123231

A classe HttpServletResponse possui um método que acrescenta o session ID automaticamente em uma URL:

@Override

protected void doGet(HttpServletRequest pReq, HttpServletResponse pRes) throws ServletException, IOException {

PrintWriter out = pRes.getWriter();

out.print(“<a href=\”" + pRes.encodeURL(“URL”) + “>Link</a>”);

out.flush();

}

O método encodeURL adiciona no final da URL o session ID caso o cliente não aceite cookie. Se o cliente aceitar cookie, nada muda na URL.

Mas eu não escrevo HTML dentro de um servlet? Como fazer isso em uma JSP?

Simples, a taglib “core” possui a tag “url” que também acrescenta o session ID automaticamente em uma URL.

<a href=”<c:url value=”URL”/>”>asdad</a>

Resumindo:

  • Se você escreve html dentro do servlet, sempre utilize encodeURL para todas as urls.
  • Se você é mais esperto e utiliza jsp para montar o html, utilize a tag “<c:url/>”.

Estas duas técnicas garantirá que o session ID seja trocado em 100% dos browsers, lembrando que o session ID será adicionado na URL somente se o browser não aceitar cookie.

Próxima Página »

Blog no WordPress.com. | Theme: Pool by Borja Fernandez.
Entries and comments feeds.