Chapter 8
PS. Este é um resumo para prova SCWCD
Como a idéia agora é nada de script nos JSP. Então vamos ao que interessa:
Um exemplo bem comum … temos um servlet que tem um bean que vai ser passado para o JSP como atributo do request e esse bean vai ser usado para carregar o JSP.
<html>
<body>
<jsp:useBean id="dog" class="minhasClasses.Dog" scope="request"/>
O nome do cachorro: <jsp:getProperty name="dog" property="nome"/>
</body>
</html>
O atributo id do standard action jsp:useBean
, é o nome do atributo que está no request. O atributo class declara o tipo da classe do bean.
No standard action jsp:getProperty
, o atributo name é o nome do atributo = id no jsp:useBean
. No property coloca-se o nome do atributo do bean.
O standard action jsp:useBean
procura no escopo informado o atributo, caso não encontre ele irá criar um atributo. Então utilizando jsp:setProperty pode ser setado no jsp os atributos do bean.
<jsp:useBean id="dog" class="minhasClasses.Dog" scope="request"/>
<jsp:setProperty name="dog" property="nome" value="pluto" />
OBSERVAÇÃO: no exemplo acima será setado o valor do property, caso tenha ou não encontrado o atributo. Para setar o atributo apenas quando for criado um novo segue abaixo:
<jsp:useBean id="dog" class="minhasClasses.Dog" scope="request">
<jsp:setProperty name="dog" property="nome" value="pluto" />
<jsp:useBean>
Utilizando polimorfismo
Com o jsp:useBean
pode também utilizar polimorfismo. Ex:
Package minhasClasses;
public abstract class Animal{
private String nome;
public void setNome(String nome){
this.nome = nome;
}
Public String getNome(){
return this.nome;
}
}
e
package minhasClasses;
public class Cachorro extends Animal{
private String raca;
public void setRaca(String raca){
this.raca = raca;
}
public String getRaca(){
return this.raca;
}
}
No jsp fica:
<jsp:useBean id="animal" type="minhasClasses.Animal" class="minhasClasses.Cachorro" scope="page">
No servlet gerado por este JSP:
minhasClasses.Animal animal = null;
// aqui pega o atributo
if(animal == null){
animal = new minhasClasses.Cachorro();
}
No atributo type pode ser tanto uma classe abstrata como uma interface. No atributo class deve ser sempre uma classe concreta que implemente ou extende da classe type, ou a exceção java.lang.InstatiationException
será lançada caso não encontre o atributo na sessão.
Também pode ser usado a tag sem o atributo class, mas isso só irá funcionar caso já exista o atributo no escopo.
LEMBRE-SE
Type = pode ser classes abstrata ou interface
Class = tem que ser classes concreta
O atributo scope é opcional, o default é page
.
Atenção ! Para as questões onde o atributo é setado no request e no JSP a tag jsp:useBean está sem o scopo. Por neste caso, o jsp estará tentando pegar o atributo no escopo page.
Setando atributos de um bean com parametros
<jsp:useBean id="cachorro" type="minhasClasses.Cachorro">
<jsp:setProperty name="cachorro" property="nome" param="nomeCachorro"/>
</jsp:useBean>
Nota: se o paramentro for passado com o mesmo nome do atributo do bean não é necessário passar o param no standard action jsp:setProperty
.
Nota: Para beans que tenham atributos tipos diferentes de String a conversão é automática, desde que seja um tipo primitivo. Agora, cuidado ! Os valores tem que ser valores válidos, por exemplo caso tenha um campo int, crie validação ou algo que garanta que o valor do parâmetro passado ao JSP seja um int.
Para setar vários atributos de um bean:
<jsp:useBean id="cachorro" type="minhasClasses.Cachorro">
<jsp:setProperty name="cachorro" property="*"/>
</jsp:useBean>
Agora vamos supor … a classe cachorro da seguinte maneira:
public class Cachorro{
private int id;
private String nome;
private Pessoa dono;
// gets e sets ...
}
E a classe pessoa
public class Pessoa{
private int id;
private String nome;
// gets e sets …
}
No JSP quero mostrar o nome do dono do cachorro.
Com EL
<html>
<body>
O dono do cachorro se chama : ${cachorro.dono.nome}
</body>
</html>
Em EL
${primeiraCoisa.segundaCoisa}
primeiraCoisa pode sempre ser objetos implícitos ou atributos
RELEMBRANDO !
Objetos implícitos:
pageScope
requestScope
sessionScope
applicationScope
param
paramValues
header
headerValues
cookie
initParam
Com o (.) pode ser acessar propridades de um bean e valores de um map, mas com [] pode acessar valores de todos estes e mais array ou list.
${cachorroList[0]} ou ${cachorroList["0"]}
Atenção: O objeto ímplicito requestScope é apenas um Map com os atributos do request, muiiiito cuidado para não confundi-lo com objeto request. Para acessar os
atributos do objeto request use, por exemplo:
${pageContext.request.method}
Escopo em implícitos objetos
Caso tenha um objeto, exemplo cachorro em um escopo e vc sabe que esse objeto só poderá está em um escopo
${cachorro.nome}
Dessa forma o atributo cachorro pode está em qualquer um dos atributos. Agora, caso queira pegar o atributo em escopo definido
${requestScope.cachorro.nome}
Com EL podemos pegar cookies
${cookie.userName.value}
Executando métodos java no JSP através de taglib
1 – Tenho uma classe que tem o método que vai ser executado. Esse método tem que ser publico e estático. Como vamos ver mais abaixo, essa classe vai ser configurada em um arquivo TLD e então, para essa classe ser encontrada ela deve está dentro da pasta ou subpastas de WEB-INF/classes, isso compilada, o arquivo .class.
Package minhasClasses;
public class MinhaClasse{
public static String metodoJSP(){
return ("Executou o método");
}
}
2 – O arquivo TLD Tag Library Descriptor
Esse arquivo provê o mapeamento entre a classe java e a função que será chamada no JSP. Ele tem que ser salvo na extensão .tld
e deve ficar sempre na pasta ou subpasta dentro de WEB-INF. Então vamos ao arquivo
<?xml version="1.0" encoding="ISO-8859-1" ?>
<taglib ...>
<tlib-version>1.2</tlib-version>
<uri>minhaFuncao</uri>
<function>
<name>funcao</name>
<function-class>minhasClasses.MinhaClasse</function-class>
<function-signature>
String metodoJSP()
</function-signature>
</function>
</taglib>
3 – Enfim, chamando no JSP
<%@ taglib prefix="minha" uri="minhaFuncao" %>
<html><body>
${minha:funcao()}
</body></html>
Atenção : O nome chamado do método no JSP é mapeado no arquivo .tld. Note que ele pode ser diferente do nome do método na classe java
Operadores com EL
Com EL pode ser usados os operadores
Aritméticos:
+, -, *, / ou div, % ou mod
Lógicos:
&& ou and, || ou or, ! ou not
Relacionais
== ou eq, != ou ne, < ou lt, > ou gt, <= le, >= ou ge
Lembre-se : Com / ou div pode haver divisão por zero o resultado vai ser infinito e NÃO UM ERRO. Com % ou mod não pode pegar o resto da divisão por zero senão VAI DAR UM ERRO.
EL is null-friendly
EL “se dá bem” com valores null.
Supondo o atributo x
nulo. Caso tenha no JSP ${x}
não vai imprimir nada e não aparece erro. Valores nulos tbm pode ser utulizado com os operadores.
Ex
${7 > x} //resultado TRUE
${x == x} // resultado TRUE
${true and x} // resultado FALSE
Exceção: apenas o operador % não é null-friendly.
${100 % x}//resultado lança uma exceção