Upload
ezidiu
View
152
Download
0
Embed Size (px)
Citation preview
Expression Language 3.0
Trilha - JavaEE
Everton Emilio TavaresDeveloper
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...
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>
Novidades
• Construtores de Collections;• Novos operadores (+=, = e ;)• Expressões Lambda;• Operações em Collections;• Standalone API;
Collections
• List:• [“Renault”, “Ford”, “Ford”, “Fiat”]
• Set:• {“Renault”, “Ford”, ‘Fiat’}
• Map:• {“marca” : “Ford”, “modelo” : “Fiesta”}
Novos Operadores
• Concatenação ( +=)• “Olá “ += pessoa.nome
• Atribuição (=)• nome_completo = pessoa.nome += “ “ += pessoa.sobrenome;
• Fim de expressão (;)• nome = pessoa.nome; “Olá “+= nome
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
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()
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"
Bean Converterhttps://github.com/ezidio/bean-converter
Spring Social - Tweeter• Total de 22
propriedades;
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;
//...}
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());
}
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);
Type Converter
ELProcessor processor = new ELProcessor();processor.getELManager().addELResolver(new URLConverter());
...
@PropertyMapping("origin.user.url")private URL userURL;
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; }}
Importar Classes
ELProcessor processor = new ELProcessor();processor.getELManager().importClass("com.google.common.base.MoreObjects");
...
@PropertyMapping("MoreObjects.firstNonNull(origin.retweetedStatus, 'UNDEFINED')")
private String retweetedStatus;
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;
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;
BeanNameResolver
@ConvertFrom(TwitterProfile.class)public class MyUserProfile {
@PropertyMapping("origin.name") private String name;
@PropertyMapping("twitterService.getLastTweets(origin.screenName)") private List<Tweet> lastTweets;
//...}
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); }}
BeanNameResolver
@AutowiredSpringBeanNameResolver springBeanNameResolver;
// ...
ELProcessor processor = new ELProcessor();processor.getELManager().addBeanNameResolver(springBeanNameResolver);