Download - Expression Language 3.0
![Page 1: Expression Language 3.0](https://reader031.vdocuments.com.br/reader031/viewer/2022021812/589ff86d1a28ab46598b5d5b/html5/thumbnails/1.jpg)
Expression Language 3.0
Trilha - JavaEE
![Page 2: Expression Language 3.0](https://reader031.vdocuments.com.br/reader031/viewer/2022021812/589ff86d1a28ab46598b5d5b/html5/thumbnails/2.jpg)
Everton Emilio TavaresDeveloper
![Page 3: Expression Language 3.0](https://reader031.vdocuments.com.br/reader031/viewer/2022021812/589ff86d1a28ab46598b5d5b/html5/thumbnails/3.jpg)
Expression Language 3.0
• Permite processar expressões em tempo de execução;• Histórico
• Primeiramente incluído no JSTL 1;• Movido para o JSP 2;• JSF 1.0 criou uma variante para atender suas necessidades;• Unificado com o JSF 1.2 no JSP 2.1;• Especificação independente – JSR 341;
• Usado no JSF, JSP, CDI, Bean Validation, entre outros...
![Page 4: Expression Language 3.0](https://reader031.vdocuments.com.br/reader031/viewer/2022021812/589ff86d1a28ab46598b5d5b/html5/thumbnails/4.jpg)
Implementações
<dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-el</artifactId> <version>8.0.32</version></dependency>
...
<dependency> <groupId>org.jboss.spec.javax.el</groupId> <artifactId>jboss-el-api_3.0_spec</artifactId> <version>1.0.6.Final</version></dependency>
...
<dependency> <groupId>org.glassfish</groupId> <artifactId>javax.el</artifactId> <version>3.0.0</version></dependency>
![Page 5: Expression Language 3.0](https://reader031.vdocuments.com.br/reader031/viewer/2022021812/589ff86d1a28ab46598b5d5b/html5/thumbnails/5.jpg)
Novidades
• Construtores de Collections;• Novos operadores (+=, = e ;)• Expressões Lambda;• Operações em Collections;• Standalone API;
![Page 6: Expression Language 3.0](https://reader031.vdocuments.com.br/reader031/viewer/2022021812/589ff86d1a28ab46598b5d5b/html5/thumbnails/6.jpg)
Collections
• List:• [“Renault”, “Ford”, “Ford”, “Fiat”]
• Set:• {“Renault”, “Ford”, ‘Fiat’}
• Map:• {“marca” : “Ford”, “modelo” : “Fiesta”}
![Page 7: Expression Language 3.0](https://reader031.vdocuments.com.br/reader031/viewer/2022021812/589ff86d1a28ab46598b5d5b/html5/thumbnails/7.jpg)
Novos Operadores
• Concatenação ( +=)• “Olá “ += pessoa.nome
• Atribuição (=)• nome_completo = pessoa.nome += “ “ += pessoa.sobrenome;
• Fim de expressão (;)• nome = pessoa.nome; “Olá “+= nome
![Page 8: Expression Language 3.0](https://reader031.vdocuments.com.br/reader031/viewer/2022021812/589ff86d1a28ab46598b5d5b/html5/thumbnails/8.jpg)
Lambda
• Pode ser usadas diretamente…• ((x, y) -> x + y)(2, 4) // 6
• Ou atribuir a variáveis• soma = (x,y) -> x + y; soma(5,10); // 15• fact = n -> n == 0 ? 1 : n*fact(n-1); fact(5) // 120
![Page 9: Expression Language 3.0](https://reader031.vdocuments.com.br/reader031/viewer/2022021812/589ff86d1a28ab46598b5d5b/html5/thumbnails/9.jpg)
Streams
• Mesma sintaxe do Java 8• nomes = pessoas.stream() .map(p -> p.name)
.sorted() .toList()
• maiores_de_idade = pessoas.stream().filter(p -> p.age > 18)
.toArray()• pais = criancas.stream()
.map(c -> c.pai) .distinct() .toList()
![Page 10: Expression Language 3.0](https://reader031.vdocuments.com.br/reader031/viewer/2022021812/589ff86d1a28ab46598b5d5b/html5/thumbnails/10.jpg)
Standalone API
Object result;ELProcessor processor = new ELProcessor();processor.setValue("nome", "Everton");result = processor.eval("'Olá ' += nome"); // "Olá Everton"result = processor.eval("1"); // 1result = processor.getValue("1", String.class); // "1"
![Page 11: Expression Language 3.0](https://reader031.vdocuments.com.br/reader031/viewer/2022021812/589ff86d1a28ab46598b5d5b/html5/thumbnails/11.jpg)
Bean Converterhttps://github.com/ezidio/bean-converter
![Page 12: Expression Language 3.0](https://reader031.vdocuments.com.br/reader031/viewer/2022021812/589ff86d1a28ab46598b5d5b/html5/thumbnails/12.jpg)
Spring Social - Tweeter• Total de 22
propriedades;
![Page 13: Expression Language 3.0](https://reader031.vdocuments.com.br/reader031/viewer/2022021812/589ff86d1a28ab46598b5d5b/html5/thumbnails/13.jpg)
Mapeamento
@ConvertFrom(Tweet.class)public class SimpleTweet {
@PropertyMapping("origin.id") private String code;
@PropertyMapping("origin.user.name += ' (@' += origin.user.screenName += ')'") private String user;
@PropertyMapping("origin.text") private String text;
@PropertyMapping("origin.entities.urls.stream().findFirst().orElse(null).url") private String url;
@PropertyMapping("origin.entities.hashTags.stream().map(h -> h.text).toList()") private List<String> tags;
//...}
![Page 14: Expression Language 3.0](https://reader031.vdocuments.com.br/reader031/viewer/2022021812/589ff86d1a28ab46598b5d5b/html5/thumbnails/14.jpg)
Bean Converter
@Testpublic void should_convert_tweet() throws Exception {
Tweet tweet = TestUtils.loadObject("/tweet.json", Tweet.class);
SimpleTweet result = new BeanConverter().convert(tweet, SimpleTweet.class);
assertEquals(tweet.getText(), result.getText()); assertEquals(Lists.newArrayList("Ruby", "TheDevConf"), result.getTags()); assertEquals("https://t.co/L2PKu17aD6", result.getUrl()); assertEquals("TDC2016 (@TheDevConf)", result.getUser());
}
![Page 15: Expression Language 3.0](https://reader031.vdocuments.com.br/reader031/viewer/2022021812/589ff86d1a28ab46598b5d5b/html5/thumbnails/15.jpg)
Configurando o ELProcessor
SearchResults searchResult = twitter.searchOperations().search("#TheDevConf");
ELProcessor proc = new ELProcessor();
// Configuração do ELProcessor
List<SimpleTweet> result = new BeanConverter(proc).convertList( searchResult.getTweets(), SimpleTweet.class);
![Page 16: Expression Language 3.0](https://reader031.vdocuments.com.br/reader031/viewer/2022021812/589ff86d1a28ab46598b5d5b/html5/thumbnails/16.jpg)
Type Converter
ELProcessor processor = new ELProcessor();processor.getELManager().addELResolver(new URLConverter());
...
@PropertyMapping("origin.user.url")private URL userURL;
![Page 17: Expression Language 3.0](https://reader031.vdocuments.com.br/reader031/viewer/2022021812/589ff86d1a28ab46598b5d5b/html5/thumbnails/17.jpg)
Type Converter
public class URLConverter extends TypeConverter {
@Override public Object convertToType(ELContext elContext, Object o, Class<?> aClass) {
try { if (URL.class.equals(aClass) && String.class.isInstance(o)) { elContext.setPropertyResolved(true); return new URL(String.class.cast(o)); } } catch (MalformedURLException e) { throw new IllegalArgumentException("URL inválida: “+o, e); } return null; }}
![Page 18: Expression Language 3.0](https://reader031.vdocuments.com.br/reader031/viewer/2022021812/589ff86d1a28ab46598b5d5b/html5/thumbnails/18.jpg)
Importar Classes
ELProcessor processor = new ELProcessor();processor.getELManager().importClass("com.google.common.base.MoreObjects");
...
@PropertyMapping("MoreObjects.firstNonNull(origin.retweetedStatus, 'UNDEFINED')")
private String retweetedStatus;
![Page 19: Expression Language 3.0](https://reader031.vdocuments.com.br/reader031/viewer/2022021812/589ff86d1a28ab46598b5d5b/html5/thumbnails/19.jpg)
Importar Package
ELProcessor processor = new ELProcessor();processor.getELManager().importPackage("com.google.common.base");
...
@PropertyMapping("Ascii.truncate(origin.text, 50, '...')")private String text;
@PropertyMapping("MoreObjects.firstNonNull(origin.retweetedStatus, 'UNDEFINED')")private String retweetedStatus;
![Page 20: Expression Language 3.0](https://reader031.vdocuments.com.br/reader031/viewer/2022021812/589ff86d1a28ab46598b5d5b/html5/thumbnails/20.jpg)
Definição de funções
ELProcessor p= new ELProcessor();p.defineFunction(“guava", “trunc", Ascii.class.getName(), “truncate");p.defineFunction(“guava", “nvl", MoreObjects.class.getName(), “firstNonNull");
...
@PropertyMapping(“guava:trunc(origin.text, 50, '...')")private String text;
@PropertyMapping(“guava:nvl(origin.retweetedStatus, 'UNDEFINED')")private String retweetedStatus;
![Page 21: Expression Language 3.0](https://reader031.vdocuments.com.br/reader031/viewer/2022021812/589ff86d1a28ab46598b5d5b/html5/thumbnails/21.jpg)
BeanNameResolver
@ConvertFrom(TwitterProfile.class)public class MyUserProfile {
@PropertyMapping("origin.name") private String name;
@PropertyMapping("twitterService.getLastTweets(origin.screenName)") private List<Tweet> lastTweets;
//...}
![Page 22: Expression Language 3.0](https://reader031.vdocuments.com.br/reader031/viewer/2022021812/589ff86d1a28ab46598b5d5b/html5/thumbnails/22.jpg)
BeanNameResolver
@Componentpublic class SpringBeanNameResolver extends BeanNameResolver {
@Autowired private ApplicationContext applicationContext;
@Override public boolean isNameResolved(String beanName) { return applicationContext.getBean(beanName) != null; }
@Override public Object getBean(String beanName) { return applicationContext.getBean(beanName); }}
![Page 23: Expression Language 3.0](https://reader031.vdocuments.com.br/reader031/viewer/2022021812/589ff86d1a28ab46598b5d5b/html5/thumbnails/23.jpg)
BeanNameResolver
@AutowiredSpringBeanNameResolver springBeanNameResolver;
// ...
ELProcessor processor = new ELProcessor();processor.getELManager().addBeanNameResolver(springBeanNameResolver);